[{"data":1,"prerenderedAt":8506},["ShallowReactive",2],{"navigation_docs":3,"-logging-audit":301,"-logging-audit-surround":8501},[4,30,75,119,207,271,287],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Logging","\u002Flogging","2.logging",[35,40,45,50,55,60,65,70],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F4.client-logging","i-lucide-monitor",{"title":61,"path":62,"stem":63,"icon":64},"AI SDK Integration","\u002Flogging\u002Fai-sdk","2.logging\u002F5.ai-sdk","i-simple-icons-vercel",{"title":66,"path":67,"stem":68,"icon":69},"Better Auth Integration","\u002Flogging\u002Fbetter-auth","2.logging\u002F6.better-auth","i-simple-icons-betterauth",{"title":71,"path":72,"stem":73,"icon":74},"Audit Logs","\u002Flogging\u002Faudit","2.logging\u002F7.audit","i-lucide-shield-check",{"title":76,"path":77,"stem":78,"children":79,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[80,85,90,95,100,104,109,114],{"title":81,"path":82,"stem":83,"icon":84},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":86,"path":87,"stem":88,"icon":89},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":91,"path":92,"stem":93,"icon":94},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":96,"path":97,"stem":98,"icon":99},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":101,"path":102,"stem":103,"icon":74},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":105,"path":106,"stem":107,"icon":108},"Performance","\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance","i-lucide-gauge",{"title":110,"path":111,"stem":112,"icon":113},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":115,"path":116,"stem":117,"icon":118},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":120,"path":121,"stem":122,"children":123,"page":29},"Frameworks","\u002Fframeworks","4.frameworks",[124,128,133,138,143,148,153,158,163,168,173,178,183,188,192,197,202],{"title":36,"path":125,"stem":126,"icon":127},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":129,"path":130,"stem":131,"icon":132},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":134,"path":135,"stem":136,"icon":137},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":139,"path":140,"stem":141,"icon":142},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":144,"path":145,"stem":146,"icon":147},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":149,"path":150,"stem":151,"icon":152},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":154,"path":155,"stem":156,"icon":157},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":159,"path":160,"stem":161,"icon":162},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":164,"path":165,"stem":166,"icon":167},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":169,"path":170,"stem":171,"icon":172},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":174,"path":175,"stem":176,"icon":177},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":179,"path":180,"stem":181,"icon":182},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":184,"path":185,"stem":186,"icon":187},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":189,"path":190,"stem":191,"icon":99},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":193,"path":194,"stem":195,"icon":196},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":198,"path":199,"stem":200,"icon":201},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F15.custom-integration","i-lucide-puzzle",{"title":203,"path":204,"stem":205,"icon":206},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":208,"path":209,"stem":210,"children":211,"page":29},"Adapters","\u002Fadapters","5.adapters",[212,216,221,226,231,236,241,246,251,256,261,266],{"title":36,"path":213,"stem":214,"icon":215},"\u002Fadapters\u002Foverview","5.adapters\u002F1.overview","i-custom-plug",{"title":217,"path":218,"stem":219,"icon":220},"Custom Adapters","\u002Fadapters\u002Fcustom","5.adapters\u002F10.custom","i-lucide-code",{"title":222,"path":223,"stem":224,"icon":225},"Pipeline","\u002Fadapters\u002Fpipeline","5.adapters\u002F11.pipeline","i-lucide-workflow",{"title":227,"path":228,"stem":229,"icon":230},"HTTP","\u002Fadapters\u002Fhttp","5.adapters\u002F12.http","i-lucide-globe",{"title":232,"path":233,"stem":234,"icon":235},"Axiom","\u002Fadapters\u002Faxiom","5.adapters\u002F2.axiom","i-custom-axiom",{"title":237,"path":238,"stem":239,"icon":240},"OTLP","\u002Fadapters\u002Fotlp","5.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":242,"path":243,"stem":244,"icon":245},"PostHog","\u002Fadapters\u002Fposthog","5.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":247,"path":248,"stem":249,"icon":250},"Sentry","\u002Fadapters\u002Fsentry","5.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":252,"path":253,"stem":254,"icon":255},"Better Stack","\u002Fadapters\u002Fbetter-stack","5.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":257,"path":258,"stem":259,"icon":260},"File System","\u002Fadapters\u002Ffs","5.adapters\u002F7.fs","i-lucide-hard-drive",{"title":262,"path":263,"stem":264,"icon":265},"Datadog","\u002Fadapters\u002Fdatadog","5.adapters\u002F8.datadog","i-simple-icons-datadog",{"title":267,"path":268,"stem":269,"icon":270},"HyperDX","\u002Fadapters\u002Fhyperdx","5.adapters\u002F9.hyperdx","i-custom-hyperdx",{"title":272,"path":273,"stem":274,"children":275,"page":29},"Enrichers","\u002Fenrichers","6.enrichers",[276,279,283],{"title":36,"path":277,"stem":278,"icon":28},"\u002Fenrichers\u002Foverview","6.enrichers\u002F1.overview",{"title":280,"path":281,"stem":282,"icon":201},"Built-in","\u002Fenrichers\u002Fbuilt-in","6.enrichers\u002F2.built-in",{"title":284,"path":285,"stem":286,"icon":220},"Custom","\u002Fenrichers\u002Fcustom","6.enrichers\u002F3.custom",{"title":288,"path":289,"stem":290,"children":291,"page":29},"NuxtHub","\u002Fnuxthub","7.nuxthub",[292,296],{"title":36,"path":293,"stem":294,"icon":295},"\u002Fnuxthub\u002Foverview","7.nuxthub\u002F1.overview","i-lucide-database",{"title":297,"path":298,"stem":299,"icon":300},"Retention","\u002Fnuxthub\u002Fretention","7.nuxthub\u002F2.retention","i-lucide-clock",{"id":302,"title":71,"body":303,"description":8488,"extension":8489,"links":8490,"meta":8497,"navigation":8498,"path":72,"seo":8499,"stem":73,"__hash__":8500},"docs\u002F2.logging\u002F7.audit.md",{"type":304,"value":305,"toc":8461},"minimark",[306,324,329,336,343,347,350,664,2563,2566,2605,2615,2619,2628,3045,3076,3098,3102,3109,3117,3133,3138,3148,3324,3330,3893,3899,4259,4279,4283,4293,4400,4404,4422,4435,4561,4568,4613,4619,4648,4665,4884,4888,4891,5054,5090,5096,5760,5766,5772,5789,6832,6835,6872,6876,6880,6883,6957,6971,6993,6997,7004,7109,7143,7147,7150,7162,7176,7178,7181,7208,7211,7215,7287,7291,7295,7463,7472,7476,7684,7687,7691,7970,7980,7984,7990,8270,8274,8451,8457],[307,308,309,310,314,315,319,320,323],"p",{},"evlog's audit layer is ",[311,312,313],"strong",{},"not a parallel system",". Audit events are wide events with a reserved ",[316,317,318],"code",{},"audit"," field. Every existing primitive — drains, enrichers, redact, tail-sampling — applies as is. Enable audit logs by adding ",[311,321,322],{},"1 enricher + 1 drain wrapper + 1 helper",".",[325,326,328],"h2",{"id":327},"why-audit-logs","Why Audit Logs?",[307,330,331,332,335],{},"Compliance frameworks (SOC2, HIPAA, GDPR, PCI) require knowing ",[311,333,334],{},"who did what, on which resource, when, from where, with which outcome",". evlog covers this without a second logging library.",[337,338,339,342],"tip",{},[311,340,341],{},"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.",[325,344,346],{"id":345},"quickstart","Quickstart",[307,348,349],{},"You already use evlog. Add audit logs in three changes:",[351,352,358],"pre",{"className":353,"code":354,"filename":355,"language":356,"meta":357,"style":357},"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","",[316,359,360,404,425,446,453,485,519,547,575,631,649,655],{"__ignoreMap":357},[361,362,365,369,373,377,380,383,385,388,391,394,397,401],"span",{"class":363,"line":364},"line",1,[361,366,368],{"class":367},"s7zQu","import",[361,370,372],{"class":371},"sMK4o"," {",[361,374,376],{"class":375},"sTEyZ"," auditEnricher",[361,378,379],{"class":371},",",[361,381,382],{"class":375}," auditOnly",[361,384,379],{"class":371},[361,386,387],{"class":375}," signed",[361,389,390],{"class":371}," }",[361,392,393],{"class":367}," from",[361,395,396],{"class":371}," '",[361,398,400],{"class":399},"sfazB","evlog",[361,402,403],{"class":371},"'\n",[361,405,407,409,411,414,416,418,420,423],{"class":363,"line":406},2,[361,408,368],{"class":367},[361,410,372],{"class":371},[361,412,413],{"class":375}," createAxiomDrain",[361,415,390],{"class":371},[361,417,393],{"class":367},[361,419,396],{"class":371},[361,421,422],{"class":399},"evlog\u002Faxiom",[361,424,403],{"class":371},[361,426,428,430,432,435,437,439,441,444],{"class":363,"line":427},3,[361,429,368],{"class":367},[361,431,372],{"class":371},[361,433,434],{"class":375}," createFsDrain",[361,436,390],{"class":371},[361,438,393],{"class":367},[361,440,396],{"class":371},[361,442,443],{"class":399},"evlog\u002Ffs",[361,445,403],{"class":371},[361,447,449],{"class":363,"line":448},4,[361,450,452],{"emptyLinePlaceholder":451},true,"\n",[361,454,456,459,462,466,469,471,475,478,482],{"class":363,"line":455},5,[361,457,458],{"class":367},"export",[361,460,461],{"class":367}," default",[361,463,465],{"class":464},"s2Zo4"," defineNitroPlugin",[361,467,468],{"class":375},"(",[361,470,468],{"class":371},[361,472,474],{"class":473},"sHdIc","nitro",[361,476,477],{"class":371},")",[361,479,481],{"class":480},"spNyl"," =>",[361,483,484],{"class":371}," {\n",[361,486,488,491,493,496,498,501,504,507,510,512,514,516],{"class":363,"line":487},6,[361,489,490],{"class":375},"  nitro",[361,492,323],{"class":371},[361,494,495],{"class":375},"hooks",[361,497,323],{"class":371},[361,499,500],{"class":464},"hook",[361,502,468],{"class":503},"swJcz",[361,505,506],{"class":371},"'",[361,508,509],{"class":399},"evlog:enrich",[361,511,506],{"class":371},[361,513,379],{"class":371},[361,515,376],{"class":464},[361,517,518],{"class":503},"())\n",[361,520,522,524,526,528,530,532,534,536,539,541,543,545],{"class":363,"line":521},7,[361,523,490],{"class":375},[361,525,323],{"class":371},[361,527,495],{"class":375},[361,529,323],{"class":371},[361,531,500],{"class":464},[361,533,468],{"class":503},[361,535,506],{"class":371},[361,537,538],{"class":399},"evlog:drain",[361,540,506],{"class":371},[361,542,379],{"class":371},[361,544,413],{"class":464},[361,546,518],{"class":503},[361,548,550,552,554,556,558,560,562,564,566,568,570,572],{"class":363,"line":549},8,[361,551,490],{"class":375},[361,553,323],{"class":371},[361,555,495],{"class":375},[361,557,323],{"class":371},[361,559,500],{"class":464},[361,561,468],{"class":503},[361,563,506],{"class":371},[361,565,538],{"class":399},[361,567,506],{"class":371},[361,569,379],{"class":371},[361,571,382],{"class":464},[361,573,574],{"class":503},"(\n",[361,576,578,581,583,586,588,591,594,597,599,602,604,606,608,610,612,615,617,619,622,624,626,628],{"class":363,"line":577},9,[361,579,580],{"class":464},"    signed",[361,582,468],{"class":503},[361,584,585],{"class":464},"createFsDrain",[361,587,468],{"class":503},[361,589,590],{"class":371},"{",[361,592,593],{"class":503}," dir",[361,595,596],{"class":371},":",[361,598,396],{"class":371},[361,600,601],{"class":399},".audit",[361,603,506],{"class":371},[361,605,390],{"class":371},[361,607,477],{"class":503},[361,609,379],{"class":371},[361,611,372],{"class":371},[361,613,614],{"class":503}," strategy",[361,616,596],{"class":371},[361,618,396],{"class":371},[361,620,621],{"class":399},"hash-chain",[361,623,506],{"class":371},[361,625,390],{"class":371},[361,627,477],{"class":503},[361,629,630],{"class":371},",\n",[361,632,634,637,640,642,646],{"class":363,"line":633},10,[361,635,636],{"class":371},"    {",[361,638,639],{"class":503}," await",[361,641,596],{"class":371},[361,643,645],{"class":644},"sfNiH"," true",[361,647,648],{"class":371}," },\n",[361,650,652],{"class":363,"line":651},11,[361,653,654],{"class":503},"  ))\n",[361,656,658,661],{"class":363,"line":657},12,[361,659,660],{"class":371},"}",[361,662,663],{"class":375},")\n",[665,666,667,961,1341,1654,1950,2108],"code-group",{},[351,668,671],{"className":353,"code":669,"filename":670,"language":356,"meta":357,"style":357},"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",[316,672,673,699,719,739,774,778,792,808,858,892,908,924,931,936,954],{"__ignoreMap":357},[361,674,675,677,679,682,684,687,690,693,695,697],{"class":363,"line":364},[361,676,458],{"class":367},[361,678,461],{"class":367},[361,680,681],{"class":464}," defineEventHandler",[361,683,468],{"class":375},[361,685,686],{"class":480},"async",[361,688,689],{"class":371}," (",[361,691,692],{"class":473},"event",[361,694,477],{"class":371},[361,696,481],{"class":480},[361,698,484],{"class":371},[361,700,701,704,707,710,713,715,717],{"class":363,"line":406},[361,702,703],{"class":480},"  const",[361,705,706],{"class":375}," log",[361,708,709],{"class":371}," =",[361,711,712],{"class":464}," useLogger",[361,714,468],{"class":503},[361,716,692],{"class":375},[361,718,663],{"class":503},[361,720,721,723,726,728,730,733,735,737],{"class":363,"line":427},[361,722,703],{"class":480},[361,724,725],{"class":375}," user",[361,727,709],{"class":371},[361,729,639],{"class":367},[361,731,732],{"class":464}," requireUser",[361,734,468],{"class":503},[361,736,692],{"class":375},[361,738,663],{"class":503},[361,740,741,743,746,748,750,753,755,758,760,762,764,766,769,771],{"class":363,"line":448},[361,742,703],{"class":480},[361,744,745],{"class":375}," invoice",[361,747,709],{"class":371},[361,749,639],{"class":367},[361,751,752],{"class":464}," refundInvoice",[361,754,468],{"class":503},[361,756,757],{"class":464},"getRouterParam",[361,759,468],{"class":503},[361,761,692],{"class":375},[361,763,379],{"class":371},[361,765,396],{"class":371},[361,767,768],{"class":399},"id",[361,770,506],{"class":371},[361,772,773],{"class":503},"))\n",[361,775,776],{"class":363,"line":455},[361,777,452],{"emptyLinePlaceholder":451},[361,779,780,783,785,787,789],{"class":363,"line":487},[361,781,782],{"class":375},"  log",[361,784,323],{"class":371},[361,786,318],{"class":464},[361,788,468],{"class":503},[361,790,791],{"class":371},"{\n",[361,793,794,797,799,801,804,806],{"class":363,"line":521},[361,795,796],{"class":503},"    action",[361,798,596],{"class":371},[361,800,396],{"class":371},[361,802,803],{"class":399},"invoice.refund",[361,805,506],{"class":371},[361,807,630],{"class":371},[361,809,810,813,815,817,820,822,824,827,829,831,834,836,838,840,842,844,847,849,851,853,856],{"class":363,"line":549},[361,811,812],{"class":503},"    actor",[361,814,596],{"class":371},[361,816,372],{"class":371},[361,818,819],{"class":503}," type",[361,821,596],{"class":371},[361,823,396],{"class":371},[361,825,826],{"class":399},"user",[361,828,506],{"class":371},[361,830,379],{"class":371},[361,832,833],{"class":503}," id",[361,835,596],{"class":371},[361,837,725],{"class":375},[361,839,323],{"class":371},[361,841,768],{"class":375},[361,843,379],{"class":371},[361,845,846],{"class":503}," email",[361,848,596],{"class":371},[361,850,725],{"class":375},[361,852,323],{"class":371},[361,854,855],{"class":375},"email",[361,857,648],{"class":371},[361,859,860,863,865,867,869,871,873,876,878,880,882,884,886,888,890],{"class":363,"line":577},[361,861,862],{"class":503},"    target",[361,864,596],{"class":371},[361,866,372],{"class":371},[361,868,819],{"class":503},[361,870,596],{"class":371},[361,872,396],{"class":371},[361,874,875],{"class":399},"invoice",[361,877,506],{"class":371},[361,879,379],{"class":371},[361,881,833],{"class":503},[361,883,596],{"class":371},[361,885,745],{"class":375},[361,887,323],{"class":371},[361,889,768],{"class":375},[361,891,648],{"class":371},[361,893,894,897,899,901,904,906],{"class":363,"line":633},[361,895,896],{"class":503},"    outcome",[361,898,596],{"class":371},[361,900,396],{"class":371},[361,902,903],{"class":399},"success",[361,905,506],{"class":371},[361,907,630],{"class":371},[361,909,910,913,915,917,920,922],{"class":363,"line":651},[361,911,912],{"class":503},"    reason",[361,914,596],{"class":371},[361,916,396],{"class":371},[361,918,919],{"class":399},"Customer requested refund",[361,921,506],{"class":371},[361,923,630],{"class":371},[361,925,926,929],{"class":363,"line":657},[361,927,928],{"class":371},"  }",[361,930,663],{"class":503},[361,932,934],{"class":363,"line":933},13,[361,935,452],{"emptyLinePlaceholder":451},[361,937,939,942,944,947,949,951],{"class":363,"line":938},14,[361,940,941],{"class":367},"  return",[361,943,372],{"class":371},[361,945,946],{"class":503}," ok",[361,948,596],{"class":371},[361,950,645],{"class":644},[361,952,953],{"class":371}," }\n",[361,955,957,959],{"class":363,"line":956},15,[361,958,660],{"class":371},[361,960,663],{"class":375},[351,962,964],{"className":353,"code":963,"filename":164,"language":356,"meta":357,"style":357},"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",[316,965,966,988,1008,1012,1041,1045,1080,1107,1125,1161,1165,1177,1191,1235,1267,1281,1296,1303,1308,1334],{"__ignoreMap":357},[361,967,968,970,972,974,977,979,981,983,986],{"class":363,"line":364},[361,969,368],{"class":367},[361,971,819],{"class":367},[361,973,372],{"class":371},[361,975,976],{"class":375}," EvlogVariables",[361,978,390],{"class":371},[361,980,393],{"class":367},[361,982,396],{"class":371},[361,984,985],{"class":399},"evlog\u002Fhono",[361,987,403],{"class":371},[361,989,990,992,994,997,999,1001,1003,1006],{"class":363,"line":406},[361,991,368],{"class":367},[361,993,372],{"class":371},[361,995,996],{"class":375}," Hono",[361,998,390],{"class":371},[361,1000,393],{"class":367},[361,1002,396],{"class":371},[361,1004,1005],{"class":399},"hono",[361,1007,403],{"class":371},[361,1009,1010],{"class":363,"line":427},[361,1011,452],{"emptyLinePlaceholder":451},[361,1013,1014,1017,1020,1023,1026,1028,1031,1035,1038],{"class":363,"line":448},[361,1015,1016],{"class":480},"const",[361,1018,1019],{"class":375}," app ",[361,1021,1022],{"class":371},"=",[361,1024,1025],{"class":371}," new",[361,1027,996],{"class":464},[361,1029,1030],{"class":371},"\u003C",[361,1032,1034],{"class":1033},"sBMFI","EvlogVariables",[361,1036,1037],{"class":371},">",[361,1039,1040],{"class":375},"()\n",[361,1042,1043],{"class":363,"line":455},[361,1044,452],{"emptyLinePlaceholder":451},[361,1046,1047,1050,1052,1055,1057,1059,1062,1064,1066,1069,1071,1074,1076,1078],{"class":363,"line":487},[361,1048,1049],{"class":375},"app",[361,1051,323],{"class":371},[361,1053,1054],{"class":464},"post",[361,1056,468],{"class":375},[361,1058,506],{"class":371},[361,1060,1061],{"class":399},"\u002Finvoices\u002F:id\u002Frefund",[361,1063,506],{"class":371},[361,1065,379],{"class":371},[361,1067,1068],{"class":480}," async",[361,1070,689],{"class":371},[361,1072,1073],{"class":473},"c",[361,1075,477],{"class":371},[361,1077,481],{"class":480},[361,1079,484],{"class":371},[361,1081,1082,1084,1086,1088,1091,1093,1096,1098,1100,1103,1105],{"class":363,"line":521},[361,1083,703],{"class":480},[361,1085,706],{"class":375},[361,1087,709],{"class":371},[361,1089,1090],{"class":375}," c",[361,1092,323],{"class":371},[361,1094,1095],{"class":464},"get",[361,1097,468],{"class":503},[361,1099,506],{"class":371},[361,1101,1102],{"class":399},"log",[361,1104,506],{"class":371},[361,1106,663],{"class":503},[361,1108,1109,1111,1113,1115,1117,1119,1121,1123],{"class":363,"line":549},[361,1110,703],{"class":480},[361,1112,725],{"class":375},[361,1114,709],{"class":371},[361,1116,639],{"class":367},[361,1118,732],{"class":464},[361,1120,468],{"class":503},[361,1122,1073],{"class":375},[361,1124,663],{"class":503},[361,1126,1127,1129,1131,1133,1135,1137,1139,1141,1143,1146,1148,1151,1153,1155,1157,1159],{"class":363,"line":577},[361,1128,703],{"class":480},[361,1130,745],{"class":375},[361,1132,709],{"class":371},[361,1134,639],{"class":367},[361,1136,752],{"class":464},[361,1138,468],{"class":503},[361,1140,1073],{"class":375},[361,1142,323],{"class":371},[361,1144,1145],{"class":375},"req",[361,1147,323],{"class":371},[361,1149,1150],{"class":464},"param",[361,1152,468],{"class":503},[361,1154,506],{"class":371},[361,1156,768],{"class":399},[361,1158,506],{"class":371},[361,1160,773],{"class":503},[361,1162,1163],{"class":363,"line":633},[361,1164,452],{"emptyLinePlaceholder":451},[361,1166,1167,1169,1171,1173,1175],{"class":363,"line":651},[361,1168,782],{"class":375},[361,1170,323],{"class":371},[361,1172,318],{"class":464},[361,1174,468],{"class":503},[361,1176,791],{"class":371},[361,1178,1179,1181,1183,1185,1187,1189],{"class":363,"line":657},[361,1180,796],{"class":503},[361,1182,596],{"class":371},[361,1184,396],{"class":371},[361,1186,803],{"class":399},[361,1188,506],{"class":371},[361,1190,630],{"class":371},[361,1192,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233],{"class":363,"line":933},[361,1194,812],{"class":503},[361,1196,596],{"class":371},[361,1198,372],{"class":371},[361,1200,819],{"class":503},[361,1202,596],{"class":371},[361,1204,396],{"class":371},[361,1206,826],{"class":399},[361,1208,506],{"class":371},[361,1210,379],{"class":371},[361,1212,833],{"class":503},[361,1214,596],{"class":371},[361,1216,725],{"class":375},[361,1218,323],{"class":371},[361,1220,768],{"class":375},[361,1222,379],{"class":371},[361,1224,846],{"class":503},[361,1226,596],{"class":371},[361,1228,725],{"class":375},[361,1230,323],{"class":371},[361,1232,855],{"class":375},[361,1234,648],{"class":371},[361,1236,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265],{"class":363,"line":938},[361,1238,862],{"class":503},[361,1240,596],{"class":371},[361,1242,372],{"class":371},[361,1244,819],{"class":503},[361,1246,596],{"class":371},[361,1248,396],{"class":371},[361,1250,875],{"class":399},[361,1252,506],{"class":371},[361,1254,379],{"class":371},[361,1256,833],{"class":503},[361,1258,596],{"class":371},[361,1260,745],{"class":375},[361,1262,323],{"class":371},[361,1264,768],{"class":375},[361,1266,648],{"class":371},[361,1268,1269,1271,1273,1275,1277,1279],{"class":363,"line":956},[361,1270,896],{"class":503},[361,1272,596],{"class":371},[361,1274,396],{"class":371},[361,1276,903],{"class":399},[361,1278,506],{"class":371},[361,1280,630],{"class":371},[361,1282,1284,1286,1288,1290,1292,1294],{"class":363,"line":1283},16,[361,1285,912],{"class":503},[361,1287,596],{"class":371},[361,1289,396],{"class":371},[361,1291,919],{"class":399},[361,1293,506],{"class":371},[361,1295,630],{"class":371},[361,1297,1299,1301],{"class":363,"line":1298},17,[361,1300,928],{"class":371},[361,1302,663],{"class":503},[361,1304,1306],{"class":363,"line":1305},18,[361,1307,452],{"emptyLinePlaceholder":451},[361,1309,1311,1313,1315,1317,1320,1322,1324,1326,1328,1330,1332],{"class":363,"line":1310},19,[361,1312,941],{"class":367},[361,1314,1090],{"class":375},[361,1316,323],{"class":371},[361,1318,1319],{"class":464},"json",[361,1321,468],{"class":503},[361,1323,590],{"class":371},[361,1325,946],{"class":503},[361,1327,596],{"class":371},[361,1329,645],{"class":644},[361,1331,390],{"class":371},[361,1333,663],{"class":503},[361,1335,1337,1339],{"class":363,"line":1336},20,[361,1338,660],{"class":371},[361,1340,663],{"class":375},[351,1342,1344],{"className":353,"code":1343,"filename":159,"language":356,"meta":357,"style":357},"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",[316,1345,1346,1373,1377,1420,1436,1454,1481,1485,1497,1511,1555,1587,1601,1615,1621,1625,1648],{"__ignoreMap":357},[361,1347,1348,1350,1352,1354,1357,1359,1362,1364,1366,1368,1371],{"class":363,"line":364},[361,1349,368],{"class":367},[361,1351,819],{"class":367},[361,1353,372],{"class":371},[361,1355,1356],{"class":375}," Request",[361,1358,379],{"class":371},[361,1360,1361],{"class":375}," Response",[361,1363,390],{"class":371},[361,1365,393],{"class":367},[361,1367,396],{"class":371},[361,1369,1370],{"class":399},"express",[361,1372,403],{"class":371},[361,1374,1375],{"class":363,"line":406},[361,1376,452],{"emptyLinePlaceholder":451},[361,1378,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407,1410,1412,1414,1416,1418],{"class":363,"line":427},[361,1380,1049],{"class":375},[361,1382,323],{"class":371},[361,1384,1054],{"class":464},[361,1386,468],{"class":375},[361,1388,506],{"class":371},[361,1390,1061],{"class":399},[361,1392,506],{"class":371},[361,1394,379],{"class":371},[361,1396,1068],{"class":480},[361,1398,689],{"class":371},[361,1400,1145],{"class":473},[361,1402,596],{"class":371},[361,1404,1356],{"class":1033},[361,1406,379],{"class":371},[361,1408,1409],{"class":473}," res",[361,1411,596],{"class":371},[361,1413,1361],{"class":1033},[361,1415,477],{"class":371},[361,1417,481],{"class":480},[361,1419,484],{"class":371},[361,1421,1422,1424,1426,1428,1431,1433],{"class":363,"line":448},[361,1423,703],{"class":480},[361,1425,706],{"class":375},[361,1427,709],{"class":371},[361,1429,1430],{"class":375}," req",[361,1432,323],{"class":371},[361,1434,1435],{"class":375},"log\n",[361,1437,1438,1440,1442,1444,1446,1448,1450,1452],{"class":363,"line":455},[361,1439,703],{"class":480},[361,1441,725],{"class":375},[361,1443,709],{"class":371},[361,1445,639],{"class":367},[361,1447,732],{"class":464},[361,1449,468],{"class":503},[361,1451,1145],{"class":375},[361,1453,663],{"class":503},[361,1455,1456,1458,1460,1462,1464,1466,1468,1470,1472,1475,1477,1479],{"class":363,"line":487},[361,1457,703],{"class":480},[361,1459,745],{"class":375},[361,1461,709],{"class":371},[361,1463,639],{"class":367},[361,1465,752],{"class":464},[361,1467,468],{"class":503},[361,1469,1145],{"class":375},[361,1471,323],{"class":371},[361,1473,1474],{"class":375},"params",[361,1476,323],{"class":371},[361,1478,768],{"class":375},[361,1480,663],{"class":503},[361,1482,1483],{"class":363,"line":521},[361,1484,452],{"emptyLinePlaceholder":451},[361,1486,1487,1489,1491,1493,1495],{"class":363,"line":549},[361,1488,782],{"class":375},[361,1490,323],{"class":371},[361,1492,318],{"class":464},[361,1494,468],{"class":503},[361,1496,791],{"class":371},[361,1498,1499,1501,1503,1505,1507,1509],{"class":363,"line":577},[361,1500,796],{"class":503},[361,1502,596],{"class":371},[361,1504,396],{"class":371},[361,1506,803],{"class":399},[361,1508,506],{"class":371},[361,1510,630],{"class":371},[361,1512,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553],{"class":363,"line":633},[361,1514,812],{"class":503},[361,1516,596],{"class":371},[361,1518,372],{"class":371},[361,1520,819],{"class":503},[361,1522,596],{"class":371},[361,1524,396],{"class":371},[361,1526,826],{"class":399},[361,1528,506],{"class":371},[361,1530,379],{"class":371},[361,1532,833],{"class":503},[361,1534,596],{"class":371},[361,1536,725],{"class":375},[361,1538,323],{"class":371},[361,1540,768],{"class":375},[361,1542,379],{"class":371},[361,1544,846],{"class":503},[361,1546,596],{"class":371},[361,1548,725],{"class":375},[361,1550,323],{"class":371},[361,1552,855],{"class":375},[361,1554,648],{"class":371},[361,1556,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585],{"class":363,"line":651},[361,1558,862],{"class":503},[361,1560,596],{"class":371},[361,1562,372],{"class":371},[361,1564,819],{"class":503},[361,1566,596],{"class":371},[361,1568,396],{"class":371},[361,1570,875],{"class":399},[361,1572,506],{"class":371},[361,1574,379],{"class":371},[361,1576,833],{"class":503},[361,1578,596],{"class":371},[361,1580,745],{"class":375},[361,1582,323],{"class":371},[361,1584,768],{"class":375},[361,1586,648],{"class":371},[361,1588,1589,1591,1593,1595,1597,1599],{"class":363,"line":657},[361,1590,896],{"class":503},[361,1592,596],{"class":371},[361,1594,396],{"class":371},[361,1596,903],{"class":399},[361,1598,506],{"class":371},[361,1600,630],{"class":371},[361,1602,1603,1605,1607,1609,1611,1613],{"class":363,"line":933},[361,1604,912],{"class":503},[361,1606,596],{"class":371},[361,1608,396],{"class":371},[361,1610,919],{"class":399},[361,1612,506],{"class":371},[361,1614,630],{"class":371},[361,1616,1617,1619],{"class":363,"line":938},[361,1618,928],{"class":371},[361,1620,663],{"class":503},[361,1622,1623],{"class":363,"line":956},[361,1624,452],{"emptyLinePlaceholder":451},[361,1626,1627,1630,1632,1634,1636,1638,1640,1642,1644,1646],{"class":363,"line":1283},[361,1628,1629],{"class":375},"  res",[361,1631,323],{"class":371},[361,1633,1319],{"class":464},[361,1635,468],{"class":503},[361,1637,590],{"class":371},[361,1639,946],{"class":503},[361,1641,596],{"class":371},[361,1643,645],{"class":644},[361,1645,390],{"class":371},[361,1647,663],{"class":503},[361,1649,1650,1652],{"class":363,"line":1298},[361,1651,660],{"class":371},[361,1653,663],{"class":375},[351,1655,1658],{"className":353,"code":1656,"filename":1657,"language":356,"meta":357,"style":357},"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","Next.js Route Handler",[316,1659,1660,1684,1688,1724,1736,1754,1776,1780,1792,1806,1850,1882,1896,1910,1916,1920,1944],{"__ignoreMap":357},[361,1661,1662,1664,1666,1669,1671,1673,1675,1677,1679,1682],{"class":363,"line":364},[361,1663,368],{"class":367},[361,1665,372],{"class":371},[361,1667,1668],{"class":375}," withEvlog",[361,1670,379],{"class":371},[361,1672,712],{"class":375},[361,1674,390],{"class":371},[361,1676,393],{"class":367},[361,1678,396],{"class":371},[361,1680,1681],{"class":399},"@\u002Flib\u002Fevlog",[361,1683,403],{"class":371},[361,1685,1686],{"class":363,"line":406},[361,1687,452],{"emptyLinePlaceholder":451},[361,1689,1690,1692,1695,1698,1700,1702,1704,1706,1708,1710,1712,1714,1717,1720,1722],{"class":363,"line":427},[361,1691,458],{"class":367},[361,1693,1694],{"class":480}," const",[361,1696,1697],{"class":375}," POST ",[361,1699,1022],{"class":371},[361,1701,1668],{"class":464},[361,1703,468],{"class":375},[361,1705,686],{"class":480},[361,1707,689],{"class":371},[361,1709,1145],{"class":473},[361,1711,379],{"class":371},[361,1713,372],{"class":371},[361,1715,1716],{"class":473}," params",[361,1718,1719],{"class":371}," })",[361,1721,481],{"class":480},[361,1723,484],{"class":371},[361,1725,1726,1728,1730,1732,1734],{"class":363,"line":448},[361,1727,703],{"class":480},[361,1729,706],{"class":375},[361,1731,709],{"class":371},[361,1733,712],{"class":464},[361,1735,1040],{"class":503},[361,1737,1738,1740,1742,1744,1746,1748,1750,1752],{"class":363,"line":455},[361,1739,703],{"class":480},[361,1741,725],{"class":375},[361,1743,709],{"class":371},[361,1745,639],{"class":367},[361,1747,732],{"class":464},[361,1749,468],{"class":503},[361,1751,1145],{"class":375},[361,1753,663],{"class":503},[361,1755,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774],{"class":363,"line":487},[361,1757,703],{"class":480},[361,1759,745],{"class":375},[361,1761,709],{"class":371},[361,1763,639],{"class":367},[361,1765,752],{"class":464},[361,1767,468],{"class":503},[361,1769,1474],{"class":375},[361,1771,323],{"class":371},[361,1773,768],{"class":375},[361,1775,663],{"class":503},[361,1777,1778],{"class":363,"line":521},[361,1779,452],{"emptyLinePlaceholder":451},[361,1781,1782,1784,1786,1788,1790],{"class":363,"line":549},[361,1783,782],{"class":375},[361,1785,323],{"class":371},[361,1787,318],{"class":464},[361,1789,468],{"class":503},[361,1791,791],{"class":371},[361,1793,1794,1796,1798,1800,1802,1804],{"class":363,"line":577},[361,1795,796],{"class":503},[361,1797,596],{"class":371},[361,1799,396],{"class":371},[361,1801,803],{"class":399},[361,1803,506],{"class":371},[361,1805,630],{"class":371},[361,1807,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848],{"class":363,"line":633},[361,1809,812],{"class":503},[361,1811,596],{"class":371},[361,1813,372],{"class":371},[361,1815,819],{"class":503},[361,1817,596],{"class":371},[361,1819,396],{"class":371},[361,1821,826],{"class":399},[361,1823,506],{"class":371},[361,1825,379],{"class":371},[361,1827,833],{"class":503},[361,1829,596],{"class":371},[361,1831,725],{"class":375},[361,1833,323],{"class":371},[361,1835,768],{"class":375},[361,1837,379],{"class":371},[361,1839,846],{"class":503},[361,1841,596],{"class":371},[361,1843,725],{"class":375},[361,1845,323],{"class":371},[361,1847,855],{"class":375},[361,1849,648],{"class":371},[361,1851,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880],{"class":363,"line":651},[361,1853,862],{"class":503},[361,1855,596],{"class":371},[361,1857,372],{"class":371},[361,1859,819],{"class":503},[361,1861,596],{"class":371},[361,1863,396],{"class":371},[361,1865,875],{"class":399},[361,1867,506],{"class":371},[361,1869,379],{"class":371},[361,1871,833],{"class":503},[361,1873,596],{"class":371},[361,1875,745],{"class":375},[361,1877,323],{"class":371},[361,1879,768],{"class":375},[361,1881,648],{"class":371},[361,1883,1884,1886,1888,1890,1892,1894],{"class":363,"line":657},[361,1885,896],{"class":503},[361,1887,596],{"class":371},[361,1889,396],{"class":371},[361,1891,903],{"class":399},[361,1893,506],{"class":371},[361,1895,630],{"class":371},[361,1897,1898,1900,1902,1904,1906,1908],{"class":363,"line":933},[361,1899,912],{"class":503},[361,1901,596],{"class":371},[361,1903,396],{"class":371},[361,1905,919],{"class":399},[361,1907,506],{"class":371},[361,1909,630],{"class":371},[361,1911,1912,1914],{"class":363,"line":938},[361,1913,928],{"class":371},[361,1915,663],{"class":503},[361,1917,1918],{"class":363,"line":956},[361,1919,452],{"emptyLinePlaceholder":451},[361,1921,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942],{"class":363,"line":1283},[361,1923,941],{"class":367},[361,1925,1361],{"class":375},[361,1927,323],{"class":371},[361,1929,1319],{"class":464},[361,1931,468],{"class":503},[361,1933,590],{"class":371},[361,1935,946],{"class":503},[361,1937,596],{"class":371},[361,1939,645],{"class":644},[361,1941,390],{"class":371},[361,1943,663],{"class":503},[361,1945,1946,1948],{"class":363,"line":1298},[361,1947,660],{"class":371},[361,1949,663],{"class":375},[351,1951,1954],{"className":353,"code":1952,"filename":1953,"language":356,"meta":357,"style":357},"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",[316,1955,1956,1975,1979,1987,2002,2037,2071,2086,2102],{"__ignoreMap":357},[361,1957,1958,1960,1962,1965,1967,1969,1971,1973],{"class":363,"line":364},[361,1959,368],{"class":367},[361,1961,372],{"class":371},[361,1963,1964],{"class":375}," audit",[361,1966,390],{"class":371},[361,1968,393],{"class":367},[361,1970,396],{"class":371},[361,1972,400],{"class":399},[361,1974,403],{"class":371},[361,1976,1977],{"class":363,"line":406},[361,1978,452],{"emptyLinePlaceholder":451},[361,1980,1981,1983,1985],{"class":363,"line":427},[361,1982,318],{"class":464},[361,1984,468],{"class":375},[361,1986,791],{"class":371},[361,1988,1989,1992,1994,1996,1998,2000],{"class":363,"line":448},[361,1990,1991],{"class":503},"  action",[361,1993,596],{"class":371},[361,1995,396],{"class":371},[361,1997,803],{"class":399},[361,1999,506],{"class":371},[361,2001,630],{"class":371},[361,2003,2004,2007,2009,2011,2013,2015,2017,2020,2022,2024,2026,2028,2030,2033,2035],{"class":363,"line":455},[361,2005,2006],{"class":503},"  actor",[361,2008,596],{"class":371},[361,2010,372],{"class":371},[361,2012,819],{"class":503},[361,2014,596],{"class":371},[361,2016,396],{"class":371},[361,2018,2019],{"class":399},"system",[361,2021,506],{"class":371},[361,2023,379],{"class":371},[361,2025,833],{"class":503},[361,2027,596],{"class":371},[361,2029,396],{"class":371},[361,2031,2032],{"class":399},"billing-worker",[361,2034,506],{"class":371},[361,2036,648],{"class":371},[361,2038,2039,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2067,2069],{"class":363,"line":487},[361,2040,2041],{"class":503},"  target",[361,2043,596],{"class":371},[361,2045,372],{"class":371},[361,2047,819],{"class":503},[361,2049,596],{"class":371},[361,2051,396],{"class":371},[361,2053,875],{"class":399},[361,2055,506],{"class":371},[361,2057,379],{"class":371},[361,2059,833],{"class":503},[361,2061,596],{"class":371},[361,2063,396],{"class":371},[361,2065,2066],{"class":399},"inv_889",[361,2068,506],{"class":371},[361,2070,648],{"class":371},[361,2072,2073,2076,2078,2080,2082,2084],{"class":363,"line":521},[361,2074,2075],{"class":503},"  outcome",[361,2077,596],{"class":371},[361,2079,396],{"class":371},[361,2081,903],{"class":399},[361,2083,506],{"class":371},[361,2085,630],{"class":371},[361,2087,2088,2091,2093,2095,2098,2100],{"class":363,"line":549},[361,2089,2090],{"class":503},"  reason",[361,2092,596],{"class":371},[361,2094,396],{"class":371},[361,2096,2097],{"class":399},"Auto-refund triggered by chargeback webhook",[361,2099,506],{"class":371},[361,2101,630],{"class":371},[361,2103,2104,2106],{"class":363,"line":577},[361,2105,660],{"class":371},[361,2107,663],{"class":375},[351,2109,2113],{"className":2110,"code":2111,"filename":2112,"language":1319,"meta":357,"style":357},"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",[316,2114,2115,2119,2142,2162,2182,2202,2219,2239,2259,2271,2291,2355,2400,2419,2438,2454,2474,2487,2506,2526,2545,2551,2557],{"__ignoreMap":357},[361,2116,2117],{"class":363,"line":364},[361,2118,791],{"class":371},[361,2120,2121,2124,2127,2130,2132,2135,2138,2140],{"class":363,"line":406},[361,2122,2123],{"class":371},"  \"",[361,2125,2126],{"class":480},"level",[361,2128,2129],{"class":371},"\"",[361,2131,596],{"class":371},[361,2133,2134],{"class":371}," \"",[361,2136,2137],{"class":399},"info",[361,2139,2129],{"class":371},[361,2141,630],{"class":371},[361,2143,2144,2146,2149,2151,2153,2155,2158,2160],{"class":363,"line":427},[361,2145,2123],{"class":371},[361,2147,2148],{"class":480},"service",[361,2150,2129],{"class":371},[361,2152,596],{"class":371},[361,2154,2134],{"class":371},[361,2156,2157],{"class":399},"billing-api",[361,2159,2129],{"class":371},[361,2161,630],{"class":371},[361,2163,2164,2166,2169,2171,2173,2175,2178,2180],{"class":363,"line":448},[361,2165,2123],{"class":371},[361,2167,2168],{"class":480},"method",[361,2170,2129],{"class":371},[361,2172,596],{"class":371},[361,2174,2134],{"class":371},[361,2176,2177],{"class":399},"POST",[361,2179,2129],{"class":371},[361,2181,630],{"class":371},[361,2183,2184,2186,2189,2191,2193,2195,2198,2200],{"class":363,"line":455},[361,2185,2123],{"class":371},[361,2187,2188],{"class":480},"path",[361,2190,2129],{"class":371},[361,2192,596],{"class":371},[361,2194,2134],{"class":371},[361,2196,2197],{"class":399},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[361,2199,2129],{"class":371},[361,2201,630],{"class":371},[361,2203,2204,2206,2209,2211,2213,2217],{"class":363,"line":487},[361,2205,2123],{"class":371},[361,2207,2208],{"class":480},"status",[361,2210,2129],{"class":371},[361,2212,596],{"class":371},[361,2214,2216],{"class":2215},"sbssI"," 200",[361,2218,630],{"class":371},[361,2220,2221,2223,2226,2228,2230,2232,2235,2237],{"class":363,"line":521},[361,2222,2123],{"class":371},[361,2224,2225],{"class":480},"duration",[361,2227,2129],{"class":371},[361,2229,596],{"class":371},[361,2231,2134],{"class":371},[361,2233,2234],{"class":399},"84ms",[361,2236,2129],{"class":371},[361,2238,630],{"class":371},[361,2240,2241,2243,2246,2248,2250,2252,2255,2257],{"class":363,"line":549},[361,2242,2123],{"class":371},[361,2244,2245],{"class":480},"requestId",[361,2247,2129],{"class":371},[361,2249,596],{"class":371},[361,2251,2134],{"class":371},[361,2253,2254],{"class":399},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[361,2256,2129],{"class":371},[361,2258,630],{"class":371},[361,2260,2261,2263,2265,2267,2269],{"class":363,"line":577},[361,2262,2123],{"class":371},[361,2264,318],{"class":480},[361,2266,2129],{"class":371},[361,2268,596],{"class":371},[361,2270,484],{"class":371},[361,2272,2273,2276,2279,2281,2283,2285,2287,2289],{"class":363,"line":633},[361,2274,2275],{"class":371},"    \"",[361,2277,2278],{"class":1033},"action",[361,2280,2129],{"class":371},[361,2282,596],{"class":371},[361,2284,2134],{"class":371},[361,2286,803],{"class":399},[361,2288,2129],{"class":371},[361,2290,630],{"class":371},[361,2292,2293,2295,2298,2300,2302,2304,2306,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2334,2336,2338,2340,2342,2344,2346,2348,2351,2353],{"class":363,"line":651},[361,2294,2275],{"class":371},[361,2296,2297],{"class":1033},"actor",[361,2299,2129],{"class":371},[361,2301,596],{"class":371},[361,2303,372],{"class":371},[361,2305,2134],{"class":371},[361,2307,2308],{"class":2215},"type",[361,2310,2129],{"class":371},[361,2312,596],{"class":371},[361,2314,2134],{"class":371},[361,2316,826],{"class":399},[361,2318,2129],{"class":371},[361,2320,379],{"class":371},[361,2322,2134],{"class":371},[361,2324,768],{"class":2215},[361,2326,2129],{"class":371},[361,2328,596],{"class":371},[361,2330,2134],{"class":371},[361,2332,2333],{"class":399},"usr_42",[361,2335,2129],{"class":371},[361,2337,379],{"class":371},[361,2339,2134],{"class":371},[361,2341,855],{"class":2215},[361,2343,2129],{"class":371},[361,2345,596],{"class":371},[361,2347,2134],{"class":371},[361,2349,2350],{"class":399},"demo@example.com",[361,2352,2129],{"class":371},[361,2354,648],{"class":371},[361,2356,2357,2359,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398],{"class":363,"line":657},[361,2358,2275],{"class":371},[361,2360,2361],{"class":1033},"target",[361,2363,2129],{"class":371},[361,2365,596],{"class":371},[361,2367,372],{"class":371},[361,2369,2134],{"class":371},[361,2371,2308],{"class":2215},[361,2373,2129],{"class":371},[361,2375,596],{"class":371},[361,2377,2134],{"class":371},[361,2379,875],{"class":399},[361,2381,2129],{"class":371},[361,2383,379],{"class":371},[361,2385,2134],{"class":371},[361,2387,768],{"class":2215},[361,2389,2129],{"class":371},[361,2391,596],{"class":371},[361,2393,2134],{"class":371},[361,2395,2066],{"class":399},[361,2397,2129],{"class":371},[361,2399,648],{"class":371},[361,2401,2402,2404,2407,2409,2411,2413,2415,2417],{"class":363,"line":933},[361,2403,2275],{"class":371},[361,2405,2406],{"class":1033},"outcome",[361,2408,2129],{"class":371},[361,2410,596],{"class":371},[361,2412,2134],{"class":371},[361,2414,903],{"class":399},[361,2416,2129],{"class":371},[361,2418,630],{"class":371},[361,2420,2421,2423,2426,2428,2430,2432,2434,2436],{"class":363,"line":938},[361,2422,2275],{"class":371},[361,2424,2425],{"class":1033},"reason",[361,2427,2129],{"class":371},[361,2429,596],{"class":371},[361,2431,2134],{"class":371},[361,2433,919],{"class":399},[361,2435,2129],{"class":371},[361,2437,630],{"class":371},[361,2439,2440,2442,2445,2447,2449,2452],{"class":363,"line":956},[361,2441,2275],{"class":371},[361,2443,2444],{"class":1033},"version",[361,2446,2129],{"class":371},[361,2448,596],{"class":371},[361,2450,2451],{"class":2215}," 1",[361,2453,630],{"class":371},[361,2455,2456,2458,2461,2463,2465,2467,2470,2472],{"class":363,"line":1283},[361,2457,2275],{"class":371},[361,2459,2460],{"class":1033},"idempotencyKey",[361,2462,2129],{"class":371},[361,2464,596],{"class":371},[361,2466,2134],{"class":371},[361,2468,2469],{"class":399},"ak_8f3c4b2a1e5d6f7c",[361,2471,2129],{"class":371},[361,2473,630],{"class":371},[361,2475,2476,2478,2481,2483,2485],{"class":363,"line":1298},[361,2477,2275],{"class":371},[361,2479,2480],{"class":1033},"context",[361,2482,2129],{"class":371},[361,2484,596],{"class":371},[361,2486,484],{"class":371},[361,2488,2489,2492,2494,2496,2498,2500,2502,2504],{"class":363,"line":1305},[361,2490,2491],{"class":371},"      \"",[361,2493,2245],{"class":2215},[361,2495,2129],{"class":371},[361,2497,596],{"class":371},[361,2499,2134],{"class":371},[361,2501,2254],{"class":399},[361,2503,2129],{"class":371},[361,2505,630],{"class":371},[361,2507,2508,2510,2513,2515,2517,2519,2522,2524],{"class":363,"line":1310},[361,2509,2491],{"class":371},[361,2511,2512],{"class":2215},"ip",[361,2514,2129],{"class":371},[361,2516,596],{"class":371},[361,2518,2134],{"class":371},[361,2520,2521],{"class":399},"203.0.113.7",[361,2523,2129],{"class":371},[361,2525,630],{"class":371},[361,2527,2528,2530,2533,2535,2537,2539,2542],{"class":363,"line":1336},[361,2529,2491],{"class":371},[361,2531,2532],{"class":2215},"userAgent",[361,2534,2129],{"class":371},[361,2536,596],{"class":371},[361,2538,2134],{"class":371},[361,2540,2541],{"class":399},"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36",[361,2543,2544],{"class":371},"\"\n",[361,2546,2548],{"class":363,"line":2547},21,[361,2549,2550],{"class":371},"    }\n",[361,2552,2554],{"class":363,"line":2553},22,[361,2555,2556],{"class":371},"  }\n",[361,2558,2560],{"class":363,"line":2559},23,[361,2561,2562],{"class":371},"}\n",[307,2564,2565],{},"That's it. The audit event:",[2567,2568,2569,2573,2580,2587],"ul",{},[2570,2571,2572],"li",{},"Travels through the same wide-event pipeline as the rest of your logs.",[2570,2574,2575,2576,2579],{},"Is ",[311,2577,2578],{},"always kept"," past tail sampling.",[2570,2581,2582,2583,2586],{},"Goes to your main drain (Axiom) ",[311,2584,2585],{},"and"," to a dedicated, signed, append-only sink (FS journal).",[2570,2588,2589,2590,2592,2593,2592,2596,2598,2599,2601,2602,323],{},"Carries ",[316,2591,2245],{},", ",[316,2594,2595],{},"traceId",[316,2597,2512],{},", and ",[316,2600,2532],{}," automatically via ",[316,2603,2604],{},"auditEnricher",[337,2606,2607,2610,2611,2614],{},[311,2608,2609],{},"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 ",[2612,2613,2585],"em",{}," a tamper-evident artefact.",[325,2616,2618],{"id":2617},"the-audit-schema","The Audit Schema",[307,2620,2621,2624,2625,323],{},[316,2622,2623],{},"event.audit"," is a typed field on every wide event. Downstream queries filter on ",[316,2626,2627],{},"audit IS NOT NULL",[351,2629,2631],{"className":353,"code":2630,"language":356,"meta":357,"style":357},"interface AuditFields {\n  action: string                          \u002F\u002F 'invoice.refund'\n  actor: {\n    type: 'user' | 'system' | 'api' | 'agent'\n    id: string\n    displayName?: string\n    email?: string\n    \u002F\u002F For type === 'agent', mirrors evlog\u002Fai fields:\n    model?: string\n    tools?: string[]\n    reason?: string\n    promptId?: string\n  }\n  target?: { type: string, id: string, [k: string]: unknown }\n  outcome: 'success' | 'failure' | 'denied'\n  reason?: string\n  changes?: { before?: unknown, after?: unknown }\n  causationId?: string                    \u002F\u002F ID of the action that caused this one\n  correlationId?: string                  \u002F\u002F Shared by every action in one operation\n  version?: number                        \u002F\u002F Defaults to 1\n  idempotencyKey?: string                 \u002F\u002F Auto-derived; safe retries across drains\n  context?: {                             \u002F\u002F Filled by auditEnricher\n    requestId?: string\n    traceId?: string\n    ip?: string\n    userAgent?: string\n    tenantId?: string\n  }\n  signature?: string                      \u002F\u002F Set by signed({ strategy: 'hmac' })\n  prevHash?: string                       \u002F\u002F Set by signed({ strategy: 'hash-chain' })\n  hash?: string\n}\n",[316,2632,2633,2643,2656,2664,2704,2714,2724,2733,2738,2747,2759,2767,2776,2780,2824,2854,2862,2889,2901,2913,2926,2938,2950,2959,2969,2979,2989,2999,3004,3017,3030,3040],{"__ignoreMap":357},[361,2634,2635,2638,2641],{"class":363,"line":364},[361,2636,2637],{"class":480},"interface",[361,2639,2640],{"class":1033}," AuditFields",[361,2642,484],{"class":371},[361,2644,2645,2647,2649,2652],{"class":363,"line":406},[361,2646,1991],{"class":503},[361,2648,596],{"class":371},[361,2650,2651],{"class":1033}," string",[361,2653,2655],{"class":2654},"sHwdD","                          \u002F\u002F 'invoice.refund'\n",[361,2657,2658,2660,2662],{"class":363,"line":427},[361,2659,2006],{"class":503},[361,2661,596],{"class":371},[361,2663,484],{"class":371},[361,2665,2666,2669,2671,2673,2675,2677,2680,2682,2684,2686,2688,2690,2693,2695,2697,2699,2702],{"class":363,"line":448},[361,2667,2668],{"class":503},"    type",[361,2670,596],{"class":371},[361,2672,396],{"class":371},[361,2674,826],{"class":399},[361,2676,506],{"class":371},[361,2678,2679],{"class":371}," |",[361,2681,396],{"class":371},[361,2683,2019],{"class":399},[361,2685,506],{"class":371},[361,2687,2679],{"class":371},[361,2689,396],{"class":371},[361,2691,2692],{"class":399},"api",[361,2694,506],{"class":371},[361,2696,2679],{"class":371},[361,2698,396],{"class":371},[361,2700,2701],{"class":399},"agent",[361,2703,403],{"class":371},[361,2705,2706,2709,2711],{"class":363,"line":455},[361,2707,2708],{"class":503},"    id",[361,2710,596],{"class":371},[361,2712,2713],{"class":1033}," string\n",[361,2715,2716,2719,2722],{"class":363,"line":487},[361,2717,2718],{"class":503},"    displayName",[361,2720,2721],{"class":371},"?:",[361,2723,2713],{"class":1033},[361,2725,2726,2729,2731],{"class":363,"line":521},[361,2727,2728],{"class":503},"    email",[361,2730,2721],{"class":371},[361,2732,2713],{"class":1033},[361,2734,2735],{"class":363,"line":549},[361,2736,2737],{"class":2654},"    \u002F\u002F For type === 'agent', mirrors evlog\u002Fai fields:\n",[361,2739,2740,2743,2745],{"class":363,"line":577},[361,2741,2742],{"class":503},"    model",[361,2744,2721],{"class":371},[361,2746,2713],{"class":1033},[361,2748,2749,2752,2754,2756],{"class":363,"line":633},[361,2750,2751],{"class":503},"    tools",[361,2753,2721],{"class":371},[361,2755,2651],{"class":1033},[361,2757,2758],{"class":375},"[]\n",[361,2760,2761,2763,2765],{"class":363,"line":651},[361,2762,912],{"class":503},[361,2764,2721],{"class":371},[361,2766,2713],{"class":1033},[361,2768,2769,2772,2774],{"class":363,"line":657},[361,2770,2771],{"class":503},"    promptId",[361,2773,2721],{"class":371},[361,2775,2713],{"class":1033},[361,2777,2778],{"class":363,"line":933},[361,2779,2556],{"class":371},[361,2781,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,2807,2810,2812,2814,2817,2819,2822],{"class":363,"line":938},[361,2783,2041],{"class":503},[361,2785,2721],{"class":371},[361,2787,372],{"class":371},[361,2789,819],{"class":503},[361,2791,596],{"class":371},[361,2793,2651],{"class":1033},[361,2795,379],{"class":371},[361,2797,833],{"class":503},[361,2799,596],{"class":371},[361,2801,2651],{"class":1033},[361,2803,379],{"class":371},[361,2805,2806],{"class":375}," [",[361,2808,2809],{"class":473},"k",[361,2811,596],{"class":371},[361,2813,2651],{"class":1033},[361,2815,2816],{"class":375},"]",[361,2818,596],{"class":371},[361,2820,2821],{"class":1033}," unknown",[361,2823,953],{"class":371},[361,2825,2826,2828,2830,2832,2834,2836,2838,2840,2843,2845,2847,2849,2852],{"class":363,"line":956},[361,2827,2075],{"class":503},[361,2829,596],{"class":371},[361,2831,396],{"class":371},[361,2833,903],{"class":399},[361,2835,506],{"class":371},[361,2837,2679],{"class":371},[361,2839,396],{"class":371},[361,2841,2842],{"class":399},"failure",[361,2844,506],{"class":371},[361,2846,2679],{"class":371},[361,2848,396],{"class":371},[361,2850,2851],{"class":399},"denied",[361,2853,403],{"class":371},[361,2855,2856,2858,2860],{"class":363,"line":1283},[361,2857,2090],{"class":503},[361,2859,2721],{"class":371},[361,2861,2713],{"class":1033},[361,2863,2864,2867,2869,2871,2874,2876,2878,2880,2883,2885,2887],{"class":363,"line":1298},[361,2865,2866],{"class":503},"  changes",[361,2868,2721],{"class":371},[361,2870,372],{"class":371},[361,2872,2873],{"class":503}," before",[361,2875,2721],{"class":371},[361,2877,2821],{"class":1033},[361,2879,379],{"class":371},[361,2881,2882],{"class":503}," after",[361,2884,2721],{"class":371},[361,2886,2821],{"class":1033},[361,2888,953],{"class":371},[361,2890,2891,2894,2896,2898],{"class":363,"line":1305},[361,2892,2893],{"class":503},"  causationId",[361,2895,2721],{"class":371},[361,2897,2651],{"class":1033},[361,2899,2900],{"class":2654},"                    \u002F\u002F ID of the action that caused this one\n",[361,2902,2903,2906,2908,2910],{"class":363,"line":1310},[361,2904,2905],{"class":503},"  correlationId",[361,2907,2721],{"class":371},[361,2909,2651],{"class":1033},[361,2911,2912],{"class":2654},"                  \u002F\u002F Shared by every action in one operation\n",[361,2914,2915,2918,2920,2923],{"class":363,"line":1336},[361,2916,2917],{"class":503},"  version",[361,2919,2721],{"class":371},[361,2921,2922],{"class":1033}," number",[361,2924,2925],{"class":2654},"                        \u002F\u002F Defaults to 1\n",[361,2927,2928,2931,2933,2935],{"class":363,"line":2547},[361,2929,2930],{"class":503},"  idempotencyKey",[361,2932,2721],{"class":371},[361,2934,2651],{"class":1033},[361,2936,2937],{"class":2654},"                 \u002F\u002F Auto-derived; safe retries across drains\n",[361,2939,2940,2943,2945,2947],{"class":363,"line":2553},[361,2941,2942],{"class":503},"  context",[361,2944,2721],{"class":371},[361,2946,372],{"class":371},[361,2948,2949],{"class":2654},"                             \u002F\u002F Filled by auditEnricher\n",[361,2951,2952,2955,2957],{"class":363,"line":2559},[361,2953,2954],{"class":503},"    requestId",[361,2956,2721],{"class":371},[361,2958,2713],{"class":1033},[361,2960,2962,2965,2967],{"class":363,"line":2961},24,[361,2963,2964],{"class":503},"    traceId",[361,2966,2721],{"class":371},[361,2968,2713],{"class":1033},[361,2970,2972,2975,2977],{"class":363,"line":2971},25,[361,2973,2974],{"class":503},"    ip",[361,2976,2721],{"class":371},[361,2978,2713],{"class":1033},[361,2980,2982,2985,2987],{"class":363,"line":2981},26,[361,2983,2984],{"class":503},"    userAgent",[361,2986,2721],{"class":371},[361,2988,2713],{"class":1033},[361,2990,2992,2995,2997],{"class":363,"line":2991},27,[361,2993,2994],{"class":503},"    tenantId",[361,2996,2721],{"class":371},[361,2998,2713],{"class":1033},[361,3000,3002],{"class":363,"line":3001},28,[361,3003,2556],{"class":371},[361,3005,3007,3010,3012,3014],{"class":363,"line":3006},29,[361,3008,3009],{"class":503},"  signature",[361,3011,2721],{"class":371},[361,3013,2651],{"class":1033},[361,3015,3016],{"class":2654},"                      \u002F\u002F Set by signed({ strategy: 'hmac' })\n",[361,3018,3020,3023,3025,3027],{"class":363,"line":3019},30,[361,3021,3022],{"class":503},"  prevHash",[361,3024,2721],{"class":371},[361,3026,2651],{"class":1033},[361,3028,3029],{"class":2654},"                       \u002F\u002F Set by signed({ strategy: 'hash-chain' })\n",[361,3031,3033,3036,3038],{"class":363,"line":3032},31,[361,3034,3035],{"class":503},"  hash",[361,3037,2721],{"class":371},[361,3039,2713],{"class":1033},[361,3041,3043],{"class":363,"line":3042},32,[361,3044,2562],{"class":371},[337,3046,3047,3052,3053,689,3056,2592,3058,2592,3061,3064,3065,3068,3069,3072,3073,3075],{},[311,3048,3049,3050,323],{},"Naming convention for ",[316,3051,2278],{}," Use ",[316,3054,3055],{},"noun.verb",[316,3057,803],{},[316,3059,3060],{},"user.invite",[316,3062,3063],{},"apiKey.revoke","). Past tense if the action already happened (",[316,3066,3067],{},"invoice.refunded","), present tense if ",[316,3070,3071],{},"withAudit()"," will resolve the outcome. Keep a small fixed dictionary in one file — auditors and SIEM rules query on ",[316,3074,2278],{},", so a typo is a missing alert.",[3077,3078,3079,3052,3082,3085,3086,3089,3090,3093,3094,3097],"warning",{},[311,3080,3081],{},"Don't fake the actor.",[316,3083,3084],{},"actor.type: 'system'"," for cron jobs, queue workers, and background tasks; ",[316,3087,3088],{},"actor.type: 'api'"," for machine-to-machine calls authenticated by a token; ",[316,3091,3092],{},"actor.type: 'agent'"," for AI tool calls. Logging a synthetic ",[316,3095,3096],{},"'user'"," for system actions is the single fastest way to fail an audit review.",[325,3099,3101],{"id":3100},"composition","Composition",[307,3103,3104,3105,3108],{},"Each layer is ",[311,3106,3107],{},"opt-in and replaceable",". Visually, the path of an audit event through your pipeline looks like this:",[351,3110,3115],{"className":3111,"code":3113,"language":3114,"meta":357},[3112],"language-text","  log.audit \u002F audit \u002F withAudit\n              │\n              ▼\n       set event.audit\n              │\n              ▼\n    force-keep tail-sample\n              │\n              ▼\n        auditEnricher\n              │\n              ▼\n   redact + auditRedactPreset\n              │\n   ┌──────────┴──────────┐\n   ▼                     ▼\n main drain         auditOnly(\n (Axiom \u002F            signed(\n  Datadog \u002F          fsDrain))\n  ...)\n","text",[316,3116,3113],{"__ignoreMap":357},[307,3118,3119,3120,2592,3123,2598,3125,3128,3129,3132],{},"Every node except ",[316,3121,3122],{},"log.audit",[316,3124,2604],{},[316,3126,3127],{},"auditOnly","\u002F",[316,3130,3131],{},"signed"," is shared with regular wide events.",[3134,3135,3137],"h3",{"id":3136},"helper","Helper",[307,3139,3140,3143,3144,3147],{},[316,3141,3142],{},"log.audit()"," is sugar over ",[316,3145,3146],{},"log.set({ audit: ... })"," plus tail-sample force-keep:",[351,3149,3151],{"className":353,"code":3150,"language":356,"meta":357,"style":357},"log.audit({\n  action: 'invoice.refund',\n  actor: { type: 'user', id: user.id },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n})\n\n\u002F\u002F Strictly equivalent to:\nlog.set({ audit: { action: 'invoice.refund', \u002F* ... *\u002F, version: 1 } })\n",[316,3152,3153,3165,3179,3213,3245,3259,3265,3269,3274],{"__ignoreMap":357},[361,3154,3155,3157,3159,3161,3163],{"class":363,"line":364},[361,3156,1102],{"class":375},[361,3158,323],{"class":371},[361,3160,318],{"class":464},[361,3162,468],{"class":375},[361,3164,791],{"class":371},[361,3166,3167,3169,3171,3173,3175,3177],{"class":363,"line":406},[361,3168,1991],{"class":503},[361,3170,596],{"class":371},[361,3172,396],{"class":371},[361,3174,803],{"class":399},[361,3176,506],{"class":371},[361,3178,630],{"class":371},[361,3180,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207,3210],{"class":363,"line":427},[361,3182,2006],{"class":503},[361,3184,596],{"class":371},[361,3186,372],{"class":371},[361,3188,819],{"class":503},[361,3190,596],{"class":371},[361,3192,396],{"class":371},[361,3194,826],{"class":399},[361,3196,506],{"class":371},[361,3198,379],{"class":371},[361,3200,833],{"class":503},[361,3202,596],{"class":371},[361,3204,725],{"class":375},[361,3206,323],{"class":371},[361,3208,3209],{"class":375},"id ",[361,3211,3212],{"class":371},"},\n",[361,3214,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233,3235,3237,3239,3241,3243],{"class":363,"line":448},[361,3216,2041],{"class":503},[361,3218,596],{"class":371},[361,3220,372],{"class":371},[361,3222,819],{"class":503},[361,3224,596],{"class":371},[361,3226,396],{"class":371},[361,3228,875],{"class":399},[361,3230,506],{"class":371},[361,3232,379],{"class":371},[361,3234,833],{"class":503},[361,3236,596],{"class":371},[361,3238,396],{"class":371},[361,3240,2066],{"class":399},[361,3242,506],{"class":371},[361,3244,648],{"class":371},[361,3246,3247,3249,3251,3253,3255,3257],{"class":363,"line":455},[361,3248,2075],{"class":503},[361,3250,596],{"class":371},[361,3252,396],{"class":371},[361,3254,903],{"class":399},[361,3256,506],{"class":371},[361,3258,630],{"class":371},[361,3260,3261,3263],{"class":363,"line":487},[361,3262,660],{"class":371},[361,3264,663],{"class":375},[361,3266,3267],{"class":363,"line":521},[361,3268,452],{"emptyLinePlaceholder":451},[361,3270,3271],{"class":363,"line":549},[361,3272,3273],{"class":2654},"\u002F\u002F Strictly equivalent to:\n",[361,3275,3276,3278,3280,3283,3285,3287,3289,3291,3293,3296,3298,3300,3302,3304,3306,3309,3311,3314,3316,3318,3320,3322],{"class":363,"line":577},[361,3277,1102],{"class":375},[361,3279,323],{"class":371},[361,3281,3282],{"class":464},"set",[361,3284,468],{"class":375},[361,3286,590],{"class":371},[361,3288,1964],{"class":503},[361,3290,596],{"class":371},[361,3292,372],{"class":371},[361,3294,3295],{"class":503}," action",[361,3297,596],{"class":371},[361,3299,396],{"class":371},[361,3301,803],{"class":399},[361,3303,506],{"class":371},[361,3305,379],{"class":371},[361,3307,3308],{"class":2654}," \u002F* ... *\u002F",[361,3310,379],{"class":371},[361,3312,3313],{"class":503}," version",[361,3315,596],{"class":371},[361,3317,2451],{"class":2215},[361,3319,390],{"class":371},[361,3321,390],{"class":371},[361,3323,663],{"class":375},[307,3325,3326,3329],{},[316,3327,3328],{},"log.audit.deny(reason, fields)"," records AuthZ-denied actions — most teams forget to log denials, but they are exactly what auditors and security teams ask for:",[665,3331,3332,3512],{},[351,3333,3336],{"className":353,"code":3334,"filename":3335,"language":356,"meta":357,"style":357},"if (!user.canRefund(invoice)) {\n  log.audit.deny('Insufficient permissions', {\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id },\n    target: { type: 'invoice', id: invoice.id },\n  })\n  throw createError({ status: 403, message: 'Forbidden' })\n}\n","Input",[316,3337,3338,3360,3386,3400,3432,3464,3470,3508],{"__ignoreMap":357},[361,3339,3340,3343,3345,3348,3350,3352,3355,3358],{"class":363,"line":364},[361,3341,3342],{"class":367},"if",[361,3344,689],{"class":375},[361,3346,3347],{"class":371},"!",[361,3349,826],{"class":375},[361,3351,323],{"class":371},[361,3353,3354],{"class":464},"canRefund",[361,3356,3357],{"class":375},"(invoice)) ",[361,3359,791],{"class":371},[361,3361,3362,3364,3366,3368,3370,3373,3375,3377,3380,3382,3384],{"class":363,"line":406},[361,3363,782],{"class":375},[361,3365,323],{"class":371},[361,3367,318],{"class":375},[361,3369,323],{"class":371},[361,3371,3372],{"class":464},"deny",[361,3374,468],{"class":503},[361,3376,506],{"class":371},[361,3378,3379],{"class":399},"Insufficient permissions",[361,3381,506],{"class":371},[361,3383,379],{"class":371},[361,3385,484],{"class":371},[361,3387,3388,3390,3392,3394,3396,3398],{"class":363,"line":427},[361,3389,796],{"class":503},[361,3391,596],{"class":371},[361,3393,396],{"class":371},[361,3395,803],{"class":399},[361,3397,506],{"class":371},[361,3399,630],{"class":371},[361,3401,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420,3422,3424,3426,3428,3430],{"class":363,"line":448},[361,3403,812],{"class":503},[361,3405,596],{"class":371},[361,3407,372],{"class":371},[361,3409,819],{"class":503},[361,3411,596],{"class":371},[361,3413,396],{"class":371},[361,3415,826],{"class":399},[361,3417,506],{"class":371},[361,3419,379],{"class":371},[361,3421,833],{"class":503},[361,3423,596],{"class":371},[361,3425,725],{"class":375},[361,3427,323],{"class":371},[361,3429,768],{"class":375},[361,3431,648],{"class":371},[361,3433,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462],{"class":363,"line":455},[361,3435,862],{"class":503},[361,3437,596],{"class":371},[361,3439,372],{"class":371},[361,3441,819],{"class":503},[361,3443,596],{"class":371},[361,3445,396],{"class":371},[361,3447,875],{"class":399},[361,3449,506],{"class":371},[361,3451,379],{"class":371},[361,3453,833],{"class":503},[361,3455,596],{"class":371},[361,3457,745],{"class":375},[361,3459,323],{"class":371},[361,3461,768],{"class":375},[361,3463,648],{"class":371},[361,3465,3466,3468],{"class":363,"line":487},[361,3467,928],{"class":371},[361,3469,663],{"class":503},[361,3471,3472,3475,3478,3480,3482,3485,3487,3490,3492,3495,3497,3499,3502,3504,3506],{"class":363,"line":521},[361,3473,3474],{"class":367},"  throw",[361,3476,3477],{"class":464}," createError",[361,3479,468],{"class":503},[361,3481,590],{"class":371},[361,3483,3484],{"class":503}," status",[361,3486,596],{"class":371},[361,3488,3489],{"class":2215}," 403",[361,3491,379],{"class":371},[361,3493,3494],{"class":503}," message",[361,3496,596],{"class":371},[361,3498,396],{"class":371},[361,3500,3501],{"class":399},"Forbidden",[361,3503,506],{"class":371},[361,3505,390],{"class":371},[361,3507,663],{"class":503},[361,3509,3510],{"class":363,"line":549},[361,3511,2562],{"class":371},[351,3513,3516],{"className":2110,"code":3514,"filename":3515,"language":1319,"meta":357,"style":357},"{\n  \"level\": \"warn\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 403,\n  \"duration\": \"12ms\",\n  \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_intruder\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Insufficient permissions\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"context\": {\n      \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n      \"ip\": \"203.0.113.7\"\n    }\n  }\n}\n","Output — denied",[316,3517,3518,3522,3541,3559,3577,3595,3609,3628,3647,3659,3677,3722,3766,3784,3802,3816,3835,3847,3865,3881,3885,3889],{"__ignoreMap":357},[361,3519,3520],{"class":363,"line":364},[361,3521,791],{"class":371},[361,3523,3524,3526,3528,3530,3532,3534,3537,3539],{"class":363,"line":406},[361,3525,2123],{"class":371},[361,3527,2126],{"class":480},[361,3529,2129],{"class":371},[361,3531,596],{"class":371},[361,3533,2134],{"class":371},[361,3535,3536],{"class":399},"warn",[361,3538,2129],{"class":371},[361,3540,630],{"class":371},[361,3542,3543,3545,3547,3549,3551,3553,3555,3557],{"class":363,"line":427},[361,3544,2123],{"class":371},[361,3546,2148],{"class":480},[361,3548,2129],{"class":371},[361,3550,596],{"class":371},[361,3552,2134],{"class":371},[361,3554,2157],{"class":399},[361,3556,2129],{"class":371},[361,3558,630],{"class":371},[361,3560,3561,3563,3565,3567,3569,3571,3573,3575],{"class":363,"line":448},[361,3562,2123],{"class":371},[361,3564,2168],{"class":480},[361,3566,2129],{"class":371},[361,3568,596],{"class":371},[361,3570,2134],{"class":371},[361,3572,2177],{"class":399},[361,3574,2129],{"class":371},[361,3576,630],{"class":371},[361,3578,3579,3581,3583,3585,3587,3589,3591,3593],{"class":363,"line":455},[361,3580,2123],{"class":371},[361,3582,2188],{"class":480},[361,3584,2129],{"class":371},[361,3586,596],{"class":371},[361,3588,2134],{"class":371},[361,3590,2197],{"class":399},[361,3592,2129],{"class":371},[361,3594,630],{"class":371},[361,3596,3597,3599,3601,3603,3605,3607],{"class":363,"line":487},[361,3598,2123],{"class":371},[361,3600,2208],{"class":480},[361,3602,2129],{"class":371},[361,3604,596],{"class":371},[361,3606,3489],{"class":2215},[361,3608,630],{"class":371},[361,3610,3611,3613,3615,3617,3619,3621,3624,3626],{"class":363,"line":521},[361,3612,2123],{"class":371},[361,3614,2225],{"class":480},[361,3616,2129],{"class":371},[361,3618,596],{"class":371},[361,3620,2134],{"class":371},[361,3622,3623],{"class":399},"12ms",[361,3625,2129],{"class":371},[361,3627,630],{"class":371},[361,3629,3630,3632,3634,3636,3638,3640,3643,3645],{"class":363,"line":549},[361,3631,2123],{"class":371},[361,3633,2245],{"class":480},[361,3635,2129],{"class":371},[361,3637,596],{"class":371},[361,3639,2134],{"class":371},[361,3641,3642],{"class":399},"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d",[361,3644,2129],{"class":371},[361,3646,630],{"class":371},[361,3648,3649,3651,3653,3655,3657],{"class":363,"line":577},[361,3650,2123],{"class":371},[361,3652,318],{"class":480},[361,3654,2129],{"class":371},[361,3656,596],{"class":371},[361,3658,484],{"class":371},[361,3660,3661,3663,3665,3667,3669,3671,3673,3675],{"class":363,"line":633},[361,3662,2275],{"class":371},[361,3664,2278],{"class":1033},[361,3666,2129],{"class":371},[361,3668,596],{"class":371},[361,3670,2134],{"class":371},[361,3672,803],{"class":399},[361,3674,2129],{"class":371},[361,3676,630],{"class":371},[361,3678,3679,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3718,3720],{"class":363,"line":651},[361,3680,2275],{"class":371},[361,3682,2297],{"class":1033},[361,3684,2129],{"class":371},[361,3686,596],{"class":371},[361,3688,372],{"class":371},[361,3690,2134],{"class":371},[361,3692,2308],{"class":2215},[361,3694,2129],{"class":371},[361,3696,596],{"class":371},[361,3698,2134],{"class":371},[361,3700,826],{"class":399},[361,3702,2129],{"class":371},[361,3704,379],{"class":371},[361,3706,2134],{"class":371},[361,3708,768],{"class":2215},[361,3710,2129],{"class":371},[361,3712,596],{"class":371},[361,3714,2134],{"class":371},[361,3716,3717],{"class":399},"usr_intruder",[361,3719,2129],{"class":371},[361,3721,648],{"class":371},[361,3723,3724,3726,3728,3730,3732,3734,3736,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":363,"line":657},[361,3725,2275],{"class":371},[361,3727,2361],{"class":1033},[361,3729,2129],{"class":371},[361,3731,596],{"class":371},[361,3733,372],{"class":371},[361,3735,2134],{"class":371},[361,3737,2308],{"class":2215},[361,3739,2129],{"class":371},[361,3741,596],{"class":371},[361,3743,2134],{"class":371},[361,3745,875],{"class":399},[361,3747,2129],{"class":371},[361,3749,379],{"class":371},[361,3751,2134],{"class":371},[361,3753,768],{"class":2215},[361,3755,2129],{"class":371},[361,3757,596],{"class":371},[361,3759,2134],{"class":371},[361,3761,2066],{"class":399},[361,3763,2129],{"class":371},[361,3765,648],{"class":371},[361,3767,3768,3770,3772,3774,3776,3778,3780,3782],{"class":363,"line":933},[361,3769,2275],{"class":371},[361,3771,2406],{"class":1033},[361,3773,2129],{"class":371},[361,3775,596],{"class":371},[361,3777,2134],{"class":371},[361,3779,2851],{"class":399},[361,3781,2129],{"class":371},[361,3783,630],{"class":371},[361,3785,3786,3788,3790,3792,3794,3796,3798,3800],{"class":363,"line":938},[361,3787,2275],{"class":371},[361,3789,2425],{"class":1033},[361,3791,2129],{"class":371},[361,3793,596],{"class":371},[361,3795,2134],{"class":371},[361,3797,3379],{"class":399},[361,3799,2129],{"class":371},[361,3801,630],{"class":371},[361,3803,3804,3806,3808,3810,3812,3814],{"class":363,"line":956},[361,3805,2275],{"class":371},[361,3807,2444],{"class":1033},[361,3809,2129],{"class":371},[361,3811,596],{"class":371},[361,3813,2451],{"class":2215},[361,3815,630],{"class":371},[361,3817,3818,3820,3822,3824,3826,3828,3831,3833],{"class":363,"line":1283},[361,3819,2275],{"class":371},[361,3821,2460],{"class":1033},[361,3823,2129],{"class":371},[361,3825,596],{"class":371},[361,3827,2134],{"class":371},[361,3829,3830],{"class":399},"ak_d12c3a4f5b6e7d8c",[361,3832,2129],{"class":371},[361,3834,630],{"class":371},[361,3836,3837,3839,3841,3843,3845],{"class":363,"line":1298},[361,3838,2275],{"class":371},[361,3840,2480],{"class":1033},[361,3842,2129],{"class":371},[361,3844,596],{"class":371},[361,3846,484],{"class":371},[361,3848,3849,3851,3853,3855,3857,3859,3861,3863],{"class":363,"line":1305},[361,3850,2491],{"class":371},[361,3852,2245],{"class":2215},[361,3854,2129],{"class":371},[361,3856,596],{"class":371},[361,3858,2134],{"class":371},[361,3860,3642],{"class":399},[361,3862,2129],{"class":371},[361,3864,630],{"class":371},[361,3866,3867,3869,3871,3873,3875,3877,3879],{"class":363,"line":1310},[361,3868,2491],{"class":371},[361,3870,2512],{"class":2215},[361,3872,2129],{"class":371},[361,3874,596],{"class":371},[361,3876,2134],{"class":371},[361,3878,2521],{"class":399},[361,3880,2544],{"class":371},[361,3882,3883],{"class":363,"line":1336},[361,3884,2550],{"class":371},[361,3886,3887],{"class":363,"line":2547},[361,3888,2556],{"class":371},[361,3890,3891],{"class":363,"line":2553},[361,3892,2562],{"class":371},[307,3894,3895,3896,596],{},"For non-request contexts (jobs, scripts, CLIs), use the standalone ",[316,3897,3898],{},"audit()",[665,3900,3901,4039],{},[351,3902,3905],{"className":353,"code":3903,"filename":3904,"language":356,"meta":357,"style":357},"import { audit } from 'evlog'\n\naudit({\n  action: 'cron.cleanup',\n  actor: { type: 'system', id: 'cron' },\n  target: { type: 'job', id: 'cleanup-stale-sessions' },\n  outcome: 'success',\n})\n","scripts\u002Fcleanup.ts",[316,3906,3907,3925,3929,3937,3952,3985,4019,4033],{"__ignoreMap":357},[361,3908,3909,3911,3913,3915,3917,3919,3921,3923],{"class":363,"line":364},[361,3910,368],{"class":367},[361,3912,372],{"class":371},[361,3914,1964],{"class":375},[361,3916,390],{"class":371},[361,3918,393],{"class":367},[361,3920,396],{"class":371},[361,3922,400],{"class":399},[361,3924,403],{"class":371},[361,3926,3927],{"class":363,"line":406},[361,3928,452],{"emptyLinePlaceholder":451},[361,3930,3931,3933,3935],{"class":363,"line":427},[361,3932,318],{"class":464},[361,3934,468],{"class":375},[361,3936,791],{"class":371},[361,3938,3939,3941,3943,3945,3948,3950],{"class":363,"line":448},[361,3940,1991],{"class":503},[361,3942,596],{"class":371},[361,3944,396],{"class":371},[361,3946,3947],{"class":399},"cron.cleanup",[361,3949,506],{"class":371},[361,3951,630],{"class":371},[361,3953,3954,3956,3958,3960,3962,3964,3966,3968,3970,3972,3974,3976,3978,3981,3983],{"class":363,"line":455},[361,3955,2006],{"class":503},[361,3957,596],{"class":371},[361,3959,372],{"class":371},[361,3961,819],{"class":503},[361,3963,596],{"class":371},[361,3965,396],{"class":371},[361,3967,2019],{"class":399},[361,3969,506],{"class":371},[361,3971,379],{"class":371},[361,3973,833],{"class":503},[361,3975,596],{"class":371},[361,3977,396],{"class":371},[361,3979,3980],{"class":399},"cron",[361,3982,506],{"class":371},[361,3984,648],{"class":371},[361,3986,3987,3989,3991,3993,3995,3997,3999,4002,4004,4006,4008,4010,4012,4015,4017],{"class":363,"line":487},[361,3988,2041],{"class":503},[361,3990,596],{"class":371},[361,3992,372],{"class":371},[361,3994,819],{"class":503},[361,3996,596],{"class":371},[361,3998,396],{"class":371},[361,4000,4001],{"class":399},"job",[361,4003,506],{"class":371},[361,4005,379],{"class":371},[361,4007,833],{"class":503},[361,4009,596],{"class":371},[361,4011,396],{"class":371},[361,4013,4014],{"class":399},"cleanup-stale-sessions",[361,4016,506],{"class":371},[361,4018,648],{"class":371},[361,4020,4021,4023,4025,4027,4029,4031],{"class":363,"line":521},[361,4022,2075],{"class":503},[361,4024,596],{"class":371},[361,4026,396],{"class":371},[361,4028,903],{"class":399},[361,4030,506],{"class":371},[361,4032,630],{"class":371},[361,4034,4035,4037],{"class":363,"line":549},[361,4036,660],{"class":371},[361,4038,663],{"class":375},[351,4040,4042],{"className":2110,"code":4041,"filename":2112,"language":1319,"meta":357,"style":357},"{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"audit\": {\n    \"action\": \"cron.cleanup\",\n    \"actor\": { \"type\": \"system\", \"id\": \"cron\" },\n    \"target\": { \"type\": \"job\", \"id\": \"cleanup-stale-sessions\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_2b8e1f9d4c6a7b3e\"\n  }\n}\n",[316,4043,4044,4048,4066,4084,4096,4114,4158,4202,4220,4234,4251,4255],{"__ignoreMap":357},[361,4045,4046],{"class":363,"line":364},[361,4047,791],{"class":371},[361,4049,4050,4052,4054,4056,4058,4060,4062,4064],{"class":363,"line":406},[361,4051,2123],{"class":371},[361,4053,2126],{"class":480},[361,4055,2129],{"class":371},[361,4057,596],{"class":371},[361,4059,2134],{"class":371},[361,4061,2137],{"class":399},[361,4063,2129],{"class":371},[361,4065,630],{"class":371},[361,4067,4068,4070,4072,4074,4076,4078,4080,4082],{"class":363,"line":427},[361,4069,2123],{"class":371},[361,4071,2148],{"class":480},[361,4073,2129],{"class":371},[361,4075,596],{"class":371},[361,4077,2134],{"class":371},[361,4079,2157],{"class":399},[361,4081,2129],{"class":371},[361,4083,630],{"class":371},[361,4085,4086,4088,4090,4092,4094],{"class":363,"line":448},[361,4087,2123],{"class":371},[361,4089,318],{"class":480},[361,4091,2129],{"class":371},[361,4093,596],{"class":371},[361,4095,484],{"class":371},[361,4097,4098,4100,4102,4104,4106,4108,4110,4112],{"class":363,"line":455},[361,4099,2275],{"class":371},[361,4101,2278],{"class":1033},[361,4103,2129],{"class":371},[361,4105,596],{"class":371},[361,4107,2134],{"class":371},[361,4109,3947],{"class":399},[361,4111,2129],{"class":371},[361,4113,630],{"class":371},[361,4115,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136,4138,4140,4142,4144,4146,4148,4150,4152,4154,4156],{"class":363,"line":487},[361,4117,2275],{"class":371},[361,4119,2297],{"class":1033},[361,4121,2129],{"class":371},[361,4123,596],{"class":371},[361,4125,372],{"class":371},[361,4127,2134],{"class":371},[361,4129,2308],{"class":2215},[361,4131,2129],{"class":371},[361,4133,596],{"class":371},[361,4135,2134],{"class":371},[361,4137,2019],{"class":399},[361,4139,2129],{"class":371},[361,4141,379],{"class":371},[361,4143,2134],{"class":371},[361,4145,768],{"class":2215},[361,4147,2129],{"class":371},[361,4149,596],{"class":371},[361,4151,2134],{"class":371},[361,4153,3980],{"class":399},[361,4155,2129],{"class":371},[361,4157,648],{"class":371},[361,4159,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188,4190,4192,4194,4196,4198,4200],{"class":363,"line":521},[361,4161,2275],{"class":371},[361,4163,2361],{"class":1033},[361,4165,2129],{"class":371},[361,4167,596],{"class":371},[361,4169,372],{"class":371},[361,4171,2134],{"class":371},[361,4173,2308],{"class":2215},[361,4175,2129],{"class":371},[361,4177,596],{"class":371},[361,4179,2134],{"class":371},[361,4181,4001],{"class":399},[361,4183,2129],{"class":371},[361,4185,379],{"class":371},[361,4187,2134],{"class":371},[361,4189,768],{"class":2215},[361,4191,2129],{"class":371},[361,4193,596],{"class":371},[361,4195,2134],{"class":371},[361,4197,4014],{"class":399},[361,4199,2129],{"class":371},[361,4201,648],{"class":371},[361,4203,4204,4206,4208,4210,4212,4214,4216,4218],{"class":363,"line":549},[361,4205,2275],{"class":371},[361,4207,2406],{"class":1033},[361,4209,2129],{"class":371},[361,4211,596],{"class":371},[361,4213,2134],{"class":371},[361,4215,903],{"class":399},[361,4217,2129],{"class":371},[361,4219,630],{"class":371},[361,4221,4222,4224,4226,4228,4230,4232],{"class":363,"line":577},[361,4223,2275],{"class":371},[361,4225,2444],{"class":1033},[361,4227,2129],{"class":371},[361,4229,596],{"class":371},[361,4231,2451],{"class":2215},[361,4233,630],{"class":371},[361,4235,4236,4238,4240,4242,4244,4246,4249],{"class":363,"line":633},[361,4237,2275],{"class":371},[361,4239,2460],{"class":1033},[361,4241,2129],{"class":371},[361,4243,596],{"class":371},[361,4245,2134],{"class":371},[361,4247,4248],{"class":399},"ak_2b8e1f9d4c6a7b3e",[361,4250,2544],{"class":371},[361,4252,4253],{"class":363,"line":651},[361,4254,2556],{"class":371},[361,4256,4257],{"class":363,"line":657},[361,4258,2562],{"class":371},[4260,4261,4262,4263,4265,4266,4268,4269,4268,4272,4274,4275,4278],"note",{},"Standalone ",[316,4264,3898],{}," events have no ",[316,4267,2245],{},", no ",[316,4270,4271],{},"context.ip",[316,4273,2532],{}," — there is no request to enrich from. Add your own context manually (",[316,4276,4277],{},"context: { jobId, queue, runId }",") when it matters for forensics.",[3134,4280,4282],{"id":4281},"enricher","Enricher",[307,4284,4285,4288,4289,4292],{},[316,4286,4287],{},"auditEnricher()"," populates ",[316,4290,4291],{},"event.audit.context.{requestId, traceId, ip, userAgent, tenantId}",". Skip it and ship a custom enricher if your strategy differs.",[351,4294,4296],{"className":353,"code":4295,"language":356,"meta":357,"style":357},"nitro.hooks.hook('evlog:enrich', auditEnricher({\n  tenantId: ctx => ctx.event.tenant as string | undefined,\n  bridge: { getSession: async ctx => readSessionActor(ctx.headers) },\n}))\n",[316,4297,4298,4326,4361,4394],{"__ignoreMap":357},[361,4299,4300,4302,4304,4306,4308,4310,4312,4314,4316,4318,4320,4322,4324],{"class":363,"line":364},[361,4301,474],{"class":375},[361,4303,323],{"class":371},[361,4305,495],{"class":375},[361,4307,323],{"class":371},[361,4309,500],{"class":464},[361,4311,468],{"class":375},[361,4313,506],{"class":371},[361,4315,509],{"class":399},[361,4317,506],{"class":371},[361,4319,379],{"class":371},[361,4321,376],{"class":464},[361,4323,468],{"class":375},[361,4325,791],{"class":371},[361,4327,4328,4331,4333,4336,4338,4340,4342,4344,4346,4349,4352,4354,4356,4359],{"class":363,"line":406},[361,4329,4330],{"class":464},"  tenantId",[361,4332,596],{"class":371},[361,4334,4335],{"class":473}," ctx",[361,4337,481],{"class":480},[361,4339,4335],{"class":375},[361,4341,323],{"class":371},[361,4343,692],{"class":375},[361,4345,323],{"class":371},[361,4347,4348],{"class":375},"tenant ",[361,4350,4351],{"class":367},"as",[361,4353,2651],{"class":1033},[361,4355,2679],{"class":371},[361,4357,4358],{"class":1033}," undefined",[361,4360,630],{"class":371},[361,4362,4363,4366,4368,4370,4373,4375,4377,4379,4381,4384,4387,4389,4392],{"class":363,"line":427},[361,4364,4365],{"class":503},"  bridge",[361,4367,596],{"class":371},[361,4369,372],{"class":371},[361,4371,4372],{"class":464}," getSession",[361,4374,596],{"class":371},[361,4376,1068],{"class":480},[361,4378,4335],{"class":473},[361,4380,481],{"class":480},[361,4382,4383],{"class":464}," readSessionActor",[361,4385,4386],{"class":375},"(ctx",[361,4388,323],{"class":371},[361,4390,4391],{"class":375},"headers) ",[361,4393,3212],{"class":371},[361,4395,4396,4398],{"class":363,"line":448},[361,4397,660],{"class":371},[361,4399,773],{"class":375},[3134,4401,4403],{"id":4402},"drain-wrappers","Drain Wrappers",[337,4405,4406,4409,4410,4413,4414,4417,4418,4421],{},[311,4407,4408],{},"Why filter audits to a separate sink?"," Three reasons: ",[311,4411,4412],{},"cost"," (audit volume is tiny next to product telemetry — keep them separate so retention costs don't explode), ",[311,4415,4416],{},"permissions"," (the audit dataset should be read-only for engineers and write-only for the app), and ",[311,4419,4420],{},"retention"," (audits often live 7+ years; product logs rarely live more than 90 days).",[307,4423,4424,4427,4428,4430,4431,4434],{},[316,4425,4426],{},"auditOnly(drain)"," only forwards events with an ",[316,4429,318],{}," field. Compose with ",[311,4432,4433],{},"any"," drain:",[351,4436,4438],{"className":353,"code":4437,"language":356,"meta":357,"style":357},"import { auditOnly } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\n\u002F\u002F Send audits to a dedicated Axiom dataset:\nnitro.hooks.hook('evlog:drain', auditOnly(\n  createAxiomDrain({ dataset: 'audit', token: process.env.AXIOM_AUDIT_TOKEN }),\n))\n",[316,4439,4440,4458,4476,4480,4485,4511,4557],{"__ignoreMap":357},[361,4441,4442,4444,4446,4448,4450,4452,4454,4456],{"class":363,"line":364},[361,4443,368],{"class":367},[361,4445,372],{"class":371},[361,4447,382],{"class":375},[361,4449,390],{"class":371},[361,4451,393],{"class":367},[361,4453,396],{"class":371},[361,4455,400],{"class":399},[361,4457,403],{"class":371},[361,4459,4460,4462,4464,4466,4468,4470,4472,4474],{"class":363,"line":406},[361,4461,368],{"class":367},[361,4463,372],{"class":371},[361,4465,413],{"class":375},[361,4467,390],{"class":371},[361,4469,393],{"class":367},[361,4471,396],{"class":371},[361,4473,422],{"class":399},[361,4475,403],{"class":371},[361,4477,4478],{"class":363,"line":427},[361,4479,452],{"emptyLinePlaceholder":451},[361,4481,4482],{"class":363,"line":448},[361,4483,4484],{"class":2654},"\u002F\u002F Send audits to a dedicated Axiom dataset:\n",[361,4486,4487,4489,4491,4493,4495,4497,4499,4501,4503,4505,4507,4509],{"class":363,"line":455},[361,4488,474],{"class":375},[361,4490,323],{"class":371},[361,4492,495],{"class":375},[361,4494,323],{"class":371},[361,4496,500],{"class":464},[361,4498,468],{"class":375},[361,4500,506],{"class":371},[361,4502,538],{"class":399},[361,4504,506],{"class":371},[361,4506,379],{"class":371},[361,4508,382],{"class":464},[361,4510,574],{"class":375},[361,4512,4513,4516,4518,4520,4523,4525,4527,4529,4531,4533,4536,4538,4541,4543,4546,4548,4551,4553,4555],{"class":363,"line":487},[361,4514,4515],{"class":464},"  createAxiomDrain",[361,4517,468],{"class":375},[361,4519,590],{"class":371},[361,4521,4522],{"class":503}," dataset",[361,4524,596],{"class":371},[361,4526,396],{"class":371},[361,4528,318],{"class":399},[361,4530,506],{"class":371},[361,4532,379],{"class":371},[361,4534,4535],{"class":503}," token",[361,4537,596],{"class":371},[361,4539,4540],{"class":375}," process",[361,4542,323],{"class":371},[361,4544,4545],{"class":375},"env",[361,4547,323],{"class":371},[361,4549,4550],{"class":375},"AXIOM_AUDIT_TOKEN ",[361,4552,660],{"class":371},[361,4554,477],{"class":375},[361,4556,630],{"class":371},[361,4558,4559],{"class":363,"line":521},[361,4560,773],{"class":375},[307,4562,4563,4564,4567],{},"Set ",[316,4565,4566],{},"await: true"," to make audit writes synchronous (no fire-and-forget for audits — crash-safe by default):",[351,4569,4571],{"className":353,"code":4570,"language":356,"meta":357,"style":357},"auditOnly(createFsDrain({ dir: '.audit' }), { await: true })\n",[316,4572,4573],{"__ignoreMap":357},[361,4574,4575,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599,4601,4603,4605,4607,4609,4611],{"class":363,"line":364},[361,4576,3127],{"class":464},[361,4578,468],{"class":375},[361,4580,585],{"class":464},[361,4582,468],{"class":375},[361,4584,590],{"class":371},[361,4586,593],{"class":503},[361,4588,596],{"class":371},[361,4590,396],{"class":371},[361,4592,601],{"class":399},[361,4594,506],{"class":371},[361,4596,390],{"class":371},[361,4598,477],{"class":375},[361,4600,379],{"class":371},[361,4602,372],{"class":371},[361,4604,639],{"class":503},[361,4606,596],{"class":371},[361,4608,645],{"class":644},[361,4610,390],{"class":371},[361,4612,663],{"class":375},[307,4614,4615,4618],{},[316,4616,4617],{},"signed(drain, opts)"," adds tamper-evident integrity. Strategies:",[2567,4620,4621,4631],{},[2570,4622,4623,4626,4627,4630],{},[316,4624,4625],{},"'hmac'"," — adds ",[316,4628,4629],{},"event.audit.signature"," (HMAC of the canonical event).",[2570,4632,4633,4626,4636,4639,4640,4643,4644,4647],{},[316,4634,4635],{},"'hash-chain'",[316,4637,4638],{},"event.audit.prevHash"," and ",[316,4641,4642],{},"event.audit.hash"," so the sequence forms a verifiable chain. Provide ",[316,4645,4646],{},"state: { load, save }"," for cross-process \u002F durable chains (Redis, file, Postgres).",[337,4649,4650,4657,4658,4661,4662,4664],{},[311,4651,4652,4653,4656],{},"What ",[316,4654,4655],{},"signed()"," actually buys you."," Detection, not prevention. Anyone with write access to the underlying sink can still nuke the file or table — but the chain proves ",[2612,4659,4660],{},"which"," events were dropped or modified after the fact. Skip ",[316,4663,4655],{}," if you already write to an append-only \u002F WORM store (S3 Object Lock, Postgres with row-level immutability, BigQuery append-only tables); doubling integrity layers just adds latency without raising the bar.",[351,4666,4668],{"className":353,"code":4667,"language":356,"meta":357,"style":357},"import { signed } from 'evlog'\n\nsigned(drain, { strategy: 'hmac', secret: process.env.AUDIT_SECRET! })\n\nsigned(drain, {\n  strategy: 'hash-chain',\n  state: {\n    load: () => fs.readFile('.audit\u002Fhead', 'utf8').catch(() => null),\n    save: (h) => fs.writeFile('.audit\u002Fhead', h),\n  },\n})\n",[316,4669,4670,4688,4692,4738,4742,4752,4767,4776,4835,4873,4878],{"__ignoreMap":357},[361,4671,4672,4674,4676,4678,4680,4682,4684,4686],{"class":363,"line":364},[361,4673,368],{"class":367},[361,4675,372],{"class":371},[361,4677,387],{"class":375},[361,4679,390],{"class":371},[361,4681,393],{"class":367},[361,4683,396],{"class":371},[361,4685,400],{"class":399},[361,4687,403],{"class":371},[361,4689,4690],{"class":363,"line":406},[361,4691,452],{"emptyLinePlaceholder":451},[361,4693,4694,4696,4699,4701,4703,4705,4707,4709,4712,4714,4716,4719,4721,4723,4725,4727,4729,4732,4734,4736],{"class":363,"line":427},[361,4695,3131],{"class":464},[361,4697,4698],{"class":375},"(drain",[361,4700,379],{"class":371},[361,4702,372],{"class":371},[361,4704,614],{"class":503},[361,4706,596],{"class":371},[361,4708,396],{"class":371},[361,4710,4711],{"class":399},"hmac",[361,4713,506],{"class":371},[361,4715,379],{"class":371},[361,4717,4718],{"class":503}," secret",[361,4720,596],{"class":371},[361,4722,4540],{"class":375},[361,4724,323],{"class":371},[361,4726,4545],{"class":375},[361,4728,323],{"class":371},[361,4730,4731],{"class":375},"AUDIT_SECRET",[361,4733,3347],{"class":371},[361,4735,390],{"class":371},[361,4737,663],{"class":375},[361,4739,4740],{"class":363,"line":448},[361,4741,452],{"emptyLinePlaceholder":451},[361,4743,4744,4746,4748,4750],{"class":363,"line":455},[361,4745,3131],{"class":464},[361,4747,4698],{"class":375},[361,4749,379],{"class":371},[361,4751,484],{"class":371},[361,4753,4754,4757,4759,4761,4763,4765],{"class":363,"line":487},[361,4755,4756],{"class":503},"  strategy",[361,4758,596],{"class":371},[361,4760,396],{"class":371},[361,4762,621],{"class":399},[361,4764,506],{"class":371},[361,4766,630],{"class":371},[361,4768,4769,4772,4774],{"class":363,"line":521},[361,4770,4771],{"class":503},"  state",[361,4773,596],{"class":371},[361,4775,484],{"class":371},[361,4777,4778,4781,4783,4786,4788,4791,4793,4796,4798,4800,4803,4805,4807,4809,4812,4814,4816,4818,4821,4823,4826,4828,4831,4833],{"class":363,"line":549},[361,4779,4780],{"class":464},"    load",[361,4782,596],{"class":371},[361,4784,4785],{"class":371}," ()",[361,4787,481],{"class":480},[361,4789,4790],{"class":375}," fs",[361,4792,323],{"class":371},[361,4794,4795],{"class":464},"readFile",[361,4797,468],{"class":375},[361,4799,506],{"class":371},[361,4801,4802],{"class":399},".audit\u002Fhead",[361,4804,506],{"class":371},[361,4806,379],{"class":371},[361,4808,396],{"class":371},[361,4810,4811],{"class":399},"utf8",[361,4813,506],{"class":371},[361,4815,477],{"class":375},[361,4817,323],{"class":371},[361,4819,4820],{"class":464},"catch",[361,4822,468],{"class":375},[361,4824,4825],{"class":371},"()",[361,4827,481],{"class":480},[361,4829,4830],{"class":371}," null",[361,4832,477],{"class":375},[361,4834,630],{"class":371},[361,4836,4837,4840,4842,4844,4847,4849,4851,4853,4855,4858,4860,4862,4864,4866,4868,4871],{"class":363,"line":577},[361,4838,4839],{"class":464},"    save",[361,4841,596],{"class":371},[361,4843,689],{"class":371},[361,4845,4846],{"class":473},"h",[361,4848,477],{"class":371},[361,4850,481],{"class":480},[361,4852,4790],{"class":375},[361,4854,323],{"class":371},[361,4856,4857],{"class":464},"writeFile",[361,4859,468],{"class":375},[361,4861,506],{"class":371},[361,4863,4802],{"class":399},[361,4865,506],{"class":371},[361,4867,379],{"class":371},[361,4869,4870],{"class":375}," h)",[361,4872,630],{"class":371},[361,4874,4875],{"class":363,"line":633},[361,4876,4877],{"class":371},"  },\n",[361,4879,4880,4882],{"class":363,"line":651},[361,4881,660],{"class":371},[361,4883,663],{"class":375},[3134,4885,4887],{"id":4886},"schema-discipline","Schema Discipline",[307,4889,4890],{},"Define audit actions in one place to avoid magic strings:",[351,4892,4894],{"className":353,"code":4893,"language":356,"meta":357,"style":357},"import { defineAuditAction } from 'evlog'\n\nconst refund = defineAuditAction('invoice.refund', { target: 'invoice' })\n\nlog.audit(refund({\n  actor: { type: 'user', id: user.id },\n  target: { id: 'inv_889' }, \u002F\u002F type inferred as 'invoice'\n  outcome: 'success',\n}))\n",[316,4895,4896,4915,4919,4957,4961,4978,5010,5034,5048],{"__ignoreMap":357},[361,4897,4898,4900,4902,4905,4907,4909,4911,4913],{"class":363,"line":364},[361,4899,368],{"class":367},[361,4901,372],{"class":371},[361,4903,4904],{"class":375}," defineAuditAction",[361,4906,390],{"class":371},[361,4908,393],{"class":367},[361,4910,396],{"class":371},[361,4912,400],{"class":399},[361,4914,403],{"class":371},[361,4916,4917],{"class":363,"line":406},[361,4918,452],{"emptyLinePlaceholder":451},[361,4920,4921,4923,4926,4928,4930,4932,4934,4936,4938,4940,4942,4945,4947,4949,4951,4953,4955],{"class":363,"line":427},[361,4922,1016],{"class":480},[361,4924,4925],{"class":375}," refund ",[361,4927,1022],{"class":371},[361,4929,4904],{"class":464},[361,4931,468],{"class":375},[361,4933,506],{"class":371},[361,4935,803],{"class":399},[361,4937,506],{"class":371},[361,4939,379],{"class":371},[361,4941,372],{"class":371},[361,4943,4944],{"class":503}," target",[361,4946,596],{"class":371},[361,4948,396],{"class":371},[361,4950,875],{"class":399},[361,4952,506],{"class":371},[361,4954,390],{"class":371},[361,4956,663],{"class":375},[361,4958,4959],{"class":363,"line":448},[361,4960,452],{"emptyLinePlaceholder":451},[361,4962,4963,4965,4967,4969,4971,4974,4976],{"class":363,"line":455},[361,4964,1102],{"class":375},[361,4966,323],{"class":371},[361,4968,318],{"class":464},[361,4970,468],{"class":375},[361,4972,4973],{"class":464},"refund",[361,4975,468],{"class":375},[361,4977,791],{"class":371},[361,4979,4980,4982,4984,4986,4988,4990,4992,4994,4996,4998,5000,5002,5004,5006,5008],{"class":363,"line":487},[361,4981,2006],{"class":503},[361,4983,596],{"class":371},[361,4985,372],{"class":371},[361,4987,819],{"class":503},[361,4989,596],{"class":371},[361,4991,396],{"class":371},[361,4993,826],{"class":399},[361,4995,506],{"class":371},[361,4997,379],{"class":371},[361,4999,833],{"class":503},[361,5001,596],{"class":371},[361,5003,725],{"class":375},[361,5005,323],{"class":371},[361,5007,3209],{"class":375},[361,5009,3212],{"class":371},[361,5011,5012,5014,5016,5018,5020,5022,5024,5026,5028,5031],{"class":363,"line":521},[361,5013,2041],{"class":503},[361,5015,596],{"class":371},[361,5017,372],{"class":371},[361,5019,833],{"class":503},[361,5021,596],{"class":371},[361,5023,396],{"class":371},[361,5025,2066],{"class":399},[361,5027,506],{"class":371},[361,5029,5030],{"class":371}," },",[361,5032,5033],{"class":2654}," \u002F\u002F type inferred as 'invoice'\n",[361,5035,5036,5038,5040,5042,5044,5046],{"class":363,"line":549},[361,5037,2075],{"class":503},[361,5039,596],{"class":371},[361,5041,396],{"class":371},[361,5043,903],{"class":399},[361,5045,506],{"class":371},[361,5047,630],{"class":371},[361,5049,5050,5052],{"class":363,"line":577},[361,5051,660],{"class":371},[361,5053,773],{"class":375},[3077,5055,5056,5062,5063,5066,5067,5070,5071,5074,5075,5078,5079,5082,5083,5086,5087,5089],{},[311,5057,5058,5059,323],{},"Don't feed entire DB rows into ",[316,5060,5061],{},"auditDiff()"," Strip computed columns, hashed passwords, internal flags, and large JSON blobs before diffing. The point of ",[316,5064,5065],{},"changes"," is ",[2612,5068,5069],{},"what changed semantically"," (status went from ",[316,5072,5073],{},"paid"," → ",[316,5076,5077],{},"refunded","), not ",[2612,5080,5081],{},"what bytes changed"," (a ",[316,5084,5085],{},"lastModified"," timestamp ticked). A noisy ",[316,5088,5065],{}," field is the fastest way to make audit logs unreadable.",[307,5091,5092,5093,5095],{},"For mutating actions, use ",[316,5094,5061],{}," to produce a compact, redact-aware JSON Patch:",[665,5097,5098,5339],{},[351,5099,5101],{"className":353,"code":5100,"filename":3335,"language":356,"meta":357,"style":357},"import { auditDiff } from 'evlog'\n\nconst before = await db.users.byId(id)\nconst after = await db.users.update(id, patch)\n\nlog.audit({\n  action: 'user.update',\n  actor: { type: 'user', id: actorId },\n  target: { type: 'user', id },\n  outcome: 'success',\n  changes: auditDiff(before, after, { redactPaths: ['password', 'token'] }),\n})\n",[316,5102,5103,5122,5126,5153,5183,5187,5199,5214,5243,5268,5282,5333],{"__ignoreMap":357},[361,5104,5105,5107,5109,5112,5114,5116,5118,5120],{"class":363,"line":364},[361,5106,368],{"class":367},[361,5108,372],{"class":371},[361,5110,5111],{"class":375}," auditDiff",[361,5113,390],{"class":371},[361,5115,393],{"class":367},[361,5117,396],{"class":371},[361,5119,400],{"class":399},[361,5121,403],{"class":371},[361,5123,5124],{"class":363,"line":406},[361,5125,452],{"emptyLinePlaceholder":451},[361,5127,5128,5130,5133,5135,5137,5140,5142,5145,5147,5150],{"class":363,"line":427},[361,5129,1016],{"class":480},[361,5131,5132],{"class":375}," before ",[361,5134,1022],{"class":371},[361,5136,639],{"class":367},[361,5138,5139],{"class":375}," db",[361,5141,323],{"class":371},[361,5143,5144],{"class":375},"users",[361,5146,323],{"class":371},[361,5148,5149],{"class":464},"byId",[361,5151,5152],{"class":375},"(id)\n",[361,5154,5155,5157,5160,5162,5164,5166,5168,5170,5172,5175,5178,5180],{"class":363,"line":448},[361,5156,1016],{"class":480},[361,5158,5159],{"class":375}," after ",[361,5161,1022],{"class":371},[361,5163,639],{"class":367},[361,5165,5139],{"class":375},[361,5167,323],{"class":371},[361,5169,5144],{"class":375},[361,5171,323],{"class":371},[361,5173,5174],{"class":464},"update",[361,5176,5177],{"class":375},"(id",[361,5179,379],{"class":371},[361,5181,5182],{"class":375}," patch)\n",[361,5184,5185],{"class":363,"line":455},[361,5186,452],{"emptyLinePlaceholder":451},[361,5188,5189,5191,5193,5195,5197],{"class":363,"line":487},[361,5190,1102],{"class":375},[361,5192,323],{"class":371},[361,5194,318],{"class":464},[361,5196,468],{"class":375},[361,5198,791],{"class":371},[361,5200,5201,5203,5205,5207,5210,5212],{"class":363,"line":521},[361,5202,1991],{"class":503},[361,5204,596],{"class":371},[361,5206,396],{"class":371},[361,5208,5209],{"class":399},"user.update",[361,5211,506],{"class":371},[361,5213,630],{"class":371},[361,5215,5216,5218,5220,5222,5224,5226,5228,5230,5232,5234,5236,5238,5241],{"class":363,"line":549},[361,5217,2006],{"class":503},[361,5219,596],{"class":371},[361,5221,372],{"class":371},[361,5223,819],{"class":503},[361,5225,596],{"class":371},[361,5227,396],{"class":371},[361,5229,826],{"class":399},[361,5231,506],{"class":371},[361,5233,379],{"class":371},[361,5235,833],{"class":503},[361,5237,596],{"class":371},[361,5239,5240],{"class":375}," actorId ",[361,5242,3212],{"class":371},[361,5244,5245,5247,5249,5251,5253,5255,5257,5259,5261,5263,5266],{"class":363,"line":577},[361,5246,2041],{"class":503},[361,5248,596],{"class":371},[361,5250,372],{"class":371},[361,5252,819],{"class":503},[361,5254,596],{"class":371},[361,5256,396],{"class":371},[361,5258,826],{"class":399},[361,5260,506],{"class":371},[361,5262,379],{"class":371},[361,5264,5265],{"class":375}," id ",[361,5267,3212],{"class":371},[361,5269,5270,5272,5274,5276,5278,5280],{"class":363,"line":633},[361,5271,2075],{"class":503},[361,5273,596],{"class":371},[361,5275,396],{"class":371},[361,5277,903],{"class":399},[361,5279,506],{"class":371},[361,5281,630],{"class":371},[361,5283,5284,5286,5288,5290,5293,5295,5297,5299,5301,5304,5306,5308,5310,5313,5315,5317,5319,5322,5324,5327,5329,5331],{"class":363,"line":651},[361,5285,2866],{"class":503},[361,5287,596],{"class":371},[361,5289,5111],{"class":464},[361,5291,5292],{"class":375},"(before",[361,5294,379],{"class":371},[361,5296,2882],{"class":375},[361,5298,379],{"class":371},[361,5300,372],{"class":371},[361,5302,5303],{"class":503}," redactPaths",[361,5305,596],{"class":371},[361,5307,2806],{"class":375},[361,5309,506],{"class":371},[361,5311,5312],{"class":399},"password",[361,5314,506],{"class":371},[361,5316,379],{"class":371},[361,5318,396],{"class":371},[361,5320,5321],{"class":399},"token",[361,5323,506],{"class":371},[361,5325,5326],{"class":375},"] ",[361,5328,660],{"class":371},[361,5330,477],{"class":375},[361,5332,630],{"class":371},[361,5334,5335,5337],{"class":363,"line":657},[361,5336,660],{"class":371},[361,5338,663],{"class":375},[351,5340,5343],{"className":2110,"code":5341,"filename":5342,"language":1319,"meta":357,"style":357},"{\n  \"audit\": {\n    \"action\": \"user.update\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"user\", \"id\": \"usr_99\" },\n    \"outcome\": \"success\",\n    \"changes\": [\n      { \"op\": \"replace\", \"path\": \"\u002Femail\", \"from\": \"old@example.com\", \"to\": \"new@example.com\" },\n      { \"op\": \"replace\", \"path\": \"\u002Frole\", \"from\": \"member\", \"to\": \"admin\" },\n      { \"op\": \"replace\", \"path\": \"\u002Fpassword\", \"from\": \"[REDACTED]\", \"to\": \"[REDACTED]\" }\n    ],\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_5e7d8f9a0b1c2d3e\"\n  }\n}\n","Output — changes patch",[316,5344,5345,5349,5361,5379,5423,5468,5486,5499,5575,5646,5716,5721,5735,5752,5756],{"__ignoreMap":357},[361,5346,5347],{"class":363,"line":364},[361,5348,791],{"class":371},[361,5350,5351,5353,5355,5357,5359],{"class":363,"line":406},[361,5352,2123],{"class":371},[361,5354,318],{"class":480},[361,5356,2129],{"class":371},[361,5358,596],{"class":371},[361,5360,484],{"class":371},[361,5362,5363,5365,5367,5369,5371,5373,5375,5377],{"class":363,"line":427},[361,5364,2275],{"class":371},[361,5366,2278],{"class":1033},[361,5368,2129],{"class":371},[361,5370,596],{"class":371},[361,5372,2134],{"class":371},[361,5374,5209],{"class":399},[361,5376,2129],{"class":371},[361,5378,630],{"class":371},[361,5380,5381,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405,5407,5409,5411,5413,5415,5417,5419,5421],{"class":363,"line":448},[361,5382,2275],{"class":371},[361,5384,2297],{"class":1033},[361,5386,2129],{"class":371},[361,5388,596],{"class":371},[361,5390,372],{"class":371},[361,5392,2134],{"class":371},[361,5394,2308],{"class":2215},[361,5396,2129],{"class":371},[361,5398,596],{"class":371},[361,5400,2134],{"class":371},[361,5402,826],{"class":399},[361,5404,2129],{"class":371},[361,5406,379],{"class":371},[361,5408,2134],{"class":371},[361,5410,768],{"class":2215},[361,5412,2129],{"class":371},[361,5414,596],{"class":371},[361,5416,2134],{"class":371},[361,5418,2333],{"class":399},[361,5420,2129],{"class":371},[361,5422,648],{"class":371},[361,5424,5425,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445,5447,5449,5451,5453,5455,5457,5459,5461,5464,5466],{"class":363,"line":455},[361,5426,2275],{"class":371},[361,5428,2361],{"class":1033},[361,5430,2129],{"class":371},[361,5432,596],{"class":371},[361,5434,372],{"class":371},[361,5436,2134],{"class":371},[361,5438,2308],{"class":2215},[361,5440,2129],{"class":371},[361,5442,596],{"class":371},[361,5444,2134],{"class":371},[361,5446,826],{"class":399},[361,5448,2129],{"class":371},[361,5450,379],{"class":371},[361,5452,2134],{"class":371},[361,5454,768],{"class":2215},[361,5456,2129],{"class":371},[361,5458,596],{"class":371},[361,5460,2134],{"class":371},[361,5462,5463],{"class":399},"usr_99",[361,5465,2129],{"class":371},[361,5467,648],{"class":371},[361,5469,5470,5472,5474,5476,5478,5480,5482,5484],{"class":363,"line":487},[361,5471,2275],{"class":371},[361,5473,2406],{"class":1033},[361,5475,2129],{"class":371},[361,5477,596],{"class":371},[361,5479,2134],{"class":371},[361,5481,903],{"class":399},[361,5483,2129],{"class":371},[361,5485,630],{"class":371},[361,5487,5488,5490,5492,5494,5496],{"class":363,"line":521},[361,5489,2275],{"class":371},[361,5491,5065],{"class":1033},[361,5493,2129],{"class":371},[361,5495,596],{"class":371},[361,5497,5498],{"class":371}," [\n",[361,5500,5501,5504,5506,5509,5511,5513,5515,5518,5520,5522,5524,5526,5528,5530,5532,5535,5537,5539,5541,5544,5546,5548,5550,5553,5555,5557,5559,5562,5564,5566,5568,5571,5573],{"class":363,"line":549},[361,5502,5503],{"class":371},"      {",[361,5505,2134],{"class":371},[361,5507,5508],{"class":2215},"op",[361,5510,2129],{"class":371},[361,5512,596],{"class":371},[361,5514,2134],{"class":371},[361,5516,5517],{"class":399},"replace",[361,5519,2129],{"class":371},[361,5521,379],{"class":371},[361,5523,2134],{"class":371},[361,5525,2188],{"class":2215},[361,5527,2129],{"class":371},[361,5529,596],{"class":371},[361,5531,2134],{"class":371},[361,5533,5534],{"class":399},"\u002Femail",[361,5536,2129],{"class":371},[361,5538,379],{"class":371},[361,5540,2134],{"class":371},[361,5542,5543],{"class":2215},"from",[361,5545,2129],{"class":371},[361,5547,596],{"class":371},[361,5549,2134],{"class":371},[361,5551,5552],{"class":399},"old@example.com",[361,5554,2129],{"class":371},[361,5556,379],{"class":371},[361,5558,2134],{"class":371},[361,5560,5561],{"class":2215},"to",[361,5563,2129],{"class":371},[361,5565,596],{"class":371},[361,5567,2134],{"class":371},[361,5569,5570],{"class":399},"new@example.com",[361,5572,2129],{"class":371},[361,5574,648],{"class":371},[361,5576,5577,5579,5581,5583,5585,5587,5589,5591,5593,5595,5597,5599,5601,5603,5605,5608,5610,5612,5614,5616,5618,5620,5622,5625,5627,5629,5631,5633,5635,5637,5639,5642,5644],{"class":363,"line":577},[361,5578,5503],{"class":371},[361,5580,2134],{"class":371},[361,5582,5508],{"class":2215},[361,5584,2129],{"class":371},[361,5586,596],{"class":371},[361,5588,2134],{"class":371},[361,5590,5517],{"class":399},[361,5592,2129],{"class":371},[361,5594,379],{"class":371},[361,5596,2134],{"class":371},[361,5598,2188],{"class":2215},[361,5600,2129],{"class":371},[361,5602,596],{"class":371},[361,5604,2134],{"class":371},[361,5606,5607],{"class":399},"\u002Frole",[361,5609,2129],{"class":371},[361,5611,379],{"class":371},[361,5613,2134],{"class":371},[361,5615,5543],{"class":2215},[361,5617,2129],{"class":371},[361,5619,596],{"class":371},[361,5621,2134],{"class":371},[361,5623,5624],{"class":399},"member",[361,5626,2129],{"class":371},[361,5628,379],{"class":371},[361,5630,2134],{"class":371},[361,5632,5561],{"class":2215},[361,5634,2129],{"class":371},[361,5636,596],{"class":371},[361,5638,2134],{"class":371},[361,5640,5641],{"class":399},"admin",[361,5643,2129],{"class":371},[361,5645,648],{"class":371},[361,5647,5648,5650,5652,5654,5656,5658,5660,5662,5664,5666,5668,5670,5672,5674,5676,5679,5681,5683,5685,5687,5689,5691,5693,5696,5698,5700,5702,5704,5706,5708,5710,5712,5714],{"class":363,"line":633},[361,5649,5503],{"class":371},[361,5651,2134],{"class":371},[361,5653,5508],{"class":2215},[361,5655,2129],{"class":371},[361,5657,596],{"class":371},[361,5659,2134],{"class":371},[361,5661,5517],{"class":399},[361,5663,2129],{"class":371},[361,5665,379],{"class":371},[361,5667,2134],{"class":371},[361,5669,2188],{"class":2215},[361,5671,2129],{"class":371},[361,5673,596],{"class":371},[361,5675,2134],{"class":371},[361,5677,5678],{"class":399},"\u002Fpassword",[361,5680,2129],{"class":371},[361,5682,379],{"class":371},[361,5684,2134],{"class":371},[361,5686,5543],{"class":2215},[361,5688,2129],{"class":371},[361,5690,596],{"class":371},[361,5692,2134],{"class":371},[361,5694,5695],{"class":399},"[REDACTED]",[361,5697,2129],{"class":371},[361,5699,379],{"class":371},[361,5701,2134],{"class":371},[361,5703,5561],{"class":2215},[361,5705,2129],{"class":371},[361,5707,596],{"class":371},[361,5709,2134],{"class":371},[361,5711,5695],{"class":399},[361,5713,2129],{"class":371},[361,5715,953],{"class":371},[361,5717,5718],{"class":363,"line":651},[361,5719,5720],{"class":371},"    ],\n",[361,5722,5723,5725,5727,5729,5731,5733],{"class":363,"line":657},[361,5724,2275],{"class":371},[361,5726,2444],{"class":1033},[361,5728,2129],{"class":371},[361,5730,596],{"class":371},[361,5732,2451],{"class":2215},[361,5734,630],{"class":371},[361,5736,5737,5739,5741,5743,5745,5747,5750],{"class":363,"line":933},[361,5738,2275],{"class":371},[361,5740,2460],{"class":1033},[361,5742,2129],{"class":371},[361,5744,596],{"class":371},[361,5746,2134],{"class":371},[361,5748,5749],{"class":399},"ak_5e7d8f9a0b1c2d3e",[361,5751,2544],{"class":371},[361,5753,5754],{"class":363,"line":938},[361,5755,2556],{"class":371},[361,5757,5758],{"class":363,"line":956},[361,5759,2562],{"class":371},[3134,5761,5763,5764],{"id":5762},"auto-instrumentation-with-withaudit","Auto-Instrumentation with ",[316,5765,3071],{},[307,5767,5768,5769,5771],{},"Devs forget to call ",[316,5770,3142],{},". Wrap the function and never miss a record:",[337,5773,5774,5777,5778,5781,5782,5784,5785,5788],{},[311,5775,5776],{},"When to wrap vs. call manually."," Wrap functions that are ",[2612,5779,5780],{},"pure audit-worthy actions"," (refund, delete, role change, password reset) — outcome resolution is automatic and you can't accidentally skip the call. Stick to manual ",[316,5783,3142],{}," when the audit is one of several decisions inside a larger handler, or when you need to emit the audit ",[2612,5786,5787],{},"before"," the action completes (e.g. \"user requested deletion\").",[665,5790,5791,6076,6279,6594],{},[351,5792,5794],{"className":353,"code":5793,"filename":3335,"language":356,"meta":357,"style":357},"import { withAudit, AuditDeniedError } from 'evlog'\n\nconst refundInvoice = withAudit(\n  { action: 'invoice.refund', target: input => ({ type: 'invoice', id: input.id }) },\n  async (input: { id: string }, ctx) => {\n    if (!ctx.actor) throw new AuditDeniedError('Anonymous refund denied')\n    return await db.invoices.refund(input.id)\n  },\n)\n\nawait refundInvoice({ id: 'inv_889' }, {\n  actor: { type: 'user', id: user.id },\n  correlationId: requestId,\n})\n",[316,5795,5796,5820,5824,5837,5896,5926,5962,5990,5994,5998,6002,6027,6059,6070],{"__ignoreMap":357},[361,5797,5798,5800,5802,5805,5807,5810,5812,5814,5816,5818],{"class":363,"line":364},[361,5799,368],{"class":367},[361,5801,372],{"class":371},[361,5803,5804],{"class":375}," withAudit",[361,5806,379],{"class":371},[361,5808,5809],{"class":375}," AuditDeniedError",[361,5811,390],{"class":371},[361,5813,393],{"class":367},[361,5815,396],{"class":371},[361,5817,400],{"class":399},[361,5819,403],{"class":371},[361,5821,5822],{"class":363,"line":406},[361,5823,452],{"emptyLinePlaceholder":451},[361,5825,5826,5828,5831,5833,5835],{"class":363,"line":427},[361,5827,1016],{"class":480},[361,5829,5830],{"class":375}," refundInvoice ",[361,5832,1022],{"class":371},[361,5834,5804],{"class":464},[361,5836,574],{"class":375},[361,5838,5839,5842,5844,5846,5848,5850,5852,5854,5856,5858,5861,5863,5865,5867,5869,5871,5873,5875,5877,5879,5881,5883,5885,5887,5889,5891,5894],{"class":363,"line":448},[361,5840,5841],{"class":371},"  {",[361,5843,3295],{"class":503},[361,5845,596],{"class":371},[361,5847,396],{"class":371},[361,5849,803],{"class":399},[361,5851,506],{"class":371},[361,5853,379],{"class":371},[361,5855,4944],{"class":464},[361,5857,596],{"class":371},[361,5859,5860],{"class":473}," input",[361,5862,481],{"class":480},[361,5864,689],{"class":375},[361,5866,590],{"class":371},[361,5868,819],{"class":503},[361,5870,596],{"class":371},[361,5872,396],{"class":371},[361,5874,875],{"class":399},[361,5876,506],{"class":371},[361,5878,379],{"class":371},[361,5880,833],{"class":503},[361,5882,596],{"class":371},[361,5884,5860],{"class":375},[361,5886,323],{"class":371},[361,5888,3209],{"class":375},[361,5890,660],{"class":371},[361,5892,5893],{"class":375},") ",[361,5895,3212],{"class":371},[361,5897,5898,5901,5903,5906,5908,5910,5912,5914,5916,5918,5920,5922,5924],{"class":363,"line":455},[361,5899,5900],{"class":480},"  async",[361,5902,689],{"class":371},[361,5904,5905],{"class":473},"input",[361,5907,596],{"class":371},[361,5909,372],{"class":371},[361,5911,833],{"class":503},[361,5913,596],{"class":371},[361,5915,2651],{"class":1033},[361,5917,5030],{"class":371},[361,5919,4335],{"class":473},[361,5921,477],{"class":371},[361,5923,481],{"class":480},[361,5925,484],{"class":371},[361,5927,5928,5931,5933,5935,5938,5940,5942,5944,5947,5949,5951,5953,5955,5958,5960],{"class":363,"line":487},[361,5929,5930],{"class":367},"    if",[361,5932,689],{"class":503},[361,5934,3347],{"class":371},[361,5936,5937],{"class":375},"ctx",[361,5939,323],{"class":371},[361,5941,2297],{"class":375},[361,5943,5893],{"class":503},[361,5945,5946],{"class":367},"throw",[361,5948,1025],{"class":371},[361,5950,5809],{"class":464},[361,5952,468],{"class":503},[361,5954,506],{"class":371},[361,5956,5957],{"class":399},"Anonymous refund denied",[361,5959,506],{"class":371},[361,5961,663],{"class":503},[361,5963,5964,5967,5969,5971,5973,5976,5978,5980,5982,5984,5986,5988],{"class":363,"line":521},[361,5965,5966],{"class":367},"    return",[361,5968,639],{"class":367},[361,5970,5139],{"class":375},[361,5972,323],{"class":371},[361,5974,5975],{"class":375},"invoices",[361,5977,323],{"class":371},[361,5979,4973],{"class":464},[361,5981,468],{"class":503},[361,5983,5905],{"class":375},[361,5985,323],{"class":371},[361,5987,768],{"class":375},[361,5989,663],{"class":503},[361,5991,5992],{"class":363,"line":549},[361,5993,4877],{"class":371},[361,5995,5996],{"class":363,"line":577},[361,5997,663],{"class":375},[361,5999,6000],{"class":363,"line":633},[361,6001,452],{"emptyLinePlaceholder":451},[361,6003,6004,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025],{"class":363,"line":651},[361,6005,6006],{"class":367},"await",[361,6008,752],{"class":464},[361,6010,468],{"class":375},[361,6012,590],{"class":371},[361,6014,833],{"class":503},[361,6016,596],{"class":371},[361,6018,396],{"class":371},[361,6020,2066],{"class":399},[361,6022,506],{"class":371},[361,6024,5030],{"class":371},[361,6026,484],{"class":371},[361,6028,6029,6031,6033,6035,6037,6039,6041,6043,6045,6047,6049,6051,6053,6055,6057],{"class":363,"line":657},[361,6030,2006],{"class":503},[361,6032,596],{"class":371},[361,6034,372],{"class":371},[361,6036,819],{"class":503},[361,6038,596],{"class":371},[361,6040,396],{"class":371},[361,6042,826],{"class":399},[361,6044,506],{"class":371},[361,6046,379],{"class":371},[361,6048,833],{"class":503},[361,6050,596],{"class":371},[361,6052,725],{"class":375},[361,6054,323],{"class":371},[361,6056,3209],{"class":375},[361,6058,3212],{"class":371},[361,6060,6061,6063,6065,6068],{"class":363,"line":933},[361,6062,2905],{"class":503},[361,6064,596],{"class":371},[361,6066,6067],{"class":375}," requestId",[361,6069,630],{"class":371},[361,6071,6072,6074],{"class":363,"line":938},[361,6073,660],{"class":371},[361,6075,663],{"class":375},[351,6077,6080],{"className":2110,"code":6078,"filename":6079,"language":1319,"meta":357,"style":357},"{\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n","Output — success",[316,6081,6082,6086,6098,6116,6160,6204,6222,6236,6254,6271,6275],{"__ignoreMap":357},[361,6083,6084],{"class":363,"line":364},[361,6085,791],{"class":371},[361,6087,6088,6090,6092,6094,6096],{"class":363,"line":406},[361,6089,2123],{"class":371},[361,6091,318],{"class":480},[361,6093,2129],{"class":371},[361,6095,596],{"class":371},[361,6097,484],{"class":371},[361,6099,6100,6102,6104,6106,6108,6110,6112,6114],{"class":363,"line":427},[361,6101,2275],{"class":371},[361,6103,2278],{"class":1033},[361,6105,2129],{"class":371},[361,6107,596],{"class":371},[361,6109,2134],{"class":371},[361,6111,803],{"class":399},[361,6113,2129],{"class":371},[361,6115,630],{"class":371},[361,6117,6118,6120,6122,6124,6126,6128,6130,6132,6134,6136,6138,6140,6142,6144,6146,6148,6150,6152,6154,6156,6158],{"class":363,"line":448},[361,6119,2275],{"class":371},[361,6121,2297],{"class":1033},[361,6123,2129],{"class":371},[361,6125,596],{"class":371},[361,6127,372],{"class":371},[361,6129,2134],{"class":371},[361,6131,2308],{"class":2215},[361,6133,2129],{"class":371},[361,6135,596],{"class":371},[361,6137,2134],{"class":371},[361,6139,826],{"class":399},[361,6141,2129],{"class":371},[361,6143,379],{"class":371},[361,6145,2134],{"class":371},[361,6147,768],{"class":2215},[361,6149,2129],{"class":371},[361,6151,596],{"class":371},[361,6153,2134],{"class":371},[361,6155,2333],{"class":399},[361,6157,2129],{"class":371},[361,6159,648],{"class":371},[361,6161,6162,6164,6166,6168,6170,6172,6174,6176,6178,6180,6182,6184,6186,6188,6190,6192,6194,6196,6198,6200,6202],{"class":363,"line":455},[361,6163,2275],{"class":371},[361,6165,2361],{"class":1033},[361,6167,2129],{"class":371},[361,6169,596],{"class":371},[361,6171,372],{"class":371},[361,6173,2134],{"class":371},[361,6175,2308],{"class":2215},[361,6177,2129],{"class":371},[361,6179,596],{"class":371},[361,6181,2134],{"class":371},[361,6183,875],{"class":399},[361,6185,2129],{"class":371},[361,6187,379],{"class":371},[361,6189,2134],{"class":371},[361,6191,768],{"class":2215},[361,6193,2129],{"class":371},[361,6195,596],{"class":371},[361,6197,2134],{"class":371},[361,6199,2066],{"class":399},[361,6201,2129],{"class":371},[361,6203,648],{"class":371},[361,6205,6206,6208,6210,6212,6214,6216,6218,6220],{"class":363,"line":487},[361,6207,2275],{"class":371},[361,6209,2406],{"class":1033},[361,6211,2129],{"class":371},[361,6213,596],{"class":371},[361,6215,2134],{"class":371},[361,6217,903],{"class":399},[361,6219,2129],{"class":371},[361,6221,630],{"class":371},[361,6223,6224,6226,6228,6230,6232,6234],{"class":363,"line":521},[361,6225,2275],{"class":371},[361,6227,2444],{"class":1033},[361,6229,2129],{"class":371},[361,6231,596],{"class":371},[361,6233,2451],{"class":2215},[361,6235,630],{"class":371},[361,6237,6238,6240,6242,6244,6246,6248,6250,6252],{"class":363,"line":549},[361,6239,2275],{"class":371},[361,6241,2460],{"class":1033},[361,6243,2129],{"class":371},[361,6245,596],{"class":371},[361,6247,2134],{"class":371},[361,6249,2469],{"class":399},[361,6251,2129],{"class":371},[361,6253,630],{"class":371},[361,6255,6256,6258,6261,6263,6265,6267,6269],{"class":363,"line":577},[361,6257,2275],{"class":371},[361,6259,6260],{"class":1033},"correlationId",[361,6262,2129],{"class":371},[361,6264,596],{"class":371},[361,6266,2134],{"class":371},[361,6268,2254],{"class":399},[361,6270,2544],{"class":371},[361,6272,6273],{"class":363,"line":633},[361,6274,2556],{"class":371},[361,6276,6277],{"class":363,"line":651},[361,6278,2562],{"class":371},[351,6280,6283],{"className":2110,"code":6281,"filename":6282,"language":1319,"meta":357,"style":357},"{\n  \"level\": \"error\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"failure\",\n    \"reason\": \"Stripe error: charge already refunded\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_4c5d6e7f8a9b0c1d\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  },\n  \"error\": {\n    \"name\": \"StripeError\",\n    \"message\": \"charge already refunded\",\n    \"stack\": \"...\"\n  }\n}\n","Output — failure",[316,6284,6285,6289,6308,6320,6338,6382,6426,6444,6463,6477,6496,6512,6516,6528,6548,6568,6586,6590],{"__ignoreMap":357},[361,6286,6287],{"class":363,"line":364},[361,6288,791],{"class":371},[361,6290,6291,6293,6295,6297,6299,6301,6304,6306],{"class":363,"line":406},[361,6292,2123],{"class":371},[361,6294,2126],{"class":480},[361,6296,2129],{"class":371},[361,6298,596],{"class":371},[361,6300,2134],{"class":371},[361,6302,6303],{"class":399},"error",[361,6305,2129],{"class":371},[361,6307,630],{"class":371},[361,6309,6310,6312,6314,6316,6318],{"class":363,"line":427},[361,6311,2123],{"class":371},[361,6313,318],{"class":480},[361,6315,2129],{"class":371},[361,6317,596],{"class":371},[361,6319,484],{"class":371},[361,6321,6322,6324,6326,6328,6330,6332,6334,6336],{"class":363,"line":448},[361,6323,2275],{"class":371},[361,6325,2278],{"class":1033},[361,6327,2129],{"class":371},[361,6329,596],{"class":371},[361,6331,2134],{"class":371},[361,6333,803],{"class":399},[361,6335,2129],{"class":371},[361,6337,630],{"class":371},[361,6339,6340,6342,6344,6346,6348,6350,6352,6354,6356,6358,6360,6362,6364,6366,6368,6370,6372,6374,6376,6378,6380],{"class":363,"line":455},[361,6341,2275],{"class":371},[361,6343,2297],{"class":1033},[361,6345,2129],{"class":371},[361,6347,596],{"class":371},[361,6349,372],{"class":371},[361,6351,2134],{"class":371},[361,6353,2308],{"class":2215},[361,6355,2129],{"class":371},[361,6357,596],{"class":371},[361,6359,2134],{"class":371},[361,6361,826],{"class":399},[361,6363,2129],{"class":371},[361,6365,379],{"class":371},[361,6367,2134],{"class":371},[361,6369,768],{"class":2215},[361,6371,2129],{"class":371},[361,6373,596],{"class":371},[361,6375,2134],{"class":371},[361,6377,2333],{"class":399},[361,6379,2129],{"class":371},[361,6381,648],{"class":371},[361,6383,6384,6386,6388,6390,6392,6394,6396,6398,6400,6402,6404,6406,6408,6410,6412,6414,6416,6418,6420,6422,6424],{"class":363,"line":487},[361,6385,2275],{"class":371},[361,6387,2361],{"class":1033},[361,6389,2129],{"class":371},[361,6391,596],{"class":371},[361,6393,372],{"class":371},[361,6395,2134],{"class":371},[361,6397,2308],{"class":2215},[361,6399,2129],{"class":371},[361,6401,596],{"class":371},[361,6403,2134],{"class":371},[361,6405,875],{"class":399},[361,6407,2129],{"class":371},[361,6409,379],{"class":371},[361,6411,2134],{"class":371},[361,6413,768],{"class":2215},[361,6415,2129],{"class":371},[361,6417,596],{"class":371},[361,6419,2134],{"class":371},[361,6421,2066],{"class":399},[361,6423,2129],{"class":371},[361,6425,648],{"class":371},[361,6427,6428,6430,6432,6434,6436,6438,6440,6442],{"class":363,"line":521},[361,6429,2275],{"class":371},[361,6431,2406],{"class":1033},[361,6433,2129],{"class":371},[361,6435,596],{"class":371},[361,6437,2134],{"class":371},[361,6439,2842],{"class":399},[361,6441,2129],{"class":371},[361,6443,630],{"class":371},[361,6445,6446,6448,6450,6452,6454,6456,6459,6461],{"class":363,"line":549},[361,6447,2275],{"class":371},[361,6449,2425],{"class":1033},[361,6451,2129],{"class":371},[361,6453,596],{"class":371},[361,6455,2134],{"class":371},[361,6457,6458],{"class":399},"Stripe error: charge already refunded",[361,6460,2129],{"class":371},[361,6462,630],{"class":371},[361,6464,6465,6467,6469,6471,6473,6475],{"class":363,"line":577},[361,6466,2275],{"class":371},[361,6468,2444],{"class":1033},[361,6470,2129],{"class":371},[361,6472,596],{"class":371},[361,6474,2451],{"class":2215},[361,6476,630],{"class":371},[361,6478,6479,6481,6483,6485,6487,6489,6492,6494],{"class":363,"line":633},[361,6480,2275],{"class":371},[361,6482,2460],{"class":1033},[361,6484,2129],{"class":371},[361,6486,596],{"class":371},[361,6488,2134],{"class":371},[361,6490,6491],{"class":399},"ak_4c5d6e7f8a9b0c1d",[361,6493,2129],{"class":371},[361,6495,630],{"class":371},[361,6497,6498,6500,6502,6504,6506,6508,6510],{"class":363,"line":651},[361,6499,2275],{"class":371},[361,6501,6260],{"class":1033},[361,6503,2129],{"class":371},[361,6505,596],{"class":371},[361,6507,2134],{"class":371},[361,6509,2254],{"class":399},[361,6511,2544],{"class":371},[361,6513,6514],{"class":363,"line":657},[361,6515,4877],{"class":371},[361,6517,6518,6520,6522,6524,6526],{"class":363,"line":933},[361,6519,2123],{"class":371},[361,6521,6303],{"class":480},[361,6523,2129],{"class":371},[361,6525,596],{"class":371},[361,6527,484],{"class":371},[361,6529,6530,6532,6535,6537,6539,6541,6544,6546],{"class":363,"line":938},[361,6531,2275],{"class":371},[361,6533,6534],{"class":1033},"name",[361,6536,2129],{"class":371},[361,6538,596],{"class":371},[361,6540,2134],{"class":371},[361,6542,6543],{"class":399},"StripeError",[361,6545,2129],{"class":371},[361,6547,630],{"class":371},[361,6549,6550,6552,6555,6557,6559,6561,6564,6566],{"class":363,"line":956},[361,6551,2275],{"class":371},[361,6553,6554],{"class":1033},"message",[361,6556,2129],{"class":371},[361,6558,596],{"class":371},[361,6560,2134],{"class":371},[361,6562,6563],{"class":399},"charge already refunded",[361,6565,2129],{"class":371},[361,6567,630],{"class":371},[361,6569,6570,6572,6575,6577,6579,6581,6584],{"class":363,"line":1283},[361,6571,2275],{"class":371},[361,6573,6574],{"class":1033},"stack",[361,6576,2129],{"class":371},[361,6578,596],{"class":371},[361,6580,2134],{"class":371},[361,6582,6583],{"class":399},"...",[361,6585,2544],{"class":371},[361,6587,6588],{"class":363,"line":1298},[361,6589,2556],{"class":371},[361,6591,6592],{"class":363,"line":1305},[361,6593,2562],{"class":371},[351,6595,6597],{"className":2110,"code":6596,"filename":3515,"language":1319,"meta":357,"style":357},"{\n  \"level\": \"warn\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"system\", \"id\": \"anonymous\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Anonymous refund denied\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n",[316,6598,6599,6603,6621,6633,6651,6696,6740,6758,6776,6790,6808,6824,6828],{"__ignoreMap":357},[361,6600,6601],{"class":363,"line":364},[361,6602,791],{"class":371},[361,6604,6605,6607,6609,6611,6613,6615,6617,6619],{"class":363,"line":406},[361,6606,2123],{"class":371},[361,6608,2126],{"class":480},[361,6610,2129],{"class":371},[361,6612,596],{"class":371},[361,6614,2134],{"class":371},[361,6616,3536],{"class":399},[361,6618,2129],{"class":371},[361,6620,630],{"class":371},[361,6622,6623,6625,6627,6629,6631],{"class":363,"line":427},[361,6624,2123],{"class":371},[361,6626,318],{"class":480},[361,6628,2129],{"class":371},[361,6630,596],{"class":371},[361,6632,484],{"class":371},[361,6634,6635,6637,6639,6641,6643,6645,6647,6649],{"class":363,"line":448},[361,6636,2275],{"class":371},[361,6638,2278],{"class":1033},[361,6640,2129],{"class":371},[361,6642,596],{"class":371},[361,6644,2134],{"class":371},[361,6646,803],{"class":399},[361,6648,2129],{"class":371},[361,6650,630],{"class":371},[361,6652,6653,6655,6657,6659,6661,6663,6665,6667,6669,6671,6673,6675,6677,6679,6681,6683,6685,6687,6689,6692,6694],{"class":363,"line":455},[361,6654,2275],{"class":371},[361,6656,2297],{"class":1033},[361,6658,2129],{"class":371},[361,6660,596],{"class":371},[361,6662,372],{"class":371},[361,6664,2134],{"class":371},[361,6666,2308],{"class":2215},[361,6668,2129],{"class":371},[361,6670,596],{"class":371},[361,6672,2134],{"class":371},[361,6674,2019],{"class":399},[361,6676,2129],{"class":371},[361,6678,379],{"class":371},[361,6680,2134],{"class":371},[361,6682,768],{"class":2215},[361,6684,2129],{"class":371},[361,6686,596],{"class":371},[361,6688,2134],{"class":371},[361,6690,6691],{"class":399},"anonymous",[361,6693,2129],{"class":371},[361,6695,648],{"class":371},[361,6697,6698,6700,6702,6704,6706,6708,6710,6712,6714,6716,6718,6720,6722,6724,6726,6728,6730,6732,6734,6736,6738],{"class":363,"line":487},[361,6699,2275],{"class":371},[361,6701,2361],{"class":1033},[361,6703,2129],{"class":371},[361,6705,596],{"class":371},[361,6707,372],{"class":371},[361,6709,2134],{"class":371},[361,6711,2308],{"class":2215},[361,6713,2129],{"class":371},[361,6715,596],{"class":371},[361,6717,2134],{"class":371},[361,6719,875],{"class":399},[361,6721,2129],{"class":371},[361,6723,379],{"class":371},[361,6725,2134],{"class":371},[361,6727,768],{"class":2215},[361,6729,2129],{"class":371},[361,6731,596],{"class":371},[361,6733,2134],{"class":371},[361,6735,2066],{"class":399},[361,6737,2129],{"class":371},[361,6739,648],{"class":371},[361,6741,6742,6744,6746,6748,6750,6752,6754,6756],{"class":363,"line":521},[361,6743,2275],{"class":371},[361,6745,2406],{"class":1033},[361,6747,2129],{"class":371},[361,6749,596],{"class":371},[361,6751,2134],{"class":371},[361,6753,2851],{"class":399},[361,6755,2129],{"class":371},[361,6757,630],{"class":371},[361,6759,6760,6762,6764,6766,6768,6770,6772,6774],{"class":363,"line":549},[361,6761,2275],{"class":371},[361,6763,2425],{"class":1033},[361,6765,2129],{"class":371},[361,6767,596],{"class":371},[361,6769,2134],{"class":371},[361,6771,5957],{"class":399},[361,6773,2129],{"class":371},[361,6775,630],{"class":371},[361,6777,6778,6780,6782,6784,6786,6788],{"class":363,"line":577},[361,6779,2275],{"class":371},[361,6781,2444],{"class":1033},[361,6783,2129],{"class":371},[361,6785,596],{"class":371},[361,6787,2451],{"class":2215},[361,6789,630],{"class":371},[361,6791,6792,6794,6796,6798,6800,6802,6804,6806],{"class":363,"line":633},[361,6793,2275],{"class":371},[361,6795,2460],{"class":1033},[361,6797,2129],{"class":371},[361,6799,596],{"class":371},[361,6801,2134],{"class":371},[361,6803,3830],{"class":399},[361,6805,2129],{"class":371},[361,6807,630],{"class":371},[361,6809,6810,6812,6814,6816,6818,6820,6822],{"class":363,"line":651},[361,6811,2275],{"class":371},[361,6813,6260],{"class":1033},[361,6815,2129],{"class":371},[361,6817,596],{"class":371},[361,6819,2134],{"class":371},[361,6821,2254],{"class":399},[361,6823,2544],{"class":371},[361,6825,6826],{"class":363,"line":657},[361,6827,2556],{"class":371},[361,6829,6830],{"class":363,"line":933},[361,6831,2562],{"class":371},[307,6833,6834],{},"Outcome resolution:",[2567,6836,6837,6846,6865],{},[2570,6838,6839,6842,6843,323],{},[316,6840,6841],{},"fn"," resolves → ",[316,6844,6845],{},"outcome: 'success'",[2570,6847,6848,6850,6851,6854,6855,6858,6859,6862,6863,323],{},[316,6849,6841],{}," throws an ",[316,6852,6853],{},"AuditDeniedError"," (or any error with ",[316,6856,6857],{},"status === 403",") → ",[316,6860,6861],{},"outcome: 'denied'",", error message becomes ",[316,6864,2425],{},[2570,6866,6867,6868,6871],{},"Other thrown errors → ",[316,6869,6870],{},"outcome: 'failure'",", then re-thrown.",[325,6873,6875],{"id":6874},"compliance","Compliance",[3134,6877,6879],{"id":6878},"integrity","Integrity",[307,6881,6882],{},"Hash-chain the audit log so any tampering is detectable. Each event's hash includes the previous hash, so deleting a row breaks the chain forward of that point.",[351,6884,6886],{"className":353,"code":6885,"language":356,"meta":357,"style":357},"auditOnly(\n  signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' }),\n  { await: true },\n)\n",[316,6887,6888,6894,6941,6953],{"__ignoreMap":357},[361,6889,6890,6892],{"class":363,"line":364},[361,6891,3127],{"class":464},[361,6893,574],{"class":375},[361,6895,6896,6899,6901,6903,6905,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925,6927,6929,6931,6933,6935,6937,6939],{"class":363,"line":406},[361,6897,6898],{"class":464},"  signed",[361,6900,468],{"class":375},[361,6902,585],{"class":464},[361,6904,468],{"class":375},[361,6906,590],{"class":371},[361,6908,593],{"class":503},[361,6910,596],{"class":371},[361,6912,396],{"class":371},[361,6914,601],{"class":399},[361,6916,506],{"class":371},[361,6918,390],{"class":371},[361,6920,477],{"class":375},[361,6922,379],{"class":371},[361,6924,372],{"class":371},[361,6926,614],{"class":503},[361,6928,596],{"class":371},[361,6930,396],{"class":371},[361,6932,621],{"class":399},[361,6934,506],{"class":371},[361,6936,390],{"class":371},[361,6938,477],{"class":375},[361,6940,630],{"class":371},[361,6942,6943,6945,6947,6949,6951],{"class":363,"line":427},[361,6944,5841],{"class":371},[361,6946,639],{"class":503},[361,6948,596],{"class":371},[361,6950,645],{"class":644},[361,6952,648],{"class":371},[361,6954,6955],{"class":363,"line":448},[361,6956,663],{"class":375},[4260,6958,6959,6960,6963,6964,6967,6968,323],{},"A CLI to walk and verify the chain (",[316,6961,6962],{},"evlog audit verify",") is on the roadmap. Until then, validate by recomputing the hashes of stored events and comparing each ",[316,6965,6966],{},"prevHash"," against the previous event's ",[316,6969,6970],{},"hash",[3077,6972,6973,6980,6981,6984,6985,6988,6989,6992],{},[311,6974,6975,6976,6979],{},"Rotate ",[316,6977,6978],{},"secret"," for HMAC-signed audits annually."," When you rotate, embed a key id alongside the signature (e.g. extend ",[316,6982,6983],{},"AuditFields"," with ",[316,6986,6987],{},"keyId"," via ",[316,6990,6991],{},"declare module",") so old events stay verifiable against the previous secret. Verifiers should look up the key by id, not assume a single global secret.",[3134,6994,6996],{"id":6995},"redact","Redact",[307,6998,6999,7000,7003],{},"Audit events run through your existing ",[316,7001,7002],{},"RedactConfig",". Compose with the strict audit preset to harden PII handling:",[351,7005,7007],{"className":353,"code":7006,"language":356,"meta":357,"style":357},"import { auditRedactPreset } from 'evlog'\n\ninitLogger({\n  redact: {\n    paths: [\n      ...(auditRedactPreset.paths ?? []),\n      'user.password',\n    ],\n  },\n})\n",[316,7008,7009,7028,7032,7041,7050,7059,7080,7092,7099,7103],{"__ignoreMap":357},[361,7010,7011,7013,7015,7018,7020,7022,7024,7026],{"class":363,"line":364},[361,7012,368],{"class":367},[361,7014,372],{"class":371},[361,7016,7017],{"class":375}," auditRedactPreset",[361,7019,390],{"class":371},[361,7021,393],{"class":367},[361,7023,396],{"class":371},[361,7025,400],{"class":399},[361,7027,403],{"class":371},[361,7029,7030],{"class":363,"line":406},[361,7031,452],{"emptyLinePlaceholder":451},[361,7033,7034,7037,7039],{"class":363,"line":427},[361,7035,7036],{"class":464},"initLogger",[361,7038,468],{"class":375},[361,7040,791],{"class":371},[361,7042,7043,7046,7048],{"class":363,"line":448},[361,7044,7045],{"class":503},"  redact",[361,7047,596],{"class":371},[361,7049,484],{"class":371},[361,7051,7052,7055,7057],{"class":363,"line":455},[361,7053,7054],{"class":503},"    paths",[361,7056,596],{"class":371},[361,7058,5498],{"class":375},[361,7060,7061,7064,7067,7069,7072,7075,7078],{"class":363,"line":487},[361,7062,7063],{"class":371},"      ...",[361,7065,7066],{"class":375},"(auditRedactPreset",[361,7068,323],{"class":371},[361,7070,7071],{"class":375},"paths ",[361,7073,7074],{"class":371},"??",[361,7076,7077],{"class":375}," [])",[361,7079,630],{"class":371},[361,7081,7082,7085,7088,7090],{"class":363,"line":521},[361,7083,7084],{"class":371},"      '",[361,7086,7087],{"class":399},"user.password",[361,7089,506],{"class":371},[361,7091,630],{"class":371},[361,7093,7094,7097],{"class":363,"line":549},[361,7095,7096],{"class":375},"    ]",[361,7098,630],{"class":371},[361,7100,7101],{"class":363,"line":577},[361,7102,4877],{"class":371},[361,7104,7105,7107],{"class":363,"line":633},[361,7106,660],{"class":371},[361,7108,663],{"class":375},[307,7110,7111,7112,7115,7116,7119,7120,2592,7122,2592,7124,2592,7127,2592,7130,2592,7133,7136,7137,4639,7140,323],{},"The preset drops ",[316,7113,7114],{},"Authorization"," \u002F ",[316,7117,7118],{},"Cookie"," headers and common credential field names (",[316,7121,5312],{},[316,7123,5321],{},[316,7125,7126],{},"apiKey",[316,7128,7129],{},"cardNumber",[316,7131,7132],{},"cvv",[316,7134,7135],{},"ssn",") wherever they appear inside ",[316,7138,7139],{},"audit.changes.before",[316,7141,7142],{},"audit.changes.after",[3134,7144,7146],{"id":7145},"gdpr-vs-append-only","GDPR vs Append-Only",[307,7148,7149],{},"Append-only audit logs collide with GDPR's right to be forgotten. Recommended pattern today:",[7151,7152,7153,7156,7159],"ol",{},[2570,7154,7155],{},"Keep audit rows immutable.",[2570,7157,7158],{},"Encrypt PII fields with a per-actor key (held outside the audit store).",[2570,7160,7161],{},"To \"forget\" a user, delete their key — the audit row stays, the chain stays valid, the PII becomes unreadable.",[307,7163,7164,7165,7168,7169,323],{},"A built-in ",[316,7166,7167],{},"cryptoShredding"," helper is on the ",[7170,7171,7175],"a",{"href":7172,"rel":7173},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Fissues",[7174],"nofollow","follow-up roadmap",[3134,7177,297],{"id":4420},[307,7179,7180],{},"Retention is a storage-layer concern by design. evlog's audit layer doesn't enforce retention windows because every supported sink already has a stronger, audited mechanism for it. Pick the one matching your sink:",[2567,7182,7183,7193,7202],{},[2570,7184,7185,7188,7189,7192],{},[311,7186,7187],{},"FS"," — combine ",[316,7190,7191],{},"createFsDrain({ maxFiles })"," with a daily compactor.",[2570,7194,7195,7198,7199,323],{},[311,7196,7197],{},"Postgres"," — schedule ",[316,7200,7201],{},"DELETE FROM audit_events WHERE timestamp \u003C now() - interval '7 years'",[2570,7203,7204,7207],{},[311,7205,7206],{},"Axiom \u002F Datadog \u002F Loki"," — set the dataset retention policy in the platform.",[307,7209,7210],{},"Document the chosen window in your security policy. Auditors care about the written rule, not the enforcing component.",[3134,7212,7214],{"id":7213},"common-pitfalls","Common Pitfalls",[2567,7216,7217,7229,7250,7256,7275],{},[2570,7218,7219,7222,7223,6984,7225,7228],{},[311,7220,7221],{},"Logging only successes."," Auditors care most about denials. Always pair ",[316,7224,3142],{},[316,7226,7227],{},"log.audit.deny()"," on the negative branch of every authorisation check.",[2570,7230,7231,7236,7237,7239,7240,7242,7243,2592,7245,2592,7247,7249],{},[311,7232,7233,7234,323],{},"Leaking PII through ",[316,7235,5065],{}," ",[316,7238,5061],{}," runs through your ",[316,7241,7002],{},", but only if the field paths are listed. Add ",[316,7244,5312],{},[316,7246,5321],{},[316,7248,7126],{},", etc. once globally so you never have to think about it again.",[2570,7251,7252,7255],{},[311,7253,7254],{},"Treating audits as observability."," Don't sample, downsample, or summarise audit events. Force-keep is on by default — don't disable it.",[2570,7257,7258,7236,7265,7267,7268,7115,7271,7274],{},[311,7259,7260,7261,7264],{},"Conflating ",[316,7262,7263],{},"actor.id"," with the session id.",[316,7266,7263],{}," is the stable user id (or system identity). Correlate sessions via ",[316,7269,7270],{},"context.requestId",[316,7272,7273],{},"context.traceId",", never via the actor.",[2570,7276,7277,7280,7281,7283,7284,7286],{},[311,7278,7279],{},"Forgetting standalone jobs."," Cron tasks, queue workers, and CLIs trigger audit-worthy actions too. Use ",[316,7282,3898],{}," (no request) or ",[316,7285,3071],{}," to keep coverage parity with your HTTP routes.",[325,7288,7290],{"id":7289},"recipes","Recipes",[3134,7292,7294],{"id":7293},"audit-logs-on-disk","Audit logs on disk",[665,7296,7297,7445],{},[351,7298,7301],{"className":353,"code":7299,"filename":7300,"language":356,"meta":357,"style":357},"import { auditOnly, signed } from 'evlog'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nnitro.hooks.hook('evlog:drain', auditOnly(\n  signed(createFsDrain({ dir: '.audit', maxFiles: 30 }), { strategy: 'hash-chain' }),\n  { await: true },\n))\n","Input — server\u002Fplugins\u002Fevlog.ts",[316,7302,7303,7325,7343,7347,7373,7429,7441],{"__ignoreMap":357},[361,7304,7305,7307,7309,7311,7313,7315,7317,7319,7321,7323],{"class":363,"line":364},[361,7306,368],{"class":367},[361,7308,372],{"class":371},[361,7310,382],{"class":375},[361,7312,379],{"class":371},[361,7314,387],{"class":375},[361,7316,390],{"class":371},[361,7318,393],{"class":367},[361,7320,396],{"class":371},[361,7322,400],{"class":399},[361,7324,403],{"class":371},[361,7326,7327,7329,7331,7333,7335,7337,7339,7341],{"class":363,"line":406},[361,7328,368],{"class":367},[361,7330,372],{"class":371},[361,7332,434],{"class":375},[361,7334,390],{"class":371},[361,7336,393],{"class":367},[361,7338,396],{"class":371},[361,7340,443],{"class":399},[361,7342,403],{"class":371},[361,7344,7345],{"class":363,"line":427},[361,7346,452],{"emptyLinePlaceholder":451},[361,7348,7349,7351,7353,7355,7357,7359,7361,7363,7365,7367,7369,7371],{"class":363,"line":448},[361,7350,474],{"class":375},[361,7352,323],{"class":371},[361,7354,495],{"class":375},[361,7356,323],{"class":371},[361,7358,500],{"class":464},[361,7360,468],{"class":375},[361,7362,506],{"class":371},[361,7364,538],{"class":399},[361,7366,506],{"class":371},[361,7368,379],{"class":371},[361,7370,382],{"class":464},[361,7372,574],{"class":375},[361,7374,7375,7377,7379,7381,7383,7385,7387,7389,7391,7393,7395,7397,7400,7402,7405,7407,7409,7411,7413,7415,7417,7419,7421,7423,7425,7427],{"class":363,"line":455},[361,7376,6898],{"class":464},[361,7378,468],{"class":375},[361,7380,585],{"class":464},[361,7382,468],{"class":375},[361,7384,590],{"class":371},[361,7386,593],{"class":503},[361,7388,596],{"class":371},[361,7390,396],{"class":371},[361,7392,601],{"class":399},[361,7394,506],{"class":371},[361,7396,379],{"class":371},[361,7398,7399],{"class":503}," maxFiles",[361,7401,596],{"class":371},[361,7403,7404],{"class":2215}," 30",[361,7406,390],{"class":371},[361,7408,477],{"class":375},[361,7410,379],{"class":371},[361,7412,372],{"class":371},[361,7414,614],{"class":503},[361,7416,596],{"class":371},[361,7418,396],{"class":371},[361,7420,621],{"class":399},[361,7422,506],{"class":371},[361,7424,390],{"class":371},[361,7426,477],{"class":375},[361,7428,630],{"class":371},[361,7430,7431,7433,7435,7437,7439],{"class":363,"line":487},[361,7432,5841],{"class":371},[361,7434,639],{"class":503},[361,7436,596],{"class":371},[361,7438,645],{"class":644},[361,7440,648],{"class":371},[361,7442,7443],{"class":363,"line":521},[361,7444,773],{"class":375},[351,7446,7451],{"className":7447,"code":7448,"filename":7449,"language":7450,"meta":357,"style":357},"language-ndjson shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\"audit\":{\"action\":\"invoice.refund\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"invoice\",\"id\":\"inv_889\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_8f3c4b2a1e5d6f7c\",\"prevHash\":null,\"hash\":\"3f2c8e1a...\"}}\n{\"audit\":{\"action\":\"user.update\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"user\",\"id\":\"usr_99\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_5e7d8f9a0b1c2d3e\",\"prevHash\":\"3f2c8e1a...\",\"hash\":\"9a1b4d7c...\"}}\n","Output — .audit\u002F2026-04-24.ndjson","ndjson",[316,7452,7453,7458],{"__ignoreMap":357},[361,7454,7455],{"class":363,"line":364},[361,7456,7457],{},"{\"audit\":{\"action\":\"invoice.refund\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"invoice\",\"id\":\"inv_889\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_8f3c4b2a1e5d6f7c\",\"prevHash\":null,\"hash\":\"3f2c8e1a...\"}}\n",[361,7459,7460],{"class":363,"line":406},[361,7461,7462],{},"{\"audit\":{\"action\":\"user.update\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"user\",\"id\":\"usr_99\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_5e7d8f9a0b1c2d3e\",\"prevHash\":\"3f2c8e1a...\",\"hash\":\"9a1b4d7c...\"}}\n",[307,7464,7465,7466,7468,7469,7471],{},"Each line's ",[316,7467,6966],{}," matches the previous line's ",[316,7470,6970],{},". Tampering with any row breaks the chain forward of that point — a verifier replays the hashes and reports the first mismatch.",[3134,7473,7475],{"id":7474},"audit-logs-to-a-dedicated-axiom-dataset","Audit logs to a dedicated Axiom dataset",[665,7477,7478,7636,7659],{},[351,7479,7481],{"className":353,"code":7480,"filename":7300,"language":356,"meta":357,"style":357},"import { auditOnly } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nnitro.hooks.hook('evlog:drain', createAxiomDrain({ dataset: 'logs' }))\nnitro.hooks.hook('evlog:drain', auditOnly(\n  createAxiomDrain({ dataset: 'audit', token: process.env.AXIOM_AUDIT_TOKEN }),\n))\n",[316,7482,7483,7501,7519,7523,7566,7592,7632],{"__ignoreMap":357},[361,7484,7485,7487,7489,7491,7493,7495,7497,7499],{"class":363,"line":364},[361,7486,368],{"class":367},[361,7488,372],{"class":371},[361,7490,382],{"class":375},[361,7492,390],{"class":371},[361,7494,393],{"class":367},[361,7496,396],{"class":371},[361,7498,400],{"class":399},[361,7500,403],{"class":371},[361,7502,7503,7505,7507,7509,7511,7513,7515,7517],{"class":363,"line":406},[361,7504,368],{"class":367},[361,7506,372],{"class":371},[361,7508,413],{"class":375},[361,7510,390],{"class":371},[361,7512,393],{"class":367},[361,7514,396],{"class":371},[361,7516,422],{"class":399},[361,7518,403],{"class":371},[361,7520,7521],{"class":363,"line":427},[361,7522,452],{"emptyLinePlaceholder":451},[361,7524,7525,7527,7529,7531,7533,7535,7537,7539,7541,7543,7545,7547,7549,7551,7553,7555,7557,7560,7562,7564],{"class":363,"line":448},[361,7526,474],{"class":375},[361,7528,323],{"class":371},[361,7530,495],{"class":375},[361,7532,323],{"class":371},[361,7534,500],{"class":464},[361,7536,468],{"class":375},[361,7538,506],{"class":371},[361,7540,538],{"class":399},[361,7542,506],{"class":371},[361,7544,379],{"class":371},[361,7546,413],{"class":464},[361,7548,468],{"class":375},[361,7550,590],{"class":371},[361,7552,4522],{"class":503},[361,7554,596],{"class":371},[361,7556,396],{"class":371},[361,7558,7559],{"class":399},"logs",[361,7561,506],{"class":371},[361,7563,390],{"class":371},[361,7565,773],{"class":375},[361,7567,7568,7570,7572,7574,7576,7578,7580,7582,7584,7586,7588,7590],{"class":363,"line":455},[361,7569,474],{"class":375},[361,7571,323],{"class":371},[361,7573,495],{"class":375},[361,7575,323],{"class":371},[361,7577,500],{"class":464},[361,7579,468],{"class":375},[361,7581,506],{"class":371},[361,7583,538],{"class":399},[361,7585,506],{"class":371},[361,7587,379],{"class":371},[361,7589,382],{"class":464},[361,7591,574],{"class":375},[361,7593,7594,7596,7598,7600,7602,7604,7606,7608,7610,7612,7614,7616,7618,7620,7622,7624,7626,7628,7630],{"class":363,"line":487},[361,7595,4515],{"class":464},[361,7597,468],{"class":375},[361,7599,590],{"class":371},[361,7601,4522],{"class":503},[361,7603,596],{"class":371},[361,7605,396],{"class":371},[361,7607,318],{"class":399},[361,7609,506],{"class":371},[361,7611,379],{"class":371},[361,7613,4535],{"class":503},[361,7615,596],{"class":371},[361,7617,4540],{"class":375},[361,7619,323],{"class":371},[361,7621,4545],{"class":375},[361,7623,323],{"class":371},[361,7625,4550],{"class":375},[361,7627,660],{"class":371},[361,7629,477],{"class":375},[361,7631,630],{"class":371},[361,7633,7634],{"class":363,"line":521},[361,7635,773],{"class":375},[351,7637,7642],{"className":7638,"code":7639,"filename":7640,"language":7641,"meta":357,"style":357},"language-kusto shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","['audit']\n| where audit.action == \"invoice.refund\"\n| summarize count() by audit.outcome, bin(_time, 1h)\n","Output — Axiom query","kusto",[316,7643,7644,7649,7654],{"__ignoreMap":357},[361,7645,7646],{"class":363,"line":364},[361,7647,7648],{},"['audit']\n",[361,7650,7651],{"class":363,"line":406},[361,7652,7653],{},"| where audit.action == \"invoice.refund\"\n",[361,7655,7656],{"class":363,"line":427},[361,7657,7658],{},"| summarize count() by audit.outcome, bin(_time, 1h)\n",[351,7660,7663],{"className":7638,"code":7661,"filename":7662,"language":7641,"meta":357,"style":357},"['audit']\n| where audit.outcome == \"denied\"\n| summarize count() by audit.actor.id, audit.action\n| order by count_ desc\n","Output — denials by actor",[316,7664,7665,7669,7674,7679],{"__ignoreMap":357},[361,7666,7667],{"class":363,"line":364},[361,7668,7648],{},[361,7670,7671],{"class":363,"line":406},[361,7672,7673],{},"| where audit.outcome == \"denied\"\n",[361,7675,7676],{"class":363,"line":427},[361,7677,7678],{},"| summarize count() by audit.actor.id, audit.action\n",[361,7680,7681],{"class":363,"line":448},[361,7682,7683],{},"| order by count_ desc\n",[307,7685,7686],{},"Splitting datasets means the audit dataset can have a longer retention (7y), tighter access controls, and a separate billing line — without touching the rest of your pipeline.",[3134,7688,7690],{"id":7689},"audit-logs-in-postgres","Audit logs in Postgres",[665,7692,7693,7923],{},[351,7694,7696],{"className":353,"code":7695,"filename":7300,"language":356,"meta":357,"style":357},"import { auditOnly } from 'evlog'\nimport type { DrainContext } from 'evlog'\n\nconst postgresAudit = async (ctx: DrainContext) => {\n  await db.insert(auditEvents).values({\n    id: ctx.event.audit!.idempotencyKey,\n    timestamp: new Date(ctx.event.timestamp),\n    payload: ctx.event,\n  }).onConflictDoNothing()\n}\n\nnitro.hooks.hook('evlog:drain', auditOnly(postgresAudit, { await: true }))\n",[316,7697,7698,7716,7737,7741,7766,7794,7817,7846,7861,7874,7878,7882],{"__ignoreMap":357},[361,7699,7700,7702,7704,7706,7708,7710,7712,7714],{"class":363,"line":364},[361,7701,368],{"class":367},[361,7703,372],{"class":371},[361,7705,382],{"class":375},[361,7707,390],{"class":371},[361,7709,393],{"class":367},[361,7711,396],{"class":371},[361,7713,400],{"class":399},[361,7715,403],{"class":371},[361,7717,7718,7720,7722,7724,7727,7729,7731,7733,7735],{"class":363,"line":406},[361,7719,368],{"class":367},[361,7721,819],{"class":367},[361,7723,372],{"class":371},[361,7725,7726],{"class":375}," DrainContext",[361,7728,390],{"class":371},[361,7730,393],{"class":367},[361,7732,396],{"class":371},[361,7734,400],{"class":399},[361,7736,403],{"class":371},[361,7738,7739],{"class":363,"line":427},[361,7740,452],{"emptyLinePlaceholder":451},[361,7742,7743,7745,7748,7750,7752,7754,7756,7758,7760,7762,7764],{"class":363,"line":448},[361,7744,1016],{"class":480},[361,7746,7747],{"class":375}," postgresAudit ",[361,7749,1022],{"class":371},[361,7751,1068],{"class":480},[361,7753,689],{"class":371},[361,7755,5937],{"class":473},[361,7757,596],{"class":371},[361,7759,7726],{"class":1033},[361,7761,477],{"class":371},[361,7763,481],{"class":480},[361,7765,484],{"class":371},[361,7767,7768,7771,7773,7775,7778,7780,7783,7785,7787,7790,7792],{"class":363,"line":455},[361,7769,7770],{"class":367},"  await",[361,7772,5139],{"class":375},[361,7774,323],{"class":371},[361,7776,7777],{"class":464},"insert",[361,7779,468],{"class":503},[361,7781,7782],{"class":375},"auditEvents",[361,7784,477],{"class":503},[361,7786,323],{"class":371},[361,7788,7789],{"class":464},"values",[361,7791,468],{"class":503},[361,7793,791],{"class":371},[361,7795,7796,7798,7800,7802,7804,7806,7808,7810,7813,7815],{"class":363,"line":487},[361,7797,2708],{"class":503},[361,7799,596],{"class":371},[361,7801,4335],{"class":375},[361,7803,323],{"class":371},[361,7805,692],{"class":375},[361,7807,323],{"class":371},[361,7809,318],{"class":375},[361,7811,7812],{"class":371},"!.",[361,7814,2460],{"class":375},[361,7816,630],{"class":371},[361,7818,7819,7822,7824,7826,7829,7831,7833,7835,7837,7839,7842,7844],{"class":363,"line":521},[361,7820,7821],{"class":503},"    timestamp",[361,7823,596],{"class":371},[361,7825,1025],{"class":371},[361,7827,7828],{"class":464}," Date",[361,7830,468],{"class":503},[361,7832,5937],{"class":375},[361,7834,323],{"class":371},[361,7836,692],{"class":375},[361,7838,323],{"class":371},[361,7840,7841],{"class":375},"timestamp",[361,7843,477],{"class":503},[361,7845,630],{"class":371},[361,7847,7848,7851,7853,7855,7857,7859],{"class":363,"line":549},[361,7849,7850],{"class":503},"    payload",[361,7852,596],{"class":371},[361,7854,4335],{"class":375},[361,7856,323],{"class":371},[361,7858,692],{"class":375},[361,7860,630],{"class":371},[361,7862,7863,7865,7867,7869,7872],{"class":363,"line":577},[361,7864,928],{"class":371},[361,7866,477],{"class":503},[361,7868,323],{"class":371},[361,7870,7871],{"class":464},"onConflictDoNothing",[361,7873,1040],{"class":503},[361,7875,7876],{"class":363,"line":633},[361,7877,2562],{"class":371},[361,7879,7880],{"class":363,"line":651},[361,7881,452],{"emptyLinePlaceholder":451},[361,7883,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7909,7911,7913,7915,7917,7919,7921],{"class":363,"line":657},[361,7885,474],{"class":375},[361,7887,323],{"class":371},[361,7889,495],{"class":375},[361,7891,323],{"class":371},[361,7893,500],{"class":464},[361,7895,468],{"class":375},[361,7897,506],{"class":371},[361,7899,538],{"class":399},[361,7901,506],{"class":371},[361,7903,379],{"class":371},[361,7905,382],{"class":464},[361,7907,7908],{"class":375},"(postgresAudit",[361,7910,379],{"class":371},[361,7912,372],{"class":371},[361,7914,639],{"class":503},[361,7916,596],{"class":371},[361,7918,645],{"class":644},[361,7920,390],{"class":371},[361,7922,773],{"class":375},[351,7924,7929],{"className":7925,"code":7926,"filename":7927,"language":7928,"meta":357,"style":357},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SELECT id, timestamp, payload->'audit'->>'action' AS action,\n       payload->'audit'->>'outcome' AS outcome\nFROM audit_events\nWHERE id = 'ak_8f3c4b2a1e5d6f7c';\n\n--          id          |       timestamp       |     action      | outcome\n-- ---------------------+-----------------------+-----------------+---------\n--  ak_8f3c4b2a1e5d6f7c | 2026-04-24 10:23:45.6 | invoice.refund  | success\n","Output — audit_events row","sql",[316,7930,7931,7936,7941,7946,7951,7955,7960,7965],{"__ignoreMap":357},[361,7932,7933],{"class":363,"line":364},[361,7934,7935],{},"SELECT id, timestamp, payload->'audit'->>'action' AS action,\n",[361,7937,7938],{"class":363,"line":406},[361,7939,7940],{},"       payload->'audit'->>'outcome' AS outcome\n",[361,7942,7943],{"class":363,"line":427},[361,7944,7945],{},"FROM audit_events\n",[361,7947,7948],{"class":363,"line":448},[361,7949,7950],{},"WHERE id = 'ak_8f3c4b2a1e5d6f7c';\n",[361,7952,7953],{"class":363,"line":455},[361,7954,452],{"emptyLinePlaceholder":451},[361,7956,7957],{"class":363,"line":487},[361,7958,7959],{},"--          id          |       timestamp       |     action      | outcome\n",[361,7961,7962],{"class":363,"line":521},[361,7963,7964],{},"-- ---------------------+-----------------------+-----------------+---------\n",[361,7966,7967],{"class":363,"line":549},[361,7968,7969],{},"--  ak_8f3c4b2a1e5d6f7c | 2026-04-24 10:23:45.6 | invoice.refund  | success\n",[307,7971,7972,7973,7975,7976,7979],{},"The deterministic ",[316,7974,2460],{}," makes retries safe — duplicate inserts collapse via ",[316,7977,7978],{},"ON CONFLICT DO NOTHING",". Without it, a transient network blip during a retry would create a duplicate audit row, which is exactly what you don't want.",[325,7981,7983],{"id":7982},"testing","Testing",[307,7985,7986,7989],{},[316,7987,7988],{},"mockAudit()"," captures every audit event emitted during a test:",[351,7991,7993],{"className":353,"code":7992,"language":356,"meta":357,"style":357},"import { mockAudit } from 'evlog'\n\nit('refunds the invoice and records an audit', async () => {\n  const captured = mockAudit()\n\n  await refundInvoice({ id: 'inv_889' }, { actor: { type: 'user', id: 'u1' } })\n\n  expect(captured.events).toHaveLength(1)\n  expect(captured.toIncludeAuditOf({\n    action: 'invoice.refund',\n    target: { type: 'invoice', id: 'inv_889' },\n    outcome: 'success',\n  })).toBe(true)\n\n  captured.restore()\n})\n",[316,7994,7995,8014,8018,8042,8055,8059,8119,8123,8152,8169,8183,8215,8229,8248,8252,8264],{"__ignoreMap":357},[361,7996,7997,7999,8001,8004,8006,8008,8010,8012],{"class":363,"line":364},[361,7998,368],{"class":367},[361,8000,372],{"class":371},[361,8002,8003],{"class":375}," mockAudit",[361,8005,390],{"class":371},[361,8007,393],{"class":367},[361,8009,396],{"class":371},[361,8011,400],{"class":399},[361,8013,403],{"class":371},[361,8015,8016],{"class":363,"line":406},[361,8017,452],{"emptyLinePlaceholder":451},[361,8019,8020,8023,8025,8027,8030,8032,8034,8036,8038,8040],{"class":363,"line":427},[361,8021,8022],{"class":464},"it",[361,8024,468],{"class":375},[361,8026,506],{"class":371},[361,8028,8029],{"class":399},"refunds the invoice and records an audit",[361,8031,506],{"class":371},[361,8033,379],{"class":371},[361,8035,1068],{"class":480},[361,8037,4785],{"class":371},[361,8039,481],{"class":480},[361,8041,484],{"class":371},[361,8043,8044,8046,8049,8051,8053],{"class":363,"line":448},[361,8045,703],{"class":480},[361,8047,8048],{"class":375}," captured",[361,8050,709],{"class":371},[361,8052,8003],{"class":464},[361,8054,1040],{"class":503},[361,8056,8057],{"class":363,"line":455},[361,8058,452],{"emptyLinePlaceholder":451},[361,8060,8061,8063,8065,8067,8069,8071,8073,8075,8077,8079,8081,8083,8086,8088,8090,8092,8094,8096,8098,8100,8102,8104,8106,8108,8111,8113,8115,8117],{"class":363,"line":487},[361,8062,7770],{"class":367},[361,8064,752],{"class":464},[361,8066,468],{"class":503},[361,8068,590],{"class":371},[361,8070,833],{"class":503},[361,8072,596],{"class":371},[361,8074,396],{"class":371},[361,8076,2066],{"class":399},[361,8078,506],{"class":371},[361,8080,5030],{"class":371},[361,8082,372],{"class":371},[361,8084,8085],{"class":503}," actor",[361,8087,596],{"class":371},[361,8089,372],{"class":371},[361,8091,819],{"class":503},[361,8093,596],{"class":371},[361,8095,396],{"class":371},[361,8097,826],{"class":399},[361,8099,506],{"class":371},[361,8101,379],{"class":371},[361,8103,833],{"class":503},[361,8105,596],{"class":371},[361,8107,396],{"class":371},[361,8109,8110],{"class":399},"u1",[361,8112,506],{"class":371},[361,8114,390],{"class":371},[361,8116,390],{"class":371},[361,8118,663],{"class":503},[361,8120,8121],{"class":363,"line":521},[361,8122,452],{"emptyLinePlaceholder":451},[361,8124,8125,8128,8130,8133,8135,8138,8140,8142,8145,8147,8150],{"class":363,"line":549},[361,8126,8127],{"class":464},"  expect",[361,8129,468],{"class":503},[361,8131,8132],{"class":375},"captured",[361,8134,323],{"class":371},[361,8136,8137],{"class":375},"events",[361,8139,477],{"class":503},[361,8141,323],{"class":371},[361,8143,8144],{"class":464},"toHaveLength",[361,8146,468],{"class":503},[361,8148,8149],{"class":2215},"1",[361,8151,663],{"class":503},[361,8153,8154,8156,8158,8160,8162,8165,8167],{"class":363,"line":577},[361,8155,8127],{"class":464},[361,8157,468],{"class":503},[361,8159,8132],{"class":375},[361,8161,323],{"class":371},[361,8163,8164],{"class":464},"toIncludeAuditOf",[361,8166,468],{"class":503},[361,8168,791],{"class":371},[361,8170,8171,8173,8175,8177,8179,8181],{"class":363,"line":633},[361,8172,796],{"class":503},[361,8174,596],{"class":371},[361,8176,396],{"class":371},[361,8178,803],{"class":399},[361,8180,506],{"class":371},[361,8182,630],{"class":371},[361,8184,8185,8187,8189,8191,8193,8195,8197,8199,8201,8203,8205,8207,8209,8211,8213],{"class":363,"line":651},[361,8186,862],{"class":503},[361,8188,596],{"class":371},[361,8190,372],{"class":371},[361,8192,819],{"class":503},[361,8194,596],{"class":371},[361,8196,396],{"class":371},[361,8198,875],{"class":399},[361,8200,506],{"class":371},[361,8202,379],{"class":371},[361,8204,833],{"class":503},[361,8206,596],{"class":371},[361,8208,396],{"class":371},[361,8210,2066],{"class":399},[361,8212,506],{"class":371},[361,8214,648],{"class":371},[361,8216,8217,8219,8221,8223,8225,8227],{"class":363,"line":657},[361,8218,896],{"class":503},[361,8220,596],{"class":371},[361,8222,396],{"class":371},[361,8224,903],{"class":399},[361,8226,506],{"class":371},[361,8228,630],{"class":371},[361,8230,8231,8233,8236,8238,8241,8243,8246],{"class":363,"line":933},[361,8232,928],{"class":371},[361,8234,8235],{"class":503},"))",[361,8237,323],{"class":371},[361,8239,8240],{"class":464},"toBe",[361,8242,468],{"class":503},[361,8244,8245],{"class":644},"true",[361,8247,663],{"class":503},[361,8249,8250],{"class":363,"line":938},[361,8251,452],{"emptyLinePlaceholder":451},[361,8253,8254,8257,8259,8262],{"class":363,"line":956},[361,8255,8256],{"class":375},"  captured",[361,8258,323],{"class":371},[361,8260,8261],{"class":464},"restore",[361,8263,1040],{"class":503},[361,8265,8266,8268],{"class":363,"line":1283},[361,8267,660],{"class":371},[361,8269,663],{"class":375},[325,8271,8273],{"id":8272},"api-reference","API Reference",[8275,8276,8277,8293],"table",{},[8278,8279,8280],"thead",{},[8281,8282,8283,8287,8290],"tr",{},[8284,8285,8286],"th",{},"Symbol",[8284,8288,8289],{},"Kind",[8284,8291,8292],{},"Notes",[8294,8295,8296,8308,8321,8337,8348,8361,8374,8388,8400,8412,8427,8438],"tbody",{},[8281,8297,8298,8303,8305],{},[8299,8300,8301],"td",{},[316,8302,6983],{},[8299,8304,2308],{},[8299,8306,8307],{},"Reserved field on the wide event",[8281,8309,8310,8315,8318],{},[8299,8311,8312],{},[316,8313,8314],{},"defineAuditAction(name, opts?)",[8299,8316,8317],{},"factory",[8299,8319,8320],{},"Typed action registry, infers target shape",[8281,8322,8323,8328,8330],{},[8299,8324,8325],{},[316,8326,8327],{},"log.audit(fields)",[8299,8329,2168],{},[8299,8331,8332,8333,8336],{},"Sugar over ",[316,8334,8335],{},"log.set({ audit })"," + force-keep",[8281,8338,8339,8343,8345],{},[8299,8340,8341],{},[316,8342,3328],{},[8299,8344,2168],{},[8299,8346,8347],{},"Records a denied action",[8281,8349,8350,8355,8358],{},[8299,8351,8352],{},[316,8353,8354],{},"audit(fields)",[8299,8356,8357],{},"function",[8299,8359,8360],{},"Standalone for scripts \u002F jobs",[8281,8362,8363,8368,8371],{},[8299,8364,8365],{},[316,8366,8367],{},"withAudit({ action, target })(fn)",[8299,8369,8370],{},"wrapper",[8299,8372,8373],{},"Auto-emit success \u002F failure \u002F denied",[8281,8375,8376,8381,8383],{},[8299,8377,8378],{},[316,8379,8380],{},"auditDiff(before, after)",[8299,8382,3136],{},[8299,8384,8385,8386],{},"Redact-aware JSON Patch for ",[316,8387,5065],{},[8281,8389,8390,8394,8397],{},[8299,8391,8392],{},[316,8393,7988],{},[8299,8395,8396],{},"test util",[8299,8398,8399],{},"Capture + assert audits in tests",[8281,8401,8402,8407,8409],{},[8299,8403,8404],{},[316,8405,8406],{},"auditEnricher(opts?)",[8299,8408,4281],{},[8299,8410,8411],{},"Auto-fill request \u002F runtime \u002F tenant context",[8281,8413,8414,8419,8421],{},[8299,8415,8416],{},[316,8417,8418],{},"auditOnly(drain, { await? })",[8299,8420,8370],{},[8299,8422,8423,8424,8426],{},"Routes only events with an ",[316,8425,318],{}," field",[8281,8428,8429,8433,8435],{},[8299,8430,8431],{},[316,8432,4617],{},[8299,8434,8370],{},[8299,8436,8437],{},"Generic integrity wrapper (hmac \u002F hash-chain)",[8281,8439,8440,8445,8448],{},[8299,8441,8442],{},[316,8443,8444],{},"auditRedactPreset",[8299,8446,8447],{},"config",[8299,8449,8450],{},"Strict PII for audit events",[307,8452,8453,8454,8456],{},"Everything ships from the main ",[316,8455,400],{}," entrypoint.",[8458,8459,8460],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":357,"searchDepth":406,"depth":406,"links":8462},[8463,8464,8465,8466,8474,8481,8486,8487],{"id":327,"depth":406,"text":328},{"id":345,"depth":406,"text":346},{"id":2617,"depth":406,"text":2618},{"id":3100,"depth":406,"text":3101,"children":8467},[8468,8469,8470,8471,8472],{"id":3136,"depth":427,"text":3137},{"id":4281,"depth":427,"text":4282},{"id":4402,"depth":427,"text":4403},{"id":4886,"depth":427,"text":4887},{"id":5762,"depth":427,"text":8473},"Auto-Instrumentation with withAudit()",{"id":6874,"depth":406,"text":6875,"children":8475},[8476,8477,8478,8479,8480],{"id":6878,"depth":427,"text":6879},{"id":6995,"depth":427,"text":6996},{"id":7145,"depth":427,"text":7146},{"id":4420,"depth":427,"text":297},{"id":7213,"depth":427,"text":7214},{"id":7289,"depth":406,"text":7290,"children":8482},[8483,8484,8485],{"id":7293,"depth":427,"text":7294},{"id":7474,"depth":427,"text":7475},{"id":7689,"depth":427,"text":7690},{"id":7982,"depth":406,"text":7983},{"id":8272,"depth":406,"text":8273},"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",[8491,8494],{"label":46,"icon":49,"to":47,"color":8492,"variant":8493},"neutral","subtle",{"label":8495,"icon":8496,"to":67,"color":8492,"variant":8493},"Better Auth","i-lucide-key-round",{},{"icon":74},{"title":71,"description":8488},"FiyKgrXRimVli9_jQPirSmfMQMYlKZl34HsxVmRhXek",[8502,8504],{"title":66,"path":67,"stem":68,"description":8503,"icon":69,"children":-1},"Automatically identify users on every request. Every wide event includes who made the request — userId, user profile, and session metadata — with zero manual work.",{"title":81,"path":82,"stem":83,"description":8505,"icon":84,"children":-1},"Understand the full lifecycle of an evlog event, from creation to drain. Covers all three modes (simple logging, wide events, request logging), sampling, enrichment, and delivery.",1777047253693]