[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"cycle-doc-qnative-c3-guide\u002F04-monitor.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":19},{"id":5,"title":6},"c3","Developer Mode",{"id":8,"label":9},"qnative","Qnative (provisional)","guide\u002F04-monitor.md","Monitor: the contract",[13,14,15,16,17,18],"What each view needs, and whether it can be read today","The mechanism","Cadence and cost","What the page does until a route exists","Hooking it up","Questions",{"type":20,"children":21},"root",[22,45,74,80,352,410,415,452,462,627,650,690,702,715,784,794,802,808,816,902,907,971,976,989,994,1015,1020,1079],{"type":23,"tag":24,"props":25,"children":26},"element","p",{},[27,34,36,43],{"type":23,"tag":28,"props":29,"children":30},"strong",{},[31],{"type":32,"value":33},"text","Standing:",{"type":32,"value":35}," \"Where it comes from today\" is read from qcontrol ",{"type":23,"tag":37,"props":38,"children":40},"code",{"className":39},[],[41],{"type":32,"value":42},"main",{"type":32,"value":44}," (2026-11-10). The shapes and routes are proposals; the names are ours to change.",{"type":23,"tag":24,"props":46,"children":47},{},[48,50,56,58,64,66,72],{"type":32,"value":49},"The Monitor page replicates the monitor TUI (",{"type":23,"tag":37,"props":51,"children":53},{"className":52},[],[54],{"type":32,"value":55},"qcontrol start --tui",{"type":32,"value":57},", ",{"type":23,"tag":37,"props":59,"children":61},{"className":60},[],[62],{"type":32,"value":63},"cli\u002Fsrc\u002Fcommands\u002Fmonitor\u002Fui\u002Fterminal\u002F",{"type":32,"value":65},"). The TUI can show what it shows because it ",{"type":23,"tag":67,"props":68,"children":69},"em",{},[70],{"type":32,"value":71},"is",{"type":32,"value":73}," the monitor process. The app is another process, so it can show only what the sensor serves. This page lists what that is, view by view.",{"type":23,"tag":75,"props":76,"children":78},"h2",{"id":77},"what-each-view-needs-and-whether-it-can-be-read-today",[79],{"type":32,"value":13},{"type":23,"tag":81,"props":82,"children":83},"table",{},[84,113],{"type":23,"tag":85,"props":86,"children":87},"thead",{},[88],{"type":23,"tag":89,"props":90,"children":91},"tr",{},[92,98,103,108],{"type":23,"tag":93,"props":94,"children":95},"th",{},[96],{"type":32,"value":97},"View",{"type":23,"tag":93,"props":99,"children":100},{},[101],{"type":32,"value":102},"Shows",{"type":23,"tag":93,"props":104,"children":105},{},[106],{"type":32,"value":107},"Where the TUI gets it",{"type":23,"tag":93,"props":109,"children":110},{},[111],{"type":32,"value":112},"Readable from another process today",{"type":23,"tag":114,"props":115,"children":116},"tbody",{},[117,149,178,223,262,285,329],{"type":23,"tag":89,"props":118,"children":119},{},[120,126,131,144],{"type":23,"tag":121,"props":122,"children":123},"td",{},[124],{"type":32,"value":125},"Overview",{"type":23,"tag":121,"props":127,"children":128},{},[129],{"type":32,"value":130},"live workers, throughput per worker, latest events, health, the event mix of the last 60 s, targets",{"type":23,"tag":121,"props":132,"children":133},{},[134,136,142],{"type":32,"value":135},"the ",{"type":23,"tag":37,"props":137,"children":139},{"className":138},[],[140],{"type":32,"value":141},"MonitorView",{"type":32,"value":143}," snapshot and the event route",{"type":23,"tag":121,"props":145,"children":146},{},[147],{"type":32,"value":148},"events: yes. Workers, health, last error: no",{"type":23,"tag":89,"props":150,"children":151},{},[152,157,162,173],{"type":23,"tag":121,"props":153,"children":154},{},[155],{"type":32,"value":156},"Qcontrol",{"type":23,"tag":121,"props":158,"children":159},{},[160],{"type":32,"value":161},"the monitor's process tree with CPU and memory, history, averages over 1, 5, 10 and 30 min",{"type":23,"tag":121,"props":163,"children":164},{},[165,171],{"type":23,"tag":37,"props":166,"children":168},{"className":167},[],[169],{"type":32,"value":170},"sysinfo",{"type":32,"value":172},", sampled on the TUI's own thread at 1 Hz, 1,800 samples per process",{"type":23,"tag":121,"props":174,"children":175},{},[176],{"type":32,"value":177},"no; nothing produces it outside the TUI",{"type":23,"tag":89,"props":179,"children":180},{},[181,186,191,218],{"type":23,"tag":121,"props":182,"children":183},{},[184],{"type":32,"value":185},"Workers",{"type":23,"tag":121,"props":187,"children":188},{},[189],{"type":32,"value":190},"lifecycle timeline, process facts (signing, inject verdicts, capture), behavior, plugins, process tree",{"type":23,"tag":121,"props":192,"children":193},{},[194,200,202,208,210,216],{"type":23,"tag":37,"props":195,"children":197},{"className":196},[],[198],{"type":32,"value":199},"Workers::view()",{"type":32,"value":201}," (",{"type":23,"tag":37,"props":203,"children":205},{"className":204},[],[206],{"type":32,"value":207},"crates\u002Fqmonitor\u002Fsrc\u002Fworkers\u002Ftelemetry.rs",{"type":32,"value":209},"), compiled only with the ",{"type":23,"tag":37,"props":211,"children":213},{"className":212},[],[214],{"type":32,"value":215},"telemetry",{"type":32,"value":217}," feature",{"type":23,"tag":121,"props":219,"children":220},{},[221],{"type":32,"value":222},"no. Plugin loads arrive as events, at Debug severity",{"type":23,"tag":89,"props":224,"children":225},{},[226,231,236,248],{"type":23,"tag":121,"props":227,"children":228},{},[229],{"type":32,"value":230},"Events",{"type":23,"tag":121,"props":232,"children":233},{},[234],{"type":32,"value":235},"the raw event table",{"type":23,"tag":121,"props":237,"children":238},{},[239,240,246],{"type":32,"value":135},{"type":23,"tag":37,"props":241,"children":243},{"className":242},[],[244],{"type":32,"value":245},"tui",{"type":32,"value":247}," event route",{"type":23,"tag":121,"props":249,"children":250},{},[251,253,260],{"type":32,"value":252},"yes; this is the ",{"type":23,"tag":254,"props":255,"children":257},"a",{"href":256},"\u002Fcycles\u002Fqnative\u002Fc3\u002Fdoc\u002Fguide\u002F03-live-activity",[258],{"type":32,"value":259},"Live Activity",{"type":32,"value":261}," page",{"type":23,"tag":89,"props":263,"children":264},{},[265,270,275,280],{"type":23,"tag":121,"props":266,"children":267},{},[268],{"type":32,"value":269},"Config",{"type":23,"tag":121,"props":271,"children":272},{},[273],{"type":32,"value":274},"targets, behaviors with own and inherited values, YAML as written and effective",{"type":23,"tag":121,"props":276,"children":277},{},[278],{"type":32,"value":279},"the loaded configuration",{"type":23,"tag":121,"props":281,"children":282},{},[283],{"type":32,"value":284},"no. The file on disk can be read, but it is not what the monitor has loaded",{"type":23,"tag":89,"props":286,"children":287},{},[288,293,298,303],{"type":23,"tag":121,"props":289,"children":290},{},[291],{"type":32,"value":292},"Inventory",{"type":23,"tag":121,"props":294,"children":295},{},[296],{"type":32,"value":297},"harnesses, other matched processes",{"type":23,"tag":121,"props":299,"children":300},{},[301],{"type":32,"value":302},"inventory state",{"type":23,"tag":121,"props":304,"children":305},{},[306,308,314,315,321,323],{"type":32,"value":307},"yes: ",{"type":23,"tag":37,"props":309,"children":311},{"className":310},[],[312],{"type":32,"value":313},"installation.snapshot",{"type":32,"value":57},{"type":23,"tag":37,"props":316,"children":318},{"className":317},[],[319],{"type":32,"value":320},"process.snapshot",{"type":32,"value":322},", or ",{"type":23,"tag":37,"props":324,"children":326},{"className":325},[],[327],{"type":32,"value":328},"\u002Fapi\u002Finstallations",{"type":23,"tag":89,"props":330,"children":331},{},[332,337,342,347],{"type":23,"tag":121,"props":333,"children":334},{},[335],{"type":32,"value":336},"Log",{"type":23,"tag":121,"props":338,"children":339},{},[340],{"type":32,"value":341},"log lines and the monitor's stderr",{"type":23,"tag":121,"props":343,"children":344},{},[345],{"type":32,"value":346},"a tracing layer in process",{"type":23,"tag":121,"props":348,"children":349},{},[350],{"type":32,"value":351},"no; only the log file",{"type":23,"tag":24,"props":353,"children":354},{},[355,357,363,364,370,372,378,380,386,387,393,394,400,402,408],{"type":32,"value":356},"What exists today for another process to read: the event stream, the two snapshots, the dashboard's REST routes, and two lock files (",{"type":23,"tag":37,"props":358,"children":360},{"className":359},[],[361],{"type":32,"value":362},"\u003Cdata dir>\u002Fstart.lock",{"type":32,"value":57},{"type":23,"tag":37,"props":365,"children":367},{"className":366},[],[368],{"type":32,"value":369},"\u003Cdata dir>\u002Fdash\u002Fqdash.sock.lock",{"type":32,"value":371},"). The control socket (",{"type":23,"tag":37,"props":373,"children":375},{"className":374},[],[376],{"type":32,"value":377},"\u003Cdata dir>\u002Fmonitor.control.sock",{"type":32,"value":379},") takes ",{"type":23,"tag":37,"props":381,"children":383},{"className":382},[],[384],{"type":32,"value":385},"Snapshot",{"type":32,"value":57},{"type":23,"tag":37,"props":388,"children":390},{"className":389},[],[391],{"type":32,"value":392},"Shutdown",{"type":32,"value":57},{"type":23,"tag":37,"props":395,"children":397},{"className":396},[],[398],{"type":32,"value":399},"CheckUpdate",{"type":32,"value":401}," and ",{"type":23,"tag":37,"props":403,"children":405},{"className":404},[],[406],{"type":32,"value":407},"ApplyUpdate",{"type":32,"value":409},"; none of them returns state.",{"type":23,"tag":75,"props":411,"children":413},{"id":412},"the-mechanism",[414],{"type":32,"value":14},{"type":23,"tag":24,"props":416,"children":417},{},[418,420,426,428,434,436,442,444,450],{"type":32,"value":419},"Design c131 D17, ruled 2026-11-11: shapes that only the endpoint knows become dashboard routes, typed in TypeScript in ",{"type":23,"tag":37,"props":421,"children":423},{"className":422},[],[424],{"type":32,"value":425},"ui\u002Fapp\u002Ftypes\u002Fapi\u002F",{"type":32,"value":427}," and generated into Rust for this app, under the same drift test as the other 38. Never hand-written in the app, never the monitor's internal structs. D17 names six shapes on three routes: SensorState, Resources and LogLine on ",{"type":23,"tag":37,"props":429,"children":431},{"className":430},[],[432],{"type":32,"value":433},"\u002Fapi\u002Fsensor",{"type":32,"value":435},"; EffectiveConfig and ConfigFile on ",{"type":23,"tag":37,"props":437,"children":439},{"className":438},[],[440],{"type":32,"value":441},"\u002Fapi\u002Fconfig",{"type":32,"value":443},"; PlaneConnection on ",{"type":23,"tag":37,"props":445,"children":447},{"className":446},[],[448],{"type":32,"value":449},"\u002Fapi\u002Fplane",{"type":32,"value":451},".",{"type":23,"tag":24,"props":453,"children":454},{},[455,460],{"type":23,"tag":28,"props":456,"children":457},{},[458],{"type":32,"value":459},"One ask per route",{"type":32,"value":461}," (reconciled 2026-11-12, design c143). The Monitor adds its fields to two of D17's routes rather than asking for a second shape of the same facts, and it needs two routes of its own. That makes four routes to ask for, two of them new, plus the event stream that is served today:",{"type":23,"tag":81,"props":463,"children":464},{},[465,491],{"type":23,"tag":85,"props":466,"children":467},{},[468],{"type":23,"tag":89,"props":469,"children":470},{},[471,476,481,486],{"type":23,"tag":93,"props":472,"children":473},{},[474],{"type":32,"value":475},"Route",{"type":23,"tag":93,"props":477,"children":478},{},[479],{"type":32,"value":480},"D17's shape, as V1's Sensor page reads it",{"type":23,"tag":93,"props":482,"children":483},{},[484],{"type":32,"value":485},"What the Monitor adds",{"type":23,"tag":93,"props":487,"children":488},{},[489],{"type":32,"value":490},"Views that read it",{"type":23,"tag":114,"props":492,"children":493},{},[494,522,549,576,602],{"type":23,"tag":89,"props":495,"children":496},{},[497,507,512,517],{"type":23,"tag":121,"props":498,"children":499},{},[500,505],{"type":23,"tag":37,"props":501,"children":503},{"className":502},[],[504],{"type":32,"value":433},{"type":32,"value":506}," (D17)",{"type":23,"tag":121,"props":508,"children":509},{},[510],{"type":32,"value":511},"SensorState, the Resources totals, the last LogLines",{"type":23,"tag":121,"props":513,"children":514},{},[515],{"type":32,"value":516},"the monitor's pid; a row per process in its tree, with 1 Hz samples; health and the last error; the log's target and a sequence number",{"type":23,"tag":121,"props":518,"children":519},{},[520],{"type":32,"value":521},"Overview (health), Qcontrol, Log; the pid and uptime in the page's header",{"type":23,"tag":89,"props":523,"children":524},{},[525,534,539,544],{"type":23,"tag":121,"props":526,"children":527},{},[528,533],{"type":23,"tag":37,"props":529,"children":531},{"className":530},[],[532],{"type":32,"value":441},{"type":32,"value":506},{"type":23,"tag":121,"props":535,"children":536},{},[537],{"type":32,"value":538},"EffectiveConfig, ConfigFile",{"type":23,"tag":121,"props":540,"children":541},{},[542],{"type":32,"value":543},"the targets, the behaviors (each value own or inherited) and the include globs, as the monitor has loaded them",{"type":23,"tag":121,"props":545,"children":546},{},[547],{"type":32,"value":548},"Config, Overview (targets)",{"type":23,"tag":89,"props":550,"children":551},{},[552,563,566,571],{"type":23,"tag":121,"props":553,"children":554},{},[555,561],{"type":23,"tag":37,"props":556,"children":558},{"className":557},[],[559],{"type":32,"value":560},"\u002Fapi\u002Fmonitor\u002Fworkers",{"type":32,"value":562}," (new)",{"type":23,"tag":121,"props":564,"children":565},{},[],{"type":23,"tag":121,"props":567,"children":568},{},[569],{"type":32,"value":570},"one row per worker, with its lifecycle",{"type":23,"tag":121,"props":572,"children":573},{},[574],{"type":32,"value":575},"Overview (workers), Workers",{"type":23,"tag":89,"props":577,"children":578},{},[579,589,592,597],{"type":23,"tag":121,"props":580,"children":581},{},[582,588],{"type":23,"tag":37,"props":583,"children":585},{"className":584},[],[586],{"type":32,"value":587},"\u002Fapi\u002Fmonitor\u002Fprocesses",{"type":32,"value":562},{"type":23,"tag":121,"props":590,"children":591},{},[],{"type":23,"tag":121,"props":593,"children":594},{},[595],{"type":32,"value":596},"every process the monitor tracks",{"type":23,"tag":121,"props":598,"children":599},{},[600],{"type":32,"value":601},"Workers (the process tree); Live's attribution to a worker",{"type":23,"tag":89,"props":603,"children":604},{},[605,616,619,622],{"type":23,"tag":121,"props":606,"children":607},{},[608,614],{"type":23,"tag":37,"props":609,"children":611},{"className":610},[],[612],{"type":32,"value":613},"\u002Fapi\u002Fevents\u002Fstream",{"type":32,"value":615}," (served)",{"type":23,"tag":121,"props":617,"children":618},{},[],{"type":23,"tag":121,"props":620,"children":621},{},[],{"type":23,"tag":121,"props":623,"children":624},{},[625],{"type":32,"value":626},"Overview (throughput, latest events, the event mix), Live",{"type":23,"tag":24,"props":628,"children":629},{},[630,632,637,638,643,644,649],{"type":32,"value":631},"Inventory reads what is served today: ",{"type":23,"tag":37,"props":633,"children":635},{"className":634},[],[636],{"type":32,"value":313},{"type":32,"value":401},{"type":23,"tag":37,"props":639,"children":641},{"className":640},[],[642],{"type":32,"value":320},{"type":32,"value":322},{"type":23,"tag":37,"props":645,"children":647},{"className":646},[],[648],{"type":32,"value":328},{"type":32,"value":451},{"type":23,"tag":24,"props":651,"children":652},{},[653,655,661,663,669,671,680,682,688],{"type":32,"value":654},"Until the routes exist, the Monitor's additions to D17's shapes live with the rest of those shapes in design's bridge (",{"type":23,"tag":37,"props":656,"children":658},{"className":657},[],[659],{"type":32,"value":660},"app\u002Fdata\u002Fworlds\u002Fbridge\u002Ftypes.ts",{"type":32,"value":662},", mirrored by hand in ",{"type":23,"tag":37,"props":664,"children":666},{"className":665},[],[667],{"type":32,"value":668},"crates\u002Ftypes\u002Fsrc\u002Fbridge.rs",{"type":32,"value":670},"), and its two routes in ",{"type":23,"tag":254,"props":672,"children":674},{"href":673},"types\u002Fmonitor.ts",[675],{"type":23,"tag":37,"props":676,"children":678},{"className":677},[],[679],{"type":32,"value":673},{"type":32,"value":681},", generated into ",{"type":23,"tag":37,"props":683,"children":685},{"className":684},[],[686],{"type":32,"value":687},"crates\u002Ftypes\u002Fsrc\u002Fmonitor.rs",{"type":32,"value":689},". Every Monitor field on D17's routes is optional, so V1's Sensor page and the bridge files are unchanged, and an absent field draws as \"not served yet\". When the routes land, all of it moves into qdash's TypeScript.",{"type":23,"tag":691,"props":692,"children":694},"h3",{"id":693},"what-the-monitor-adds-to-apisensor",[695,697],{"type":32,"value":696},"What the Monitor adds to ",{"type":23,"tag":37,"props":698,"children":700},{"className":699},[],[701],{"type":32,"value":433},{"type":23,"tag":703,"props":704,"children":710},"pre",{"className":705,"code":706,"language":707,"meta":708,"style":709},"language-ts","export interface SensorState {\n  \u002F\u002F V1's fields: state, version, uptime_s, started_at, last_seen_by_plane, degraded\n  \u002F** The monitor's pid; null when off. *\u002F\n  pid?: number | null\n}\n\n\u002F** Totals over the monitor's own tree: CPU as percent of one core (a 5 s mean), resident memory, live workers. *\u002F\nexport interface Resources {\n  \u002F\u002F V1's fields: cpu_pct, rss_bytes, workers\n  processes?: {\n    pid: number\n    ppid: number\n    \u002F** `qcontrol monitor`, `worker W3 · claude-cli`, or the executable's name *\u002F\n    label: string\n    \u002F** The worker this process is, when it is one. *\u002F\n    worker_id: number | null\n    cpu_pct: number\n    rss_bytes: number\n    \u002F** 1 Hz samples after ?samples_since=, oldest first. *\u002F\n    samples?: { at: string; cpu_pct: number; rss_bytes: number }[]\n  }[]\n}\n\nexport interface LogLine {\n  \u002F\u002F V1's fields: at, level (now trace · debug · info · warn · error), line\n  \u002F** The tracing target: `qcontrol::monitor`, `stderr`. *\u002F\n  target?: string\n  \u002F** Rises by one per line; follow the tail with ?log_after=. *\u002F\n  seq?: number\n}\n\n\u002F** New on the response, beside sensor, resources and log: every health row, problems and all, and the last error. *\u002F\nhealth?: {\n  rows: { name: string; status: 'ok' | 'degraded' | 'failing'; detail: string }[]\n  last_error: { at: string; message: string } | null\n}\n","ts","","undefined",[711],{"type":23,"tag":37,"props":712,"children":713},{"__ignoreMap":708},[714],{"type":32,"value":706},{"type":23,"tag":716,"props":717,"children":718},"ul",{},[719,753,774,779],{"type":23,"tag":720,"props":721,"children":722},"li",{},[723,729,730,736,738,744,746,751],{"type":23,"tag":37,"props":724,"children":726},{"className":725},[],[727],{"type":32,"value":728},"state",{"type":32,"value":401},{"type":23,"tag":37,"props":731,"children":733},{"className":732},[],[734],{"type":32,"value":735},"degraded",{"type":32,"value":737}," are the rollup of ",{"type":23,"tag":37,"props":739,"children":741},{"className":740},[],[742],{"type":32,"value":743},"health",{"type":32,"value":745},": a failing or degraded row makes the state degraded, and ",{"type":23,"tag":37,"props":747,"children":749},{"className":748},[],[750],{"type":32,"value":735},{"type":32,"value":752}," lists those rows' details.",{"type":23,"tag":720,"props":754,"children":755},{},[756,758,764,766,772],{"type":32,"value":757},"Two cursors, both optional. ",{"type":23,"tag":37,"props":759,"children":761},{"className":760},[],[762],{"type":32,"value":763},"?log_after=\u003Cseq>",{"type":32,"value":765}," returns only the lines after that one. ",{"type":23,"tag":37,"props":767,"children":769},{"className":768},[],[770],{"type":32,"value":771},"?samples_since=\u003Ctime>",{"type":32,"value":773}," adds each process's samples after that time. Without them the response is V1's: the last lines, newest first, and no samples.",{"type":23,"tag":720,"props":775,"children":776},{},[777],{"type":32,"value":778},"The page works out the 1, 5, 10 and 30 minute means and the charts from the samples, and draws a window it has not filled yet muted, as the TUI does.",{"type":23,"tag":720,"props":780,"children":781},{},[782],{"type":32,"value":783},"No dashboard URL. The app reaches the sensor through the dashboard, so it already holds the address.",{"type":23,"tag":691,"props":785,"children":787},{"id":786},"what-the-monitor-adds-to-apiconfig",[788,789],{"type":32,"value":696},{"type":23,"tag":37,"props":790,"children":792},{"className":791},[],[793],{"type":32,"value":441},{"type":23,"tag":703,"props":795,"children":797},{"className":705,"code":796,"language":707,"meta":708,"style":709},"export interface EffectiveConfig {\n  \u002F\u002F V1's fields: file_found, mode, plane, won, plugins, it_contact\n  \u002F** As the monitor has loaded them, first match wins; not config.yaml as it is on disk. *\u002F\n  targets?: { id: string; title: string; matcher: string; behaviors: string[]; harness: string | null }[]\n  \u002F** Each behavior resolved alone onto the base. *\u002F\n  behaviors?: {\n    name: string\n    network: Setting; file: Setting; exec: Setting\n    inject: Setting; env: Setting; plugins: Setting\n  }[]\n  \u002F** The include globs in force. *\u002F\n  include?: string[]\n}\n\u002F** Whether this behavior set the value (drawn bright) or inherited it from the base (muted). *\u002F\nexport interface Setting { value: string; set: boolean }\n",[798],{"type":23,"tag":37,"props":799,"children":800},{"__ignoreMap":708},[801],{"type":32,"value":796},{"type":23,"tag":691,"props":803,"children":805},{"id":804},"the-monitors-two-routes",[806],{"type":32,"value":807},"The Monitor's two routes",{"type":23,"tag":703,"props":809,"children":811},{"className":705,"code":810,"language":707,"meta":708,"style":709},"\u002F** GET \u002Fapi\u002Fmonitor\u002Fworkers. One row per worker the monitor holds. *\u002F\nexport interface MonitorWorker {\n  \u002F** The launch id. Stable for the worker's life. *\u002F\n  id: number\n  kind: 'launch' | 'attach'\n  worker_pid: number | null\n  \u002F** The process being observed; null until spawned. *\u002F\n  target_pid: number | null\n  client_pid: number | null\n  \u002F** The harness adapter; null when the target is not a harness. *\u002F\n  adapter_id: string | null\n  program: string\n  cwd: string | null\n  \u002F** The config target that matched, if any. *\u002F\n  target: string | null\n  \u002F** Where capture is enrolled to, if it is. *\u002F\n  capture: string | null\n  proxy_addr: string | null\n  container_id: string | null\n  behavior: { plugins: string[]; proxy: string; inject: string }\n  \u002F** In order. The page draws the timeline and the duration of each phase. *\u002F\n  transitions: { phase: 'prepare' | 'ready' | 'started' | 'exited'; at: string }[]\n  \u002F** New: set when the worker is gone, so no client has to diff snapshots. *\u002F\n  ended_at: string | null\n}\n\n\u002F** GET \u002Fapi\u002Fmonitor\u002Fprocesses. Every process the monitor tracks, not only matched ones. *\u002F\nexport interface MonitorProcess {\n  pid: number\n  ppid: number\n  exe: string\n  args: string[]\n}\n",[812],{"type":23,"tag":37,"props":813,"children":814},{"__ignoreMap":708},[815],{"type":32,"value":810},{"type":23,"tag":24,"props":817,"children":818},{},[819,821,826,827,833,834,840,841,847,848,854,855,861,863,869,871,877,878,884,886,892,894,900],{"type":32,"value":820},"The reference for every field is what the TUI's snapshot holds today: ",{"type":23,"tag":37,"props":822,"children":824},{"className":823},[],[825],{"type":32,"value":141},{"type":32,"value":57},{"type":23,"tag":37,"props":828,"children":830},{"className":829},[],[831],{"type":32,"value":832},"WorkerRow",{"type":32,"value":57},{"type":23,"tag":37,"props":835,"children":837},{"className":836},[],[838],{"type":32,"value":839},"HealthRow",{"type":32,"value":57},{"type":23,"tag":37,"props":842,"children":844},{"className":843},[],[845],{"type":32,"value":846},"ProcessRow",{"type":32,"value":57},{"type":23,"tag":37,"props":849,"children":851},{"className":850},[],[852],{"type":32,"value":853},"TargetRow",{"type":32,"value":57},{"type":23,"tag":37,"props":856,"children":858},{"className":857},[],[859],{"type":32,"value":860},"BehaviorRow",{"type":32,"value":862}," in ",{"type":23,"tag":37,"props":864,"children":866},{"className":865},[],[867],{"type":32,"value":868},"cli\u002Fsrc\u002Fcommands\u002Fmonitor\u002Fui\u002Fshared\u002Fmod.rs",{"type":32,"value":870},", and ",{"type":23,"tag":37,"props":872,"children":874},{"className":873},[],[875],{"type":32,"value":876},"WorkerView",{"type":32,"value":862},{"type":23,"tag":37,"props":879,"children":881},{"className":880},[],[882],{"type":32,"value":883},"qmonitor",{"type":32,"value":885},". Three things are new: ",{"type":23,"tag":37,"props":887,"children":889},{"className":888},[],[890],{"type":32,"value":891},"ended_at",{"type":32,"value":893}," (the TUI works out that a worker has gone by comparing snapshots, and a served shape should say so), the log's ",{"type":23,"tag":37,"props":895,"children":897},{"className":896},[],[898],{"type":32,"value":899},"seq",{"type":32,"value":901},", and the per-process samples, which nothing outside the TUI produces.",{"type":23,"tag":75,"props":903,"children":905},{"id":904},"cadence-and-cost",[906],{"type":32,"value":15},{"type":23,"tag":716,"props":908,"children":909},{},[910,923,956,961],{"type":23,"tag":720,"props":911,"children":912},{},[913,915,921],{"type":32,"value":914},"The TUI's snapshot is built at most four times a second, and only when ",{"type":23,"tag":37,"props":916,"children":918},{"className":917},[],[919],{"type":32,"value":920},"--tui",{"type":32,"value":922}," is passed. Nothing is built for nobody.",{"type":23,"tag":720,"props":924,"children":925},{},[926,928,933,935,940,942,947,949,954],{"type":32,"value":927},"While the Monitor page is open, the app would poll ",{"type":23,"tag":37,"props":929,"children":931},{"className":930},[],[932],{"type":32,"value":433},{"type":32,"value":934}," (with both cursors) and ",{"type":23,"tag":37,"props":936,"children":938},{"className":937},[],[939],{"type":32,"value":560},{"type":32,"value":941}," once a second, ",{"type":23,"tag":37,"props":943,"children":945},{"className":944},[],[946],{"type":32,"value":587},{"type":32,"value":948}," once a second while a view that draws the tree is shown, and ",{"type":23,"tag":37,"props":950,"children":952},{"className":951},[],[953],{"type":32,"value":441},{"type":32,"value":955}," when the page opens and when asked. Nothing while the page is closed. A stream in place of polling is welcome and not required.",{"type":23,"tag":720,"props":957,"children":958},{},[959],{"type":32,"value":960},"Resources once a second, as the TUI samples, kept for 30 minutes.",{"type":23,"tag":720,"props":962,"children":963},{},[964,969],{"type":23,"tag":28,"props":965,"children":966},{},[967],{"type":32,"value":968},"The rule we would keep:",{"type":32,"value":970}," no subscriber, no work. Then the samples begin when a reader arrives, and the 30-minute mean fills in over 30 minutes, drawn muted until it does, as in the TUI (question 3).",{"type":23,"tag":75,"props":972,"children":974},{"id":973},"what-the-page-does-until-a-route-exists",[975],{"type":32,"value":16},{"type":23,"tag":716,"props":977,"children":978},{},[979,984],{"type":23,"tag":720,"props":980,"children":981},{},[982],{"type":32,"value":983},"On synthetic data: every view, fully, from fixtures in the shapes above (Monitor's fixtures come with its build, Phase 5; the bridge files carry none of its fields yet).",{"type":23,"tag":720,"props":985,"children":986},{},[987],{"type":32,"value":988},"On a real sensor: Inventory and the event-derived parts of Overview work today. Every other region is drawn with its name and one line: this sensor does not serve this yet, with the route it is waiting for. When a route lands, the region fills in. No page change is needed.",{"type":23,"tag":75,"props":990,"children":992},{"id":991},"hooking-it-up",[993],{"type":32,"value":17},{"type":23,"tag":24,"props":995,"children":996},{},[997,999,1005,1007,1013],{"type":32,"value":998},"Either the sensor serves a shape at the route above, or one transport function in ",{"type":23,"tag":37,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":32,"value":1004},"crates\u002Fnozzle",{"type":32,"value":1006}," reads it from wherever it is served. The doctor (",{"type":23,"tag":37,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":32,"value":1012},"--check-sensor",{"type":32,"value":1014},") lists each feed as served, missing or mismatched.",{"type":23,"tag":75,"props":1016,"children":1018},{"id":1017},"questions",[1019],{"type":32,"value":18},{"type":23,"tag":1021,"props":1022,"children":1023},"ol",{},[1024,1042,1047,1052,1064,1069,1074],{"type":23,"tag":720,"props":1025,"children":1026},{},[1027,1029,1034,1035,1040],{"type":32,"value":1028},"Which of these can the dashboard serve: the Monitor's fields on ",{"type":23,"tag":37,"props":1030,"children":1032},{"className":1031},[],[1033],{"type":32,"value":433},{"type":32,"value":401},{"type":23,"tag":37,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":32,"value":441},{"type":32,"value":1041},", and its two routes? And does its loopback API stay as the sensor's local read surface once the dashboard's own UI leaves qcontrol?",{"type":23,"tag":720,"props":1043,"children":1044},{},[1045],{"type":32,"value":1046},"The monitor may run elevated. Can a user-level app read the lock files and reach the loopback API in that case?",{"type":23,"tag":720,"props":1048,"children":1049},{},[1050],{"type":32,"value":1051},"Resources: can the monitor produce the samples? A user-level app may not be allowed to read an elevated process, and should not be the one sampling the sensor. And should it sample always (a few processes at 1 Hz), so the 30-minute mean is there when the page opens, or only while a reader is attached?",{"type":23,"tag":720,"props":1053,"children":1054},{},[1055,1057,1063],{"type":32,"value":1056},"LogLine: a tail with a sequence number (or as a stream), and at what default level? Outside TUI mode the log file's default filter is ",{"type":23,"tag":37,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":32,"value":1062},"qcontrol=error",{"type":32,"value":451},{"type":23,"tag":720,"props":1065,"children":1066},{},[1067],{"type":32,"value":1068},"Serving these means the dashboard subsystem is on, with its SQLite projection. Is there a lighter way to serve four small routes to one local reader?",{"type":23,"tag":720,"props":1070,"children":1071},{},[1072],{"type":32,"value":1073},"A worker or run id on the event envelope, so an event attributes to a worker without walking the process tree. The TUI's plan defers it as a schema change.",{"type":23,"tag":720,"props":1075,"children":1076},{},[1077],{"type":32,"value":1078},"Is anything in these shapes something you would rather not expose outside the process?",{"type":23,"tag":1080,"props":1081,"children":1082},"style",{},[1083],{"type":32,"value":708},1794599452921]