[{"data":1,"prerenderedAt":135},["ShallowReactive",2],{"i-lucide:layers":3,"i-lucide:git-commit-horizontal":8,"i-lucide:refresh-cw":10,"i-lucide:book-open":12,"i-lucide:image":14,"i-lucide:webhook":16,"i-lucide:home":18,"i-lucide:layout-grid":20,"i-lucide:tag":22,"i-lucide:newspaper":24,"i-lucide:map":26,"i-lucide:flask-conical":28,"i-lucide:arrow-right":30,"i-lucide:chevron-right":32,"i-lucide:search":34,"i-lucide:monitor":36,"content:\u002Finternal\u002Farchitecture\u002Fobservability":38,"i-lucide:info":133,"i-lucide:layers-2":130,"i-lucide:key-round":130,"i-lucide:shield-check":130,"i-lucide:box":130,"i-lucide:share-2":130,"i-lucide:clock":130,"i-lucide:building-2":130,"i-lucide:bell":130,"i-lucide:dices":130,"i-lucide:sprout":130,"i-lucide:puzzle":130,"i-lucide:shield-alert":130,"i-lucide:activity":130,"i-lucide:blocks":130},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"\u002F>\u003Cpath d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\"\u002F>\u003Cpath d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"3\"\u002F>\u003Cpath d=\"M3 12h6m6 0h6\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 12a9 9 0 0 1 9-9a9.75 9.75 0 0 1 6.74 2.74L21 8\"\u002F>\u003Cpath d=\"M21 3v5h-5m5 4a9 9 0 0 1-9 9a9.75 9.75 0 0 1-6.74-2.74L3 16\"\u002F>\u003Cpath d=\"M8 16H3v5\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v16m8.001-2A2 2 0 0 0 22 17V5a2 2 0 0 0-1.999-2L16 3.002A5 5 0 0 0 12 5a5 5 0 0 0-4-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 1.999 2H8a5 5 0 0 1 4 2a5 5 0 0 1 4-2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"\u002F>\u003Ccircle cx=\"9\" cy=\"9\" r=\"2\"\u002F>\u003Cpath d=\"m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\"\u002F>\u003Cpath d=\"m6 17l3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\"\u002F>\u003Cpath d=\"m12 6l3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\"\u002F>\u003Cpath d=\"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"\u002F>\u003Crect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\"\u002F>\u003Ccircle cx=\"7.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":25},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 18h-5m8-4h-8m-6 8h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-4 0v-9a2 2 0 0 1 2-2h2\"\u002F>\u003Crect width=\"8\" height=\"4\" x=\"10\" y=\"6\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":27},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0zm.894.211v15M9 3.236v15\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":29},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2M6.453 15h11.094M8.5 2h7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":31},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":33},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":35},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":37},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M8 21h8m-4-4v4\"\u002F>\u003C\u002Fg>",{"id":39,"title":40,"body":41,"description":123,"extension":124,"eyebrow":125,"hostedOnly":6,"meta":126,"navigation":127,"path":128,"seo":129,"short":130,"stem":131,"__hash__":132},"docs\u002Finternal\u002Farchitecture\u002Fobservability.md","Observability & Operations",{"type":42,"value":43,"toc":113},"minimark",[44,48,53,56,59,63,66,70,73,77,80,84,87,91,100],[45,46,47],"p",{},"This area is about running Chronicler in production without flying blind, and operating it without pulling it down. The through-line is that observability and operability are not bolted on afterwards. They are conventions every service already follows, so that a new context is watchable and operable the day it ships.",[49,50,52],"h2",{"id":51},"watching-without-marrying-a-vendor","Watching, without marrying a vendor",[45,54,55],{},"Every service method that takes a context opens a trace span, and every store method names its query, and both names derive automatically from the method rather than being typed by hand, so the instrumentation cannot drift from the code. Traces and logs export over OTLP to a vendor-neutral collector, and the application names an OTLP endpoint, never a specific tracing backend. That keeps the choice of monitoring vendor a deployment decision instead of a code dependency.",[45,57,58],{},"Logging goes through one logger, fanned out to a readable console, rotating JSON files, and an OTel sink at once. Verbosity is a single named ladder from high-level milestones down to a protocol firehose, so turning up detail widens one stream rather than flipping category switches and hoping you picked the right ones.",[49,60,62],{"id":61},"health-and-scheduled-work","Health and scheduled work",[45,64,65],{},"Health checks live in a registry, each tagged by how critical it is. Readiness gates only on the critical dependencies, while a separate diagnostic surface reports on everything, so a non-critical hiccup does not take the instance out of rotation. Recurring maintenance jobs run on NATS's own native scheduling rather than an in-process cron loop, which means the schedule survives a restart and does not depend on one process staying up.",[49,67,69],{"id":68},"read-models-you-can-rebuild-and-swap-under-load","Read models you can rebuild and swap under load",[45,71,72],{},"Because read models are projected from the event log, they can be rebuilt, and Chronicler makes that a first-class operation. A read-model instance is a named database plus a consumer namespace, projected independently. You can run two, build the new one from the log while the old one serves traffic, and switch over. That is a blue-green cutover. A carry-over manifest copies the few tables that are not derivable from events, and a write-gate freezes writes during the copy and doubles as a general maintenance mode. Which instance is live is decided outside the app, by a proxy or a pinned restart, so the swap is an operational act, not a risky in-process hot-swap.",[49,74,76],{"id":75},"operating-the-instance","Operating the instance",[45,78,79],{},"The write-gate grows into proper operator controls: several service modes, a scheduled maintenance window, an optional banner, and a switch to close new registrations, each behind its own permission and reachable from a break-glass CLI for when the UI itself is down. The admin console is a capability-gated area backed by the system API, showing each section only to an operator who holds the matching permission, and moderation adds a suspended-account state with its own login gate and audit trail.",[49,81,83],{"id":82},"a-control-plane-whose-real-boundary-is-its-connection","A control plane whose real boundary is its connection",[45,85,86],{},"The control plane, which drives things like seeding, rides on the same NATS connection that carries the event store. The honest consequence is that the connection, not the individual command, is the security boundary, so that is what gets secured. Trust is same-network only. A network-reachable bind is authenticated with NKey users, encrypted with TLS, and split into a full service user and a control-only operator user, so a leaked operator credential cannot read or write events. A reachable bind refuses to start without authentication at all. A long-running seed reports its progress through a port that publishes to a subject keyed by a run id, so a client can disconnect and reconnect and still watch it finish.",[49,88,90],{"id":89},"where-this-connects","Where this connects",[45,92,93,94,99],{},"The rebuildable read models are the ",[95,96,98],"a",{"href":97},"\u002Finternal\u002Farchitecture\u002Ffoundations","Foundations"," projection idea taken to its operational conclusion, and the durable notification inbox depends on the instance model described here.",[101,102,105],"callout",{"title":103,"tone":104},"Read the record for the detail","note",[45,106,107,108,112],{},"This page is the guide. The full records under ",[109,110,111],"code",{},"docs\u002Fadrs"," carry the cutover procedure, the control-plane trust model, and the alternatives that were weighed and rejected.",{"title":114,"searchDepth":115,"depth":115,"links":116},"",2,[117,118,119,120,121,122],{"id":51,"depth":115,"text":52},{"id":61,"depth":115,"text":62},{"id":68,"depth":115,"text":69},{"id":75,"depth":115,"text":76},{"id":82,"depth":115,"text":83},{"id":89,"depth":115,"text":90},"How the running system is watched and operated - tracing that names no vendor, read models you can rebuild and swap live, and a control plane that treats its own connection as the security boundary.","md","Architecture",{},{"title":40},"\u002Finternal\u002Farchitecture\u002Fobservability",{"title":40,"description":123},null,"internal\u002Farchitecture\u002Fobservability","k-tJ8Q6gYgaVS7qvkDXO-xM3qJ6p9f2JxPhS0eNM3xU",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":134},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4m0-4h.01\"\u002F>\u003C\u002Fg>",1788784066574]