[{"data":1,"prerenderedAt":2917},["ShallowReactive",2],{"cycle-doc-qnative-c3-review-0.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":22},{"id":5,"title":6},"c3","Developer Mode",{"id":8,"label":9},"qnative","Qnative (provisional)","review-0.md","Review stop 0: Measure and seam",[13,14,15,16,17,18,19,20,21],"In short","Rulings (2026-11-11)","How to try it","What was built","The readings","The burden test, line by line","For the Rust expert","Open calls for Mark","Not done here",{"type":23,"children":24},"root",[25,54,60,168,173,186,500,505,518,545,550,1141,1146,1156,1272,1290,1648,1793,1801,1918,1923,1933,1938,1943,1960,1970,2015,2084,2094,2196,2205,2230,2239,2300,2310,2318,2328,2333,2338,2717,2722,2889,2894,2912],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":26,"tag":31,"props":32,"children":33},"em",{},[34,37,44,46,52],{"type":35,"value":36},"text","2026-11-11. Design c138 Phase 0 (",{"type":26,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":35,"value":43},"..\u002Fdesign\u002Fcycles\u002Fc138.developer-mode\u002Fplan.md",{"type":35,"value":45},", row 0 of the Phases table; \"The gate\", \"Allowed, and on\", \"The seam, and the burden test\"; Rulings 1 and 8). Built on ",{"type":26,"tag":38,"props":47,"children":49},{"className":48},[],[50],{"type":35,"value":51},"7468f9c",{"type":35,"value":53},".",{"type":26,"tag":55,"props":56,"children":58},"h2",{"id":57},"in-short",[59],{"type":35,"value":13},{"type":26,"tag":61,"props":62,"children":63},"ul",{},[64,76,86,125,158],{"type":26,"tag":65,"props":66,"children":67},"li",{},[68,74],{"type":26,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":35,"value":73},"B holds: the switch and the lean build.",{"type":35,"value":75}," All four lines of the burden test pass. Line 3 passes on this Mac: both variants build, the tests and stories pass, and the lean check passes. CI has never run, because the repository has no remote (ruling 7).",{"type":26,"tag":65,"props":77,"children":78},{},[79,84],{"type":26,"tag":69,"props":80,"children":81},{},[82],{"type":35,"value":83},"What the lean build saves:",{"type":35,"value":85}," 1.07 MB of binary (23.2 MB against 24.3 MB, 4.4%) and nothing measurable at rest. Every quiet idle reading of every state with no Dev page shown sits between 60.3 and 63.0 MB, at 0.002–0.006% of a core and about one wake a second. Showing the Components page reads 65.0 and 65.3 MB. This matches the plan's estimate (1 to 2 MB of binary, close to nothing at rest); now it is a reading.",{"type":26,"tag":65,"props":87,"children":88},{},[89,94,96,102,104,110,112,118,120],{"type":26,"tag":69,"props":90,"children":91},{},[92],{"type":35,"value":93},"Developer mode is now an extension the app does not know about.",{"type":35,"value":95}," A new crate, ",{"type":26,"tag":38,"props":97,"children":99},{"className":98},[],[100],{"type":35,"value":101},"devmode",{"type":35,"value":103},", holds Tools and Components. The app takes it only with ",{"type":26,"tag":38,"props":105,"children":107},{"className":106},[],[108],{"type":35,"value":109},"--features dev",{"type":35,"value":111},", through one line in ",{"type":26,"tag":38,"props":113,"children":115},{"className":114},[],[116],{"type":35,"value":117},"main.rs",{"type":35,"value":119},". ",{"type":26,"tag":69,"props":121,"children":122},{},[123],{"type":35,"value":124},"The default build is lean.",{"type":26,"tag":65,"props":126,"children":127},{},[128,133,135,141,143,149,151,156],{"type":26,"tag":69,"props":129,"children":130},{},[131],{"type":35,"value":132},"Allowed versus on",{"type":35,"value":134}," is built. Allowed: debug builds, ",{"type":26,"tag":38,"props":136,"children":138},{"className":137},[],[139],{"type":35,"value":140},"--dev",{"type":35,"value":142}," or ",{"type":26,"tag":38,"props":144,"children":146},{"className":145},[],[147],{"type":35,"value":148},"QPOINT_DEV=1",{"type":35,"value":150},", and only in the full build. On: a ",{"type":26,"tag":69,"props":152,"children":153},{},[154],{"type":35,"value":155},"Developer mode",{"type":35,"value":157}," checkbox in the tray menu, remembered across restarts. Not allowed means no group and no menu item.",{"type":26,"tag":65,"props":159,"children":160},{},[161,166],{"type":26,"tag":69,"props":162,"children":163},{},[164],{"type":35,"value":165},"The eager construction is fixed.",{"type":35,"value":167}," Dev pages are built when opened and dropped when left, like every other page.",{"type":26,"tag":55,"props":169,"children":171},{"id":170},"rulings-2026-11-11",[172],{"type":35,"value":14},{"type":26,"tag":27,"props":174,"children":175},{},[176,178,184],{"type":35,"value":177},"Calls 1–4 were walked with Mark the same afternoon; he chose each recommended answer. That night he ruled to move through c3's blockers: Phases 1–3 run in sequence without stopping, and the rest of these calls are taken by their recommended answers until he overturns one (design ",{"type":26,"tag":38,"props":179,"children":181},{"className":180},[],[182],{"type":35,"value":183},"9eec43f656",{"type":35,"value":185},").",{"type":26,"tag":187,"props":188,"children":189},"table",{},[190,214],{"type":26,"tag":191,"props":192,"children":193},"thead",{},[194],{"type":26,"tag":195,"props":196,"children":197},"tr",{},[198,204,209],{"type":26,"tag":199,"props":200,"children":201},"th",{},[202],{"type":35,"value":203},"#",{"type":26,"tag":199,"props":205,"children":206},{},[207],{"type":35,"value":208},"Call",{"type":26,"tag":199,"props":210,"children":211},{},[212],{"type":35,"value":213},"Ruled",{"type":26,"tag":215,"props":216,"children":217},"tbody",{},[218,242,265,302,325,377,400,431,454,477],{"type":26,"tag":195,"props":219,"children":220},{},[221,227,232],{"type":26,"tag":222,"props":223,"children":224},"td",{},[225],{"type":35,"value":226},"1",{"type":26,"tag":222,"props":228,"children":229},{},[230],{"type":35,"value":231},"The gate",{"type":26,"tag":222,"props":233,"children":234},{},[235,240],{"type":26,"tag":69,"props":236,"children":237},{},[238],{"type":35,"value":239},"B kept",{"type":35,"value":241},": the switch and the lean build. Still open to the Rust expert's review (ruling 1).",{"type":26,"tag":195,"props":243,"children":244},{},[245,250,255],{"type":26,"tag":222,"props":246,"children":247},{},[248],{"type":35,"value":249},"2",{"type":26,"tag":222,"props":251,"children":252},{},[253],{"type":35,"value":254},"The toggle's seat",{"type":26,"tag":222,"props":256,"children":257},{},[258,263],{"type":26,"tag":69,"props":259,"children":260},{},[261],{"type":35,"value":262},"The tray menu now",{"type":35,"value":264},"; the app-menu item comes with V1's menu bar.",{"type":26,"tag":195,"props":266,"children":267},{},[268,273,285],{"type":26,"tag":222,"props":269,"children":270},{},[271],{"type":35,"value":272},"3",{"type":26,"tag":222,"props":274,"children":275},{},[276,278,283],{"type":35,"value":277},"Does ",{"type":26,"tag":38,"props":279,"children":281},{"className":280},[],[282],{"type":35,"value":140},{"type":35,"value":284}," turn it on?",{"type":26,"tag":222,"props":286,"children":287},{},[288,293,295,300],{"type":26,"tag":69,"props":289,"children":290},{},[291],{"type":35,"value":292},"No",{"type":35,"value":294},": ",{"type":26,"tag":38,"props":296,"children":298},{"className":297},[],[299],{"type":35,"value":140},{"type":35,"value":301}," allows, the saved choice decides on.",{"type":26,"tag":195,"props":303,"children":304},{},[305,310,315],{"type":26,"tag":222,"props":306,"children":307},{},[308],{"type":35,"value":309},"4",{"type":26,"tag":222,"props":311,"children":312},{},[313],{"type":35,"value":314},"Leaving a Dev page drops it",{"type":26,"tag":222,"props":316,"children":317},{},[318,323],{"type":26,"tag":69,"props":319,"children":320},{},[321],{"type":35,"value":322},"Accepted",{"type":35,"value":324},": one lifecycle for every page; Components forgets the open doc.",{"type":26,"tag":195,"props":326,"children":327},{},[328,333,344],{"type":26,"tag":222,"props":329,"children":330},{},[331],{"type":35,"value":332},"5",{"type":26,"tag":222,"props":334,"children":335},{},[336,342],{"type":26,"tag":38,"props":337,"children":339},{"className":338},[],[340],{"type":35,"value":341},"cargo run -p app",{"type":35,"value":343}," is lean",{"type":26,"tag":222,"props":345,"children":346},{},[347,360,362,368,370,376],{"type":26,"tag":69,"props":348,"children":349},{},[350,352,358],{"type":35,"value":351},"A ",{"type":26,"tag":38,"props":353,"children":355},{"className":354},[],[356],{"type":35,"value":357},"cargo dev",{"type":35,"value":359}," alias",{"type":35,"value":361}," (",{"type":26,"tag":38,"props":363,"children":365},{"className":364},[],[366],{"type":35,"value":367},".cargo\u002Fconfig.toml",{"type":35,"value":369},"): ",{"type":26,"tag":38,"props":371,"children":373},{"className":372},[],[374],{"type":35,"value":375},"cargo dev -- --data synthetic",{"type":35,"value":53},{"type":26,"tag":195,"props":378,"children":379},{},[380,385,390],{"type":26,"tag":222,"props":381,"children":382},{},[383],{"type":35,"value":384},"6",{"type":26,"tag":222,"props":386,"children":387},{},[388],{"type":35,"value":389},"The expert",{"type":26,"tag":222,"props":391,"children":392},{},[393,398],{"type":26,"tag":69,"props":394,"children":395},{},[396],{"type":35,"value":397},"Stays open",{"type":35,"value":399},": who and when are still to be named.",{"type":26,"tag":195,"props":401,"children":402},{},[403,408,413],{"type":26,"tag":222,"props":404,"children":405},{},[406],{"type":35,"value":407},"7",{"type":26,"tag":222,"props":409,"children":410},{},[411],{"type":35,"value":412},"The atlas",{"type":26,"tag":222,"props":414,"children":415},{},[416,421,423,429],{"type":26,"tag":69,"props":417,"children":418},{},[419],{"type":35,"value":420},"Published",{"type":35,"value":422},": thread ",{"type":26,"tag":38,"props":424,"children":426},{"className":425},[],[427],{"type":35,"value":428},"p0-seam",{"type":35,"value":430}," under qnative c3.",{"type":26,"tag":195,"props":432,"children":433},{},[434,439,444],{"type":26,"tag":222,"props":435,"children":436},{},[437],{"type":35,"value":438},"8",{"type":26,"tag":222,"props":440,"children":441},{},[442],{"type":35,"value":443},"A config key that forbids developer mode",{"type":26,"tag":222,"props":445,"children":446},{},[447,452],{"type":26,"tag":69,"props":448,"children":449},{},[450],{"type":35,"value":451},"Stays proposed",{"type":35,"value":453},"; an ask for the sensor's engineer in the Guide.",{"type":26,"tag":195,"props":455,"children":456},{},[457,462,467],{"type":26,"tag":222,"props":458,"children":459},{},[460],{"type":35,"value":461},"9",{"type":26,"tag":222,"props":463,"children":464},{},[465],{"type":35,"value":466},"The launch that quit by itself",{"type":26,"tag":222,"props":468,"children":469},{},[470,475],{"type":26,"tag":69,"props":471,"children":472},{},[473],{"type":35,"value":474},"Watch it",{"type":35,"value":476},"; the runner records the exit status if it recurs.",{"type":26,"tag":195,"props":478,"children":479},{},[480,485,490],{"type":26,"tag":222,"props":481,"children":482},{},[483],{"type":35,"value":484},"10",{"type":26,"tag":222,"props":486,"children":487},{},[488],{"type":35,"value":489},"Idle readings need an idle Mac",{"type":26,"tag":222,"props":491,"children":492},{},[493,498],{"type":26,"tag":69,"props":494,"children":495},{},[496],{"type":35,"value":497},"In the README's recipe",{"type":35,"value":499},", as part of R7.",{"type":26,"tag":55,"props":501,"children":503},{"id":502},"how-to-try-it",[504],{"type":35,"value":15},{"type":26,"tag":506,"props":507,"children":513},"pre",{"className":508,"code":509,"language":510,"meta":511,"style":512},"language-bash","cargo run -p app --features dev -- --data synthetic    # developer mode allowed (debug), on\ncargo run -p app -- --data synthetic                   # the lean build: no Dev group, no tray item\nscripts\u002Fcheck-lean.sh                                  # builds both release variants and proves the lean one carries no developer mode\n","bash","","undefined",[514],{"type":26,"tag":38,"props":515,"children":516},{"__ignoreMap":511},[517],{"type":35,"value":509},{"type":26,"tag":27,"props":519,"children":520},{},[521,523,527,529,535,537,543],{"type":35,"value":522},"In the full build, the tray menu has a ",{"type":26,"tag":69,"props":524,"children":525},{},[526],{"type":35,"value":155},{"type":35,"value":528}," item with a check. Clearing it removes the Dev group. If a Dev page is showing, the window goes to the overview. The choice is saved in ",{"type":26,"tag":38,"props":530,"children":532},{"className":531},[],[533],{"type":35,"value":534},"~\u002FLibrary\u002FApplication Support\u002Fio.qpoint.desktop\u002Fsettings.json",{"type":35,"value":536},"; ",{"type":26,"tag":38,"props":538,"children":540},{"className":539},[],[541],{"type":35,"value":542},"QPOINT_SETTINGS=\u003Cfile>",{"type":35,"value":544}," moves the file.",{"type":26,"tag":55,"props":546,"children":548},{"id":547},"what-was-built",[549],{"type":35,"value":16},{"type":26,"tag":187,"props":551,"children":552},{},[553,574],{"type":26,"tag":191,"props":554,"children":555},{},[556],{"type":26,"tag":195,"props":557,"children":558},{},[559,564,569],{"type":26,"tag":199,"props":560,"children":561},{},[562],{"type":35,"value":563},"Piece",{"type":26,"tag":199,"props":565,"children":566},{},[567],{"type":35,"value":568},"Where",{"type":26,"tag":199,"props":570,"children":571},{},[572],{"type":35,"value":573},"What it does",{"type":26,"tag":215,"props":575,"children":576},{},[577,636,658,718,740,802,828,870,898,919,950,980,1002,1029,1104],{"type":26,"tag":195,"props":578,"children":579},{},[580,585,594],{"type":26,"tag":222,"props":581,"children":582},{},[583],{"type":35,"value":584},"The protocol",{"type":26,"tag":222,"props":586,"children":587},{},[588],{"type":26,"tag":38,"props":589,"children":591},{"className":590},[],[592],{"type":35,"value":593},"crates\u002Flayer\u002Fsrc\u002Fextension.rs",{"type":26,"tag":222,"props":595,"children":596},{},[597,599,605,607,613,615,620,622,627,629,635],{"type":35,"value":598},"An ",{"type":26,"tag":38,"props":600,"children":602},{"className":601},[],[603],{"type":35,"value":604},"Extension",{"type":35,"value":606}," is an id, a group title, the toggle's words and a list of ",{"type":26,"tag":38,"props":608,"children":610},{"className":609},[],[611],{"type":35,"value":612},"Page { path, label, icon, shown, build }",{"type":35,"value":614},". It lives in the layer because ",{"type":26,"tag":38,"props":616,"children":618},{"className":617},[],[619],{"type":35,"value":101},{"type":35,"value":621}," cannot depend on the app: the app depends on ",{"type":26,"tag":38,"props":623,"children":625},{"className":624},[],[626],{"type":35,"value":101},{"type":35,"value":628},", and Cargo refuses a cycle between packages. The component docs use the same shape (",{"type":26,"tag":38,"props":630,"children":632},{"className":631},[],[633],{"type":35,"value":634},"layer::demos::Doc",{"type":35,"value":185},{"type":26,"tag":195,"props":637,"children":638},{},[639,644,653],{"type":26,"tag":222,"props":640,"children":641},{},[642],{"type":35,"value":643},"The registry",{"type":26,"tag":222,"props":645,"children":646},{},[647],{"type":26,"tag":38,"props":648,"children":650},{"className":649},[],[651],{"type":35,"value":652},"crates\u002Fapp\u002Fsrc\u002Fextensions.rs",{"type":26,"tag":222,"props":654,"children":655},{},[656],{"type":35,"value":657},"Keeps the extensions the binary was given and the person's on\u002Foff choice for each. Answers the shell (which groups to draw) and the router (which page a path names). Turning an extension off while its page is showing goes to the overview.",{"type":26,"tag":195,"props":659,"children":660},{},[661,666,675],{"type":26,"tag":222,"props":662,"children":663},{},[664],{"type":35,"value":665},"One route",{"type":26,"tag":222,"props":667,"children":668},{},[669],{"type":26,"tag":38,"props":670,"children":672},{"className":671},[],[673],{"type":35,"value":674},"crates\u002Fapp\u002Fsrc\u002Frouter.rs",{"type":26,"tag":222,"props":676,"children":677},{},[678,684,686,692,694,700,702,708,710,716],{"type":26,"tag":38,"props":679,"children":681},{"className":680},[],[682],{"type":35,"value":683},"Route::DevTools",{"type":35,"value":685}," and ",{"type":26,"tag":38,"props":687,"children":689},{"className":688},[],[690],{"type":35,"value":691},"Route::DevComponents",{"type":35,"value":693}," are gone. ",{"type":26,"tag":38,"props":695,"children":697},{"className":696},[],[698],{"type":35,"value":699},"Route::Ext(path)",{"type":35,"value":701}," addresses any extension page. ",{"type":26,"tag":38,"props":703,"children":705},{"className":704},[],[706],{"type":35,"value":707},"Route::resolve(path, cx)",{"type":35,"value":709}," finds an extension's page where ",{"type":26,"tag":38,"props":711,"children":713},{"className":712},[],[714],{"type":35,"value":715},"from_path",{"type":35,"value":717}," finds the app's own.",{"type":26,"tag":195,"props":719,"children":720},{},[721,726,735],{"type":26,"tag":222,"props":722,"children":723},{},[724],{"type":35,"value":725},"The shell",{"type":26,"tag":222,"props":727,"children":728},{},[729],{"type":26,"tag":38,"props":730,"children":732},{"className":731},[],[733],{"type":35,"value":734},"crates\u002Fapp\u002Fsrc\u002Fshell.rs",{"type":26,"tag":222,"props":736,"children":737},{},[738],{"type":35,"value":739},"No Dev entities at startup. The sidebar draws Inventory, then one group per extension that is on. An extension page is built through the same one-page slot as an Inventory page, so leaving it drops its view.",{"type":26,"tag":195,"props":741,"children":742},{},[743,747,758],{"type":26,"tag":222,"props":744,"children":745},{},[746],{"type":35,"value":155},{"type":26,"tag":222,"props":748,"children":749},{},[750,756],{"type":26,"tag":38,"props":751,"children":753},{"className":752},[],[754],{"type":35,"value":755},"crates\u002Fdevmode",{"type":35,"value":757}," (new)",{"type":26,"tag":222,"props":759,"children":760},{},[761,763,769,771,777,779,785,787,793,794,800],{"type":35,"value":762},"Tools and Components, moved from ",{"type":26,"tag":38,"props":764,"children":766},{"className":765},[],[767],{"type":35,"value":768},"crates\u002Fapp\u002Fsrc\u002Fdev.rs",{"type":35,"value":770}," unchanged apart from where their state lives. ",{"type":26,"tag":38,"props":772,"children":774},{"className":773},[],[775],{"type":35,"value":776},"allowed()",{"type":35,"value":778}," decides from the build and the flags. ",{"type":26,"tag":38,"props":780,"children":782},{"className":781},[],[783],{"type":35,"value":784},"if_allowed(..)",{"type":35,"value":786}," returns the extension or nothing. It depends on ",{"type":26,"tag":38,"props":788,"children":790},{"className":789},[],[791],{"type":35,"value":792},"gpui-kit",{"type":35,"value":685},{"type":26,"tag":38,"props":795,"children":797},{"className":796},[],[798],{"type":35,"value":799},"layer",{"type":35,"value":801}," only.",{"type":26,"tag":195,"props":803,"children":804},{},[805,810,819],{"type":26,"tag":222,"props":806,"children":807},{},[808],{"type":35,"value":809},"The one gate",{"type":26,"tag":222,"props":811,"children":812},{},[813],{"type":26,"tag":38,"props":814,"children":816},{"className":815},[],[817],{"type":35,"value":818},"crates\u002Fapp\u002Fsrc\u002Fmain.rs:79",{"type":26,"tag":222,"props":820,"children":821},{},[822],{"type":26,"tag":38,"props":823,"children":825},{"className":824},[],[826],{"type":35,"value":827},"#[cfg(feature = \"dev\")] extensions.extend(devmode::if_allowed(repo.describe(), cx));",{"type":26,"tag":195,"props":829,"children":830},{},[831,836,845],{"type":26,"tag":222,"props":832,"children":833},{},[834],{"type":35,"value":835},"The feature",{"type":26,"tag":222,"props":837,"children":838},{},[839],{"type":26,"tag":38,"props":840,"children":842},{"className":841},[],[843],{"type":35,"value":844},"crates\u002Fapp\u002FCargo.toml",{"type":26,"tag":222,"props":846,"children":847},{},[848,853,855,861,863,869],{"type":26,"tag":38,"props":849,"children":851},{"className":850},[],[852],{"type":35,"value":101},{"type":35,"value":854}," optional; ",{"type":26,"tag":38,"props":856,"children":858},{"className":857},[],[859],{"type":35,"value":860},"[features] dev = [\"dep:devmode\"]",{"type":35,"value":862},". Not in ",{"type":26,"tag":38,"props":864,"children":866},{"className":865},[],[867],{"type":35,"value":868},"default",{"type":35,"value":53},{"type":26,"tag":195,"props":871,"children":872},{},[873,878,887],{"type":26,"tag":222,"props":874,"children":875},{},[876],{"type":35,"value":877},"The appearance hold",{"type":26,"tag":222,"props":879,"children":880},{},[881],{"type":26,"tag":38,"props":882,"children":884},{"className":883},[],[885],{"type":35,"value":886},"crates\u002Flayer\u002Fsrc\u002Ftheme.rs",{"type":26,"tag":222,"props":888,"children":889},{},[890,896],{"type":26,"tag":38,"props":891,"children":893},{"className":892},[],[894],{"type":35,"value":895},"Appearance",{"type":35,"value":897}," and the \"follow the system unless something holds one\" rule moved from the Dev section to the layer. The shell and the Tools page share it without either knowing the other.",{"type":26,"tag":195,"props":899,"children":900},{},[901,905,914],{"type":26,"tag":222,"props":902,"children":903},{},[904],{"type":35,"value":254},{"type":26,"tag":222,"props":906,"children":907},{},[908],{"type":26,"tag":38,"props":909,"children":911},{"className":910},[],[912],{"type":35,"value":913},"crates\u002Fapp\u002Fsrc\u002Ftray.rs",{"type":26,"tag":222,"props":915,"children":916},{},[917],{"type":35,"value":918},"A checked item per extension, between Open and Quit, with the words the extension gives. None in the lean build.",{"type":26,"tag":195,"props":920,"children":921},{},[922,927,937],{"type":26,"tag":222,"props":923,"children":924},{},[925],{"type":35,"value":926},"Saved choices",{"type":26,"tag":222,"props":928,"children":929},{},[930,936],{"type":26,"tag":38,"props":931,"children":933},{"className":932},[],[934],{"type":35,"value":935},"crates\u002Fapp\u002Fsrc\u002Fsettings.rs",{"type":35,"value":757},{"type":26,"tag":222,"props":938,"children":939},{},[940,942,948],{"type":35,"value":941},"The app's first settings file: ",{"type":26,"tag":38,"props":943,"children":945},{"className":944},[],[946],{"type":35,"value":947},"{\"extensions\": {\"dev\": {\"on\": false}}}",{"type":35,"value":949},". Read once at startup, written when a choice changes. c2's D16 world choice goes beside it (agreed with the c2 session).",{"type":26,"tag":195,"props":951,"children":952},{},[953,958,968],{"type":26,"tag":222,"props":954,"children":955},{},[956],{"type":35,"value":957},"The lean check",{"type":26,"tag":222,"props":959,"children":960},{},[961,967],{"type":26,"tag":38,"props":962,"children":964},{"className":963},[],[965],{"type":35,"value":966},"scripts\u002Fcheck-lean.sh",{"type":35,"value":757},{"type":26,"tag":222,"props":969,"children":970},{},[971,973,978],{"type":35,"value":972},"Builds both release variants. Checks that ",{"type":26,"tag":38,"props":974,"children":976},{"className":975},[],[977],{"type":35,"value":101},{"type":35,"value":979}," is absent from the lean dependency graph and present in the full one, and that eight strings found only in developer mode and the component docs are absent from the lean binary and present in the full one. The full binary is the control: a marker it lacks proves nothing.",{"type":26,"tag":195,"props":981,"children":982},{},[983,988,997],{"type":26,"tag":222,"props":984,"children":985},{},[986],{"type":35,"value":987},"CI",{"type":26,"tag":222,"props":989,"children":990},{},[991],{"type":26,"tag":38,"props":992,"children":994},{"className":993},[],[995],{"type":35,"value":996},".github\u002Fworkflows\u002Fbuild.yml",{"type":26,"tag":222,"props":998,"children":999},{},[1000],{"type":35,"value":1001},"Adds the app's library tests and the lean check on all three OSes. Not yet run (no remote).",{"type":26,"tag":195,"props":1003,"children":1004},{},[1005,1010,1018],{"type":26,"tag":222,"props":1006,"children":1007},{},[1008],{"type":35,"value":1009},"A spike hook",{"type":26,"tag":222,"props":1011,"children":1012},{},[1013],{"type":26,"tag":38,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":35,"value":117},{"type":26,"tag":222,"props":1019,"children":1020},{},[1021,1027],{"type":26,"tag":38,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":35,"value":1026},"QPOINT_SPIKE_OPEN=\u003Cpath>",{"type":35,"value":1028}," opens a page by path at startup. Used for the \"Components shown\" reading.",{"type":26,"tag":195,"props":1030,"children":1031},{},[1032,1037,1046],{"type":26,"tag":222,"props":1033,"children":1034},{},[1035],{"type":35,"value":1036},"Stories",{"type":26,"tag":222,"props":1038,"children":1039},{},[1040],{"type":26,"tag":38,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":35,"value":1045},"crates\u002Fstories",{"type":26,"tag":222,"props":1047,"children":1048},{},[1049,1055,1056,1062,1064,1070,1072,1078,1080,1086,1088,1094,1096,1102],{"type":26,"tag":38,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":35,"value":1054},"app-dev-tools",{"type":35,"value":685},{"type":26,"tag":38,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":35,"value":1061},"app-dev-components",{"type":35,"value":1063}," now go through ",{"type":26,"tag":38,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":35,"value":1069},"Route::Ext",{"type":35,"value":1071},". New: ",{"type":26,"tag":38,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":35,"value":1077},"app-landing-lean",{"type":35,"value":1079},", ",{"type":26,"tag":38,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":35,"value":1085},"app-landing-dev-off",{"type":35,"value":1087}," (identical to the lean one) and ",{"type":26,"tag":38,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":35,"value":1093},"app-dev-tools-off",{"type":35,"value":1095}," (a Dev page asked for while off lands on the overview). Each app story now starts with Info View off. Before this, a story captured after ",{"type":26,"tag":38,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":35,"value":1101},"app-info-*",{"type":35,"value":1103}," inherited its open Info pane (the Dev stories did).",{"type":26,"tag":195,"props":1105,"children":1106},{},[1107,1112,1129],{"type":26,"tag":222,"props":1108,"children":1109},{},[1110],{"type":35,"value":1111},"Records",{"type":26,"tag":222,"props":1113,"children":1114},{},[1115,1121,1123],{"type":26,"tag":38,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":35,"value":1120},"README.md",{"type":35,"value":1122}," (Run it), ",{"type":26,"tag":38,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":35,"value":1128},"guide\u002F02-run-it.md",{"type":26,"tag":222,"props":1130,"children":1131},{},[1132,1134,1139],{"type":35,"value":1133},"The default build is lean; ",{"type":26,"tag":38,"props":1135,"children":1137},{"className":1136},[],[1138],{"type":35,"value":109},{"type":35,"value":1140}," for developers.",{"type":26,"tag":55,"props":1142,"children":1144},{"id":1143},"the-readings",[1145],{"type":35,"value":17},{"type":26,"tag":27,"props":1147,"children":1148},{},[1149,1154],{"type":26,"tag":69,"props":1150,"children":1151},{},[1152],{"type":35,"value":1153},"Method:",{"type":35,"value":1155}," the README recipe (Footprint).",{"type":26,"tag":61,"props":1157,"children":1158},{},[1159,1176,1202,1242,1252,1262],{"type":26,"tag":65,"props":1160,"children":1161},{},[1162,1167,1169,1174],{"type":26,"tag":69,"props":1163,"children":1164},{},[1165],{"type":35,"value":1166},"Builds:",{"type":35,"value":1168}," release builds of this phase's code, lean and full, and of ",{"type":26,"tag":38,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":35,"value":51},{"type":35,"value":1175}," for comparison, each copied under a fresh file name.",{"type":26,"tag":65,"props":1177,"children":1178},{},[1179,1184,1186,1192,1194,1200],{"type":26,"tag":69,"props":1180,"children":1181},{},[1182],{"type":35,"value":1183},"Launch:",{"type":35,"value":1185}," ",{"type":26,"tag":38,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":35,"value":1191},"QPOINT_DATA=synthetic",{"type":35,"value":1193},", a scratch settings file (",{"type":26,"tag":38,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":35,"value":1199},"QPOINT_SETTINGS",{"type":35,"value":1201},"), the window on the first page, the guide on (its default).",{"type":26,"tag":65,"props":1203,"children":1204},{},[1205,1210,1212,1218,1219,1225,1227,1232,1234,1240],{"type":26,"tag":69,"props":1206,"children":1207},{},[1208],{"type":35,"value":1209},"Recording:",{"type":35,"value":1211}," 5 s to settle, then strobe 0.26.0 attached by PID for 60 s, with ",{"type":26,"tag":38,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":35,"value":1217},"footprint",{"type":35,"value":685},{"type":26,"tag":38,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":35,"value":1224},"ps",{"type":35,"value":1226}," as the cross-check. ",{"type":26,"tag":38,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":35,"value":1217},{"type":35,"value":1233}," agreed with strobe's ",{"type":26,"tag":38,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":35,"value":1239},"memory.app.private",{"type":35,"value":1241}," to the megabyte in every reading.",{"type":26,"tag":65,"props":1243,"children":1244},{},[1245,1250],{"type":26,"tag":69,"props":1246,"children":1247},{},[1248],{"type":35,"value":1249},"Machine:",{"type":35,"value":1251}," Apple M2 Max, macOS 15.6 (24G84), on AC power. The window opened on the main display, the Studio Display at 5120 × 2880.",{"type":26,"tag":65,"props":1253,"children":1254},{},[1255,1260],{"type":26,"tag":69,"props":1256,"children":1257},{},[1258],{"type":35,"value":1259},"Order:",{"type":35,"value":1261}," two rounds, every state in each, interleaved.",{"type":26,"tag":65,"props":1263,"children":1264},{},[1265,1270],{"type":26,"tag":69,"props":1266,"children":1267},{},[1268],{"type":35,"value":1269},"Recorded:",{"type":35,"value":1271}," 2026-11-11, 09:10–09:36.",{"type":26,"tag":27,"props":1273,"children":1274},{},[1275,1280,1282,1288],{"type":26,"tag":69,"props":1276,"children":1277},{},[1278],{"type":35,"value":1279},"An idle reading means an idle machine.",{"type":35,"value":1281}," The first reading was taken while the Mac was in use: the launch took focus under a live pointer and read 145 MB at 3.9% of a core. It and the one after it were discarded. From then on, a reading started only after 60 s with no keyboard or pointer input (",{"type":26,"tag":38,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":35,"value":1287},"HIDIdleTime",{"type":35,"value":1289},"). It counted only if there was still no input when it ended, the display was on and the session unlocked; otherwise it was taken again. Four more readings were thrown out that way (62 to 112 MB, 0.05 to 1.7% of a core). The table holds only the ones that counted.",{"type":26,"tag":187,"props":1291,"children":1292},{},[1293,1334],{"type":26,"tag":191,"props":1294,"children":1295},{},[1296],{"type":26,"tag":195,"props":1297,"children":1298},{},[1299,1304,1309,1314,1319,1324,1329],{"type":26,"tag":199,"props":1300,"children":1301},{},[1302],{"type":35,"value":1303},"State",{"type":26,"tag":199,"props":1305,"children":1306},{},[1307],{"type":35,"value":1308},"Private memory",{"type":26,"tag":199,"props":1310,"children":1311},{},[1312],{"type":35,"value":1313},"RSS",{"type":26,"tag":199,"props":1315,"children":1316},{},[1317],{"type":35,"value":1318},"CPU at rest",{"type":26,"tag":199,"props":1320,"children":1321},{},[1322],{"type":35,"value":1323},"Wakes\u002Fs",{"type":26,"tag":199,"props":1325,"children":1326},{},[1327],{"type":35,"value":1328},"First render",{"type":26,"tag":199,"props":1330,"children":1331},{},[1332],{"type":35,"value":1333},"Binary",{"type":26,"tag":215,"props":1335,"children":1336},{},[1337,1386,1450,1504,1562,1599],{"type":26,"tag":195,"props":1338,"children":1339},{},[1340,1350,1358,1363,1368,1373,1378],{"type":26,"tag":222,"props":1341,"children":1342},{},[1343,1348],{"type":26,"tag":69,"props":1344,"children":1345},{},[1346],{"type":35,"value":1347},"1. Lean",{"type":35,"value":1349}," (default build)",{"type":26,"tag":222,"props":1351,"children":1352},{},[1353],{"type":26,"tag":69,"props":1354,"children":1355},{},[1356],{"type":35,"value":1357},"61.6 · 63.0 MB",{"type":26,"tag":222,"props":1359,"children":1360},{},[1361],{"type":35,"value":1362},"76 · 77 MB",{"type":26,"tag":222,"props":1364,"children":1365},{},[1366],{"type":35,"value":1367},"0.0055% (3.3 ms in 60 s) · 0.0042% (2.5 ms)",{"type":26,"tag":222,"props":1369,"children":1370},{},[1371],{"type":35,"value":1372},"0.95 · 0.90",{"type":26,"tag":222,"props":1374,"children":1375},{},[1376],{"type":35,"value":1377},"260 · 277 ms",{"type":26,"tag":222,"props":1379,"children":1380},{},[1381],{"type":26,"tag":69,"props":1382,"children":1383},{},[1384],{"type":35,"value":1385},"23,230,096 B (23.2 MB)",{"type":26,"tag":195,"props":1387,"children":1388},{},[1389,1412,1422,1427,1432,1437,1442],{"type":26,"tag":222,"props":1390,"children":1391},{},[1392,1397,1398,1403,1405,1410],{"type":26,"tag":69,"props":1393,"children":1394},{},[1395],{"type":35,"value":1396},"2. Full, off",{"type":35,"value":361},{"type":26,"tag":38,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":35,"value":109},{"type":35,"value":1404},", no ",{"type":26,"tag":38,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":35,"value":140},{"type":35,"value":1411},": not allowed)",{"type":26,"tag":222,"props":1413,"children":1414},{},[1415,1417],{"type":35,"value":1416},"77.4* · ",{"type":26,"tag":69,"props":1418,"children":1419},{},[1420],{"type":35,"value":1421},"61.0 MB",{"type":26,"tag":222,"props":1423,"children":1424},{},[1425],{"type":35,"value":1426},"79 · 76 MB",{"type":26,"tag":222,"props":1428,"children":1429},{},[1430],{"type":35,"value":1431},"0.033%* · 0.0037% (2.2 ms)",{"type":26,"tag":222,"props":1433,"children":1434},{},[1435],{"type":35,"value":1436},"2.73* · 0.98",{"type":26,"tag":222,"props":1438,"children":1439},{},[1440],{"type":35,"value":1441},"257 · 266 ms",{"type":26,"tag":222,"props":1443,"children":1444},{},[1445],{"type":26,"tag":69,"props":1446,"children":1447},{},[1448],{"type":35,"value":1449},"24,302,656 B (24.3 MB)",{"type":26,"tag":195,"props":1451,"children":1452},{},[1453,1469,1479,1484,1489,1494,1499],{"type":26,"tag":222,"props":1454,"children":1455},{},[1456,1461,1462,1467],{"type":26,"tag":69,"props":1457,"children":1458},{},[1459],{"type":35,"value":1460},"3. Full, on, nothing opened",{"type":35,"value":361},{"type":26,"tag":38,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":35,"value":140},{"type":35,"value":1468},"; the Dev group in the sidebar, the overview showing)",{"type":26,"tag":222,"props":1470,"children":1471},{},[1472,1474],{"type":35,"value":1473},"63.0*† · ",{"type":26,"tag":69,"props":1475,"children":1476},{},[1477],{"type":35,"value":1478},"61.5 MB",{"type":26,"tag":222,"props":1480,"children":1481},{},[1482],{"type":35,"value":1483},"78 · 76 MB",{"type":26,"tag":222,"props":1485,"children":1486},{},[1487],{"type":35,"value":1488},"0.022%* · 0.0046% (2.8 ms)",{"type":26,"tag":222,"props":1490,"children":1491},{},[1492],{"type":35,"value":1493},"2.78* · 1.27",{"type":26,"tag":222,"props":1495,"children":1496},{},[1497],{"type":35,"value":1498},"416† · 279 ms",{"type":26,"tag":222,"props":1500,"children":1501},{},[1502],{"type":35,"value":1503},"24.3 MB",{"type":26,"tag":195,"props":1505,"children":1506},{},[1507,1530,1538,1543,1548,1553,1558],{"type":26,"tag":222,"props":1508,"children":1509},{},[1510,1515,1516,1521,1522,1528],{"type":26,"tag":69,"props":1511,"children":1512},{},[1513],{"type":35,"value":1514},"4. Full, Components shown",{"type":35,"value":361},{"type":26,"tag":38,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":35,"value":140},{"type":35,"value":1079},{"type":26,"tag":38,"props":1523,"children":1525},{"className":1524},[],[1526],{"type":35,"value":1527},"QPOINT_SPIKE_OPEN=\u002Fdev\u002Fcomponents",{"type":35,"value":1529},")",{"type":26,"tag":222,"props":1531,"children":1532},{},[1533],{"type":26,"tag":69,"props":1534,"children":1535},{},[1536],{"type":35,"value":1537},"65.3 · 65.0 MB",{"type":26,"tag":222,"props":1539,"children":1540},{},[1541],{"type":35,"value":1542},"80 · 81 MB",{"type":26,"tag":222,"props":1544,"children":1545},{},[1546],{"type":35,"value":1547},"0.0049% (3.0 ms) · 0.0050% (3.0 ms)",{"type":26,"tag":222,"props":1549,"children":1550},{},[1551],{"type":35,"value":1552},"1.18 · 0.92",{"type":26,"tag":222,"props":1554,"children":1555},{},[1556],{"type":35,"value":1557},"265 · 297 ms",{"type":26,"tag":222,"props":1559,"children":1560},{},[1561],{"type":35,"value":1503},{"type":26,"tag":195,"props":1563,"children":1564},{},[1565,1570,1575,1580,1585,1590,1595],{"type":26,"tag":222,"props":1566,"children":1567},{},[1568],{"type":35,"value":1569},"Extra: full, allowed, turned off in the tray",{"type":26,"tag":222,"props":1571,"children":1572},{},[1573],{"type":35,"value":1574},"62.8 · 61.8 MB",{"type":26,"tag":222,"props":1576,"children":1577},{},[1578],{"type":35,"value":1579},"77 · 76 MB",{"type":26,"tag":222,"props":1581,"children":1582},{},[1583],{"type":35,"value":1584},"0.0039% (2.3 ms) · 0.0061% (3.7 ms)",{"type":26,"tag":222,"props":1586,"children":1587},{},[1588],{"type":35,"value":1589},"0.92 · 0.87",{"type":26,"tag":222,"props":1591,"children":1592},{},[1593],{"type":35,"value":1594},"291 · 276 ms",{"type":26,"tag":222,"props":1596,"children":1597},{},[1598],{"type":35,"value":1503},{"type":26,"tag":195,"props":1600,"children":1601},{},[1602,1619,1624,1628,1633,1638,1643],{"type":26,"tag":222,"props":1603,"children":1604},{},[1605,1607,1612,1614],{"type":35,"value":1606},"For comparison: ",{"type":26,"tag":38,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":35,"value":51},{"type":35,"value":1613}," (before this phase), release, no ",{"type":26,"tag":38,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":35,"value":140},{"type":26,"tag":222,"props":1620,"children":1621},{},[1622],{"type":35,"value":1623},"60.3 · 63.0* MB",{"type":26,"tag":222,"props":1625,"children":1626},{},[1627],{"type":35,"value":1362},{"type":26,"tag":222,"props":1629,"children":1630},{},[1631],{"type":35,"value":1632},"0.0022% (1.3 ms) · 0.040%*",{"type":26,"tag":222,"props":1634,"children":1635},{},[1636],{"type":35,"value":1637},"0.90 · 4.31*",{"type":26,"tag":222,"props":1639,"children":1640},{},[1641],{"type":35,"value":1642},"282 · 284 ms",{"type":26,"tag":222,"props":1644,"children":1645},{},[1646],{"type":35,"value":1647},"24,218,976 B (24.2 MB)",{"type":26,"tag":61,"props":1649,"children":1650},{},[1651,1663,1668,1686],{"type":26,"tag":65,"props":1652,"children":1653},{},[1654,1656,1661],{"type":35,"value":1655},"* ",{"type":26,"tag":69,"props":1657,"children":1658},{},[1659],{"type":35,"value":1660},"The window drew during that minute with no input.",{"type":35,"value":1662}," strobe names the display only when the process drew on the GPU, and in these readings it did. Wakes rise to 2.7–4.3 a second. Once memory rose too: 77.4 MB, all of it in IOSurface (38 MB against 25 MB, seven surfaces against five). Heap and code pages were the same as lean's. Each of these states also has a quiet reading. Nothing in the app asks for those frames at idle; what did was not found.",{"type":26,"tag":65,"props":1664,"children":1665},{},[1666],{"type":35,"value":1667},"† The guide's port was held by another process during that launch, so the guide did not bind. The first render was 416 ms while the machine's load average was 3.8.",{"type":26,"tag":65,"props":1669,"children":1670},{},[1671,1673],{"type":35,"value":1672},"Not in the table:\n",{"type":26,"tag":61,"props":1674,"children":1675},{},[1676,1681],{"type":26,"tag":65,"props":1677,"children":1678},{},[1679],{"type":35,"value":1680},"A third \"turned off\" reading (60.8 MB) is excluded: a second window, a diagnostic launch of mine, was running during it.",{"type":26,"tag":65,"props":1682,"children":1683},{},[1684],{"type":35,"value":1685},"The first \"Components shown\" launch quit by itself about 10 s in. It printed no panic and left no crash report. launchservicesd logged a quit, and none of the app's own quit paths (the tray, the spike hook) logged. It did not recur in three more launches: one diagnostic, then 65.3 and 65.0 MB. It is recorded as unexplained (open call 9).",{"type":26,"tag":65,"props":1687,"children":1688},{},[1689,1691,1697,1699,1705,1706,1712,1714,1720,1721,1727,1729,1735,1736,1742,1744,1750,1751,1757,1759,1765,1766,1772,1773,1778,1779,1785,1786,1792],{"type":35,"value":1690},"Recordings, for ",{"type":26,"tag":38,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":35,"value":1696},"strobe query \u003Crec> …",{"type":35,"value":1698},": lean ",{"type":26,"tag":38,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":35,"value":1704},"rec_dbdd02",{"type":35,"value":1079},{"type":26,"tag":38,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":35,"value":1711},"rec_2ca89b",{"type":35,"value":1713},"; full off ",{"type":26,"tag":38,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":35,"value":1719},"rec_1cc0a8",{"type":35,"value":1079},{"type":26,"tag":38,"props":1722,"children":1724},{"className":1723},[],[1725],{"type":35,"value":1726},"rec_fe426c",{"type":35,"value":1728},"; full on ",{"type":26,"tag":38,"props":1730,"children":1732},{"className":1731},[],[1733],{"type":35,"value":1734},"rec_0773d9",{"type":35,"value":1079},{"type":26,"tag":38,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":35,"value":1741},"rec_15ab21",{"type":35,"value":1743},"; Components ",{"type":26,"tag":38,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":35,"value":1749},"rec_fc1c72",{"type":35,"value":1079},{"type":26,"tag":38,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":35,"value":1756},"rec_1219d3",{"type":35,"value":1758},"; turned off ",{"type":26,"tag":38,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":35,"value":1764},"rec_f9bf3c",{"type":35,"value":1079},{"type":26,"tag":38,"props":1767,"children":1769},{"className":1768},[],[1770],{"type":35,"value":1771},"rec_e612b3",{"type":35,"value":536},{"type":26,"tag":38,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":35,"value":51},{"type":35,"value":1185},{"type":26,"tag":38,"props":1780,"children":1782},{"className":1781},[],[1783],{"type":35,"value":1784},"rec_5055de",{"type":35,"value":1079},{"type":26,"tag":38,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":35,"value":1791},"rec_1e5df4",{"type":35,"value":53},{"type":26,"tag":27,"props":1794,"children":1795},{},[1796],{"type":26,"tag":69,"props":1797,"children":1798},{},[1799],{"type":35,"value":1800},"What the readings say:",{"type":26,"tag":187,"props":1802,"children":1803},{},[1804,1820],{"type":26,"tag":191,"props":1805,"children":1806},{},[1807],{"type":26,"tag":195,"props":1808,"children":1809},{},[1810,1815],{"type":26,"tag":199,"props":1811,"children":1812},{},[1813],{"type":35,"value":1814},"The question (Guide page 7)",{"type":26,"tag":199,"props":1816,"children":1817},{},[1818],{"type":35,"value":1819},"The answer, read",{"type":26,"tag":215,"props":1821,"children":1822},{},[1823,1841,1854,1867,1885,1898],{"type":26,"tag":195,"props":1824,"children":1825},{},[1826,1831],{"type":26,"tag":222,"props":1827,"children":1828},{},[1829],{"type":35,"value":1830},"What the lean build buys (1 against 2)",{"type":26,"tag":222,"props":1832,"children":1833},{},[1834,1839],{"type":26,"tag":69,"props":1835,"children":1836},{},[1837],{"type":35,"value":1838},"1,072,560 bytes of binary",{"type":35,"value":1840},", 4.4% of the full build. At rest, nothing measurable: full-off's quiet reading (61.0) sits within 2 MB of lean's two (61.6, 63.0), inside the launch-to-launch spread.",{"type":26,"tag":195,"props":1842,"children":1843},{},[1844,1849],{"type":26,"tag":222,"props":1845,"children":1846},{},[1847],{"type":35,"value":1848},"What carrying the code costs (2 against 1)",{"type":26,"tag":222,"props":1850,"children":1851},{},[1852],{"type":35,"value":1853},"The same answer from the other side: about 1.07 MB on disk, nothing resident that a reading can see, and no CPU (0.0037% against 0.004–0.0055%).",{"type":26,"tag":195,"props":1855,"children":1856},{},[1857,1862],{"type":26,"tag":222,"props":1858,"children":1859},{},[1860],{"type":35,"value":1861},"What the Dev group costs (3 against 2)",{"type":26,"tag":222,"props":1863,"children":1864},{},[1865],{"type":35,"value":1866},"Nothing measurable: 61.5 MB at 0.0046%, against 61.0 MB at 0.0037%. The group is two sidebar items.",{"type":26,"tag":195,"props":1868,"children":1869},{},[1870,1875],{"type":26,"tag":222,"props":1871,"children":1872},{},[1873],{"type":35,"value":1874},"What looking costs (4 against 3)",{"type":26,"tag":222,"props":1876,"children":1877},{},[1878,1883],{"type":26,"tag":69,"props":1879,"children":1880},{},[1881],{"type":35,"value":1882},"About 3.5 to 4 MB",{"type":35,"value":1884}," while the Components page shows its first doc (65.0 and 65.3 against 61.5), and no CPU at rest. As in c2, showing a page costs more than carrying its code.",{"type":26,"tag":195,"props":1886,"children":1887},{},[1888,1893],{"type":26,"tag":222,"props":1889,"children":1890},{},[1891],{"type":35,"value":1892},"What turning it off buys",{"type":26,"tag":222,"props":1894,"children":1895},{},[1896],{"type":35,"value":1897},"Turned off reads like not allowed and like lean (62.8, 61.8 MB): nothing measurable.",{"type":26,"tag":195,"props":1899,"children":1900},{},[1901,1906],{"type":26,"tag":222,"props":1902,"children":1903},{},[1904],{"type":35,"value":1905},"What the eager construction cost",{"type":26,"tag":222,"props":1907,"children":1908},{},[1909,1911,1916],{"type":35,"value":1910},"Not measurable. ",{"type":26,"tag":38,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":35,"value":51},{"type":35,"value":1917}," built both Dev views at startup and reads 60.3 MB quiet, in the same range. The fix is for the lifecycle rule (a page lives only while it is open), not for the budget.",{"type":26,"tag":27,"props":1919,"children":1920},{},[1921],{"type":35,"value":1922},"Quiet readings range from 60.3 to 63.0 MB across launches of the same binaries, so differences under about 3 MB are not resolved by two readings per state. That is why the at-rest rows say \"nothing measurable\" rather than \"zero\".",{"type":26,"tag":27,"props":1924,"children":1925},{},[1926,1931],{"type":26,"tag":69,"props":1927,"children":1928},{},[1929],{"type":35,"value":1930},"The sentences Guide page 7 allows now:",{"type":35,"value":1932}," \"The production build contains no developer tooling\" (the lean check). \"Where it is allowed, it does no work until it is switched on\" (rows 2, 3 and the extra: no CPU at rest, no memory the readings can see). The third sentence waits for Phase 3's stream readings.",{"type":26,"tag":55,"props":1934,"children":1936},{"id":1935},"the-burden-test-line-by-line",[1937],{"type":35,"value":18},{"type":26,"tag":27,"props":1939,"children":1940},{},[1941],{"type":35,"value":1942},"Mark's condition: the gate must not mess up the structure or become a burden. Failing any line means we ship the switch alone (A) and say so.",{"type":26,"tag":27,"props":1944,"children":1945},{},[1946,1958],{"type":26,"tag":69,"props":1947,"children":1948},{},[1949,1951,1957],{"type":35,"value":1950},"1. The app crate contains exactly one ",{"type":26,"tag":38,"props":1952,"children":1954},{"className":1953},[],[1955],{"type":35,"value":1956},"cfg(feature = \"dev\")",{"type":35,"value":53},{"type":35,"value":1959}," Passes.",{"type":26,"tag":506,"props":1961,"children":1965},{"className":1962,"code":1964,"language":35},[1963],"language-text","$ grep -rn 'cfg(feature' crates\u002Fapp\ncrates\u002Fapp\u002Fsrc\u002Fmain.rs:13:\u002F\u002F! one `cfg(feature = \"dev\")` in this crate is the registration below.\ncrates\u002Fapp\u002Fsrc\u002Fmain.rs:79:            #[cfg(feature = \"dev\")]\n",[1966],{"type":26,"tag":38,"props":1967,"children":1968},{"__ignoreMap":511},[1969],{"type":35,"value":1964},{"type":26,"tag":27,"props":1971,"children":1972},{},[1973,1975,1981,1983,1989,1991,1997,1999,2005,2007,2013],{"type":35,"value":1974},"Line 13 is the doc comment that says so; line 79 is the gate. The crate's other ",{"type":26,"tag":38,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":35,"value":1980},"cfg",{"type":35,"value":1982},"s are ",{"type":26,"tag":38,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":35,"value":1988},"cfg(test)",{"type":35,"value":1990}," on four test modules and ",{"type":26,"tag":38,"props":1992,"children":1994},{"className":1993},[],[1995],{"type":35,"value":1996},"cfg!(target_os)",{"type":35,"value":1998}," for the settings path; the tray backends are chosen by ",{"type":26,"tag":38,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":35,"value":2004},"cfg(target_os)",{"type":35,"value":2006}," tables in its ",{"type":26,"tag":38,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":35,"value":2012},"Cargo.toml",{"type":35,"value":2014},". None is about developer mode.",{"type":26,"tag":27,"props":2016,"children":2017},{},[2018,2037,2039,2045,2047,2053,2054,2060,2062,2068,2070,2075,2077,2082],{"type":26,"tag":69,"props":2019,"children":2020},{},[2021,2023,2028,2030,2035],{"type":35,"value":2022},"2. No page outside ",{"type":26,"tag":38,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":35,"value":101},{"type":35,"value":2029}," needs a ",{"type":26,"tag":38,"props":2031,"children":2033},{"className":2032},[],[2034],{"type":35,"value":1980},{"type":35,"value":2036}," to compile lean.",{"type":35,"value":2038}," Passes. No ",{"type":26,"tag":38,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":35,"value":2044},"cfg(feature …)",{"type":35,"value":2046}," exists anywhere in the workspace outside ",{"type":26,"tag":38,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":35,"value":2052},"main.rs:79",{"type":35,"value":361},{"type":26,"tag":38,"props":2055,"children":2057},{"className":2056},[],[2058],{"type":35,"value":2059},"grep -rn 'cfg(feature' crates --include='*.rs'",{"type":35,"value":2061},"). The component docs (",{"type":26,"tag":38,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":35,"value":2067},"layer::demos",{"type":35,"value":2069},", 2,250 lines) needed no gate either. Nothing in the lean binary reaches them, so the linker drops them: their three markers are absent from the lean binary and present in the full one. The stories crate depends on ",{"type":26,"tag":38,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":35,"value":101},{"type":35,"value":2076}," always, needs no ",{"type":26,"tag":38,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":35,"value":1980},{"type":35,"value":2083},", and draws the shell with developer mode on, off and absent.",{"type":26,"tag":27,"props":2085,"children":2086},{},[2087,2092],{"type":26,"tag":69,"props":2088,"children":2089},{},[2090],{"type":35,"value":2091},"3. Both variants build and pass their stories in CI, and a check proves the lean binary carries no dev strings.",{"type":35,"value":2093}," Passes on this Mac; CI not run.",{"type":26,"tag":61,"props":2095,"children":2096},{},[2097,2124,2145,2191],{"type":26,"tag":65,"props":2098,"children":2099},{},[2100,2102,2108,2110,2115,2117,2123],{"type":35,"value":2101},"Both variants build with no warnings, in debug (",{"type":26,"tag":38,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":35,"value":2107},"cargo build -p app",{"type":35,"value":2109},", and the same with ",{"type":26,"tag":38,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":35,"value":109},{"type":35,"value":2116},") and in release (the same with ",{"type":26,"tag":38,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":35,"value":2122},"--release --locked",{"type":35,"value":185},{"type":26,"tag":65,"props":2125,"children":2126},{},[2127,2129,2135,2137,2143],{"type":35,"value":2128},"Tests: ",{"type":26,"tag":38,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":35,"value":2134},"cargo test --locked --workspace --exclude app",{"type":35,"value":2136},": 32 passed, the stories crate's 10 among them (the seven doc-page click tests and the title-bar drag tests). ",{"type":26,"tag":38,"props":2138,"children":2140},{"className":2139},[],[2141],{"type":35,"value":2142},"cargo test --locked -p app --lib",{"type":35,"value":2144},": 11 passed, 3 of them new for the settings file (a choice survives a restart; an unreadable file means nothing was chosen; in-memory settings write nothing).",{"type":26,"tag":65,"props":2146,"children":2147},{},[2148,2150,2156,2158,2174,2176,2181,2183,2189],{"type":35,"value":2149},"Stories: ",{"type":26,"tag":38,"props":2151,"children":2153},{"className":2152},[],[2154],{"type":35,"value":2155},"cargo run --release -p stories",{"type":35,"value":2157}," captured all 85 stories in light and dark (170 PNGs) with no failures. ",{"type":26,"tag":69,"props":2159,"children":2160},{},[2161,2166,2167,2172],{"type":26,"tag":38,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":35,"value":1077},{"type":35,"value":685},{"type":26,"tag":38,"props":2168,"children":2170},{"className":2169},[],[2171],{"type":35,"value":1085},{"type":35,"value":2173}," are byte-identical",{"type":35,"value":2175}," in both modes (SHA-256 of the PNGs), so developer mode turned off draws exactly the lean build's window. ",{"type":26,"tag":38,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":35,"value":1093},{"type":35,"value":2182}," asks for ",{"type":26,"tag":38,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":35,"value":2188},"\u002Fdev\u002Ftools",{"type":35,"value":2190}," while developer mode is off and lands on the overview with no Dev group.",{"type":26,"tag":65,"props":2192,"children":2193},{},[2194],{"type":35,"value":2195},"The lean check passes on the final code:",{"type":26,"tag":506,"props":2197,"children":2200},{"className":2198,"code":2199,"language":35},[1963],"devmode in the dependency graph: lean 0, full 1  ok\n\"Developer mode\"                                          0      1  ok\n\"Component demos\"                                         0      1  ok\n\"GPUI's element inspector\"                                0      1  ok\n\"Follow the system's light or dark setting, or hold one while reviewing\"      0      1  ok\n\"\u002Fdev\u002Fcomponents\"                                         0      1  ok\n\"Every web component the Inventory section uses\"          0      1  ok\n\"Our 21 roles, light and dark\"                            0      1  ok\n\"The kit's components together in the Qpoint theme\"       0      1  ok\nlean 23,230,112 bytes · full 24,302,672 bytes · lean check: passed\n",[2201],{"type":26,"tag":38,"props":2202,"children":2203},{"__ignoreMap":511},[2204],{"type":35,"value":2199},{"type":26,"tag":61,"props":2206,"children":2207},{},[2208,2220],{"type":26,"tag":65,"props":2209,"children":2210},{},[2211,2213,2218],{"type":35,"value":2212},"The first run of the check failed, and the failure was useful. The marker \"Debug builds only\" (17 bytes) was missing from the ",{"type":26,"tag":69,"props":2214,"children":2215},{},[2216],{"type":35,"value":2217},"full",{"type":35,"value":2219}," binary: the optimiser had built that string in registers instead of storing it whole. The control caught it, and the markers are now long strings. A lean binary that lacked the markers for the same reason would have passed falsely; the control rules that out.",{"type":26,"tag":65,"props":2221,"children":2222},{},[2223,2228],{"type":26,"tag":69,"props":2224,"children":2225},{},[2226],{"type":35,"value":2227},"What is not proved yet:",{"type":35,"value":2229}," the workflow has never run, so Linux and Windows are unproven, and so is the claim that their linkers strip the component docs as Apple's does (see the expert's question 3). It runs once the repository exists.",{"type":26,"tag":27,"props":2231,"children":2232},{},[2233,2238],{"type":26,"tag":69,"props":2234,"children":2235},{},[2236],{"type":35,"value":2237},"4. Moving today's Tools and Components behind the seam takes one sitting, and leaves the Inventory pages untouched.",{"type":35,"value":1959},{"type":26,"tag":61,"props":2240,"children":2241},{},[2242,2247,2274],{"type":26,"tag":65,"props":2243,"children":2244},{},[2245],{"type":35,"value":2246},"One sitting. The first edit was at 08:55:59. The lean release build began at 08:59:57, after both debug variants compiled clean and the workspace tests passed. Reading the code beforehand took part of the same session.",{"type":26,"tag":65,"props":2248,"children":2249},{},[2250,2252,2257,2259,2265,2267,2272],{"type":35,"value":2251},"The size of it: 20 files, +815 \u002F −71 lines before the records. Most of that is new: the ",{"type":26,"tag":38,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":35,"value":101},{"type":35,"value":2258}," crate (257 lines, mostly the moved ",{"type":26,"tag":38,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":35,"value":2264},"dev.rs",{"type":35,"value":2266},"), the registry (90), settings (80, then tests), the protocol (65), the check (61). ",{"type":26,"tag":38,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":35,"value":2264},{"type":35,"value":2273}," (245 lines) is deleted.",{"type":26,"tag":65,"props":2275,"children":2276},{},[2277,2282,2284,2290,2292,2298],{"type":26,"tag":69,"props":2278,"children":2279},{},[2280],{"type":35,"value":2281},"The Inventory pages are untouched:",{"type":35,"value":2283}," no page file changed. The one line under ",{"type":26,"tag":38,"props":2285,"children":2287},{"className":2286},[],[2288],{"type":35,"value":2289},"crates\u002Fapp\u002Fsrc\u002Fpages\u002F",{"type":35,"value":2291}," is the dispatcher's arm for the dev routes in ",{"type":26,"tag":38,"props":2293,"children":2295},{"className":2294},[],[2296],{"type":35,"value":2297},"pages\u002Fmod.rs",{"type":35,"value":2299},":",{"type":26,"tag":506,"props":2301,"children":2305},{"className":2302,"code":2303,"language":2304,"meta":511,"style":512},"language-diff","-        Route::DevTools | Route::DevComponents => return None,\n+        Route::Ext(_) => return None,\n","diff",[2306],{"type":26,"tag":38,"props":2307,"children":2308},{"__ignoreMap":511},[2309],{"type":35,"value":2303},{"type":26,"tag":61,"props":2311,"children":2312},{},[2313],{"type":26,"tag":65,"props":2314,"children":2315},{},[2316],{"type":35,"value":2317},"The guide, the tour and the app map needed no change: none of them named a Dev page.",{"type":26,"tag":27,"props":2319,"children":2320},{},[2321,2326],{"type":26,"tag":69,"props":2322,"children":2323},{},[2324],{"type":35,"value":2325},"Verdict: B, the switch and the lean build, as ruled.",{"type":35,"value":2327}," Nothing has to be forced: no line needed a workaround, and the one surprise (the marker) was the check doing its job. The switch-only fallback (A) is not needed.",{"type":26,"tag":55,"props":2329,"children":2331},{"id":2330},"for-the-rust-expert",[2332],{"type":35,"value":19},{"type":26,"tag":27,"props":2334,"children":2335},{},[2336],{"type":35,"value":2337},"The gate is a working decision made by people who are not Rust engineers (Mark, ruling 1: \"switch + lean build seems right to me, but let's document as an un-informed decisions for a rust expert to be sure to review in case they want to follow a different course for other reasons\"). Here is what was built and the questions we would like judged. The five questions in Guide page 1 stand; this adds what Phase 0 found.",{"type":26,"tag":2339,"props":2340,"children":2341},"ol",{},[2342,2415,2478,2562,2633,2643,2661,2692],{"type":26,"tag":65,"props":2343,"children":2344},{},[2345,2350,2351,2356,2358,2364,2365,2370,2372,2377,2379,2384,2385,2391,2393,2398,2400,2406,2407,2413],{"type":26,"tag":69,"props":2346,"children":2347},{},[2348],{"type":35,"value":2349},"Where the protocol lives.",{"type":35,"value":1185},{"type":26,"tag":38,"props":2352,"children":2354},{"className":2353},[],[2355],{"type":35,"value":101},{"type":35,"value":2357}," cannot depend on ",{"type":26,"tag":38,"props":2359,"children":2361},{"className":2360},[],[2362],{"type":35,"value":2363},"app",{"type":35,"value":294},{"type":26,"tag":38,"props":2366,"children":2368},{"className":2367},[],[2369],{"type":35,"value":2363},{"type":35,"value":2371}," depends on ",{"type":26,"tag":38,"props":2373,"children":2375},{"className":2374},[],[2376],{"type":35,"value":101},{"type":35,"value":2378}," optionally, and Cargo refuses a cycle between packages even across lib and bin. So the protocol (",{"type":26,"tag":38,"props":2380,"children":2382},{"className":2381},[],[2383],{"type":35,"value":604},{"type":35,"value":1079},{"type":26,"tag":38,"props":2386,"children":2388},{"className":2387},[],[2389],{"type":35,"value":2390},"Page",{"type":35,"value":2392},") sits in ",{"type":26,"tag":38,"props":2394,"children":2396},{"className":2395},[],[2397],{"type":35,"value":799},{"type":35,"value":2399},", and so does the appearance hold the Tools page and the shell share. Would a small dedicated crate (",{"type":26,"tag":38,"props":2401,"children":2403},{"className":2402},[],[2404],{"type":35,"value":2405},"shell-api",{"type":35,"value":1079},{"type":26,"tag":38,"props":2408,"children":2410},{"className":2409},[],[2411],{"type":35,"value":2412},"ext",{"type":35,"value":2414},") be cleaner than putting app plumbing in a component crate?",{"type":26,"tag":65,"props":2416,"children":2417},{},[2418,2423,2425,2431,2433,2439,2441,2446,2448,2453,2455,2460,2462,2468,2470,2476],{"type":26,"tag":69,"props":2419,"children":2420},{},[2421],{"type":35,"value":2422},"Shared app state across the seam.",{"type":35,"value":2424}," An extension cannot read the app's globals. For example, ",{"type":26,"tag":38,"props":2426,"children":2428},{"className":2427},[],[2429],{"type":35,"value":2430},"RepoHandle",{"type":35,"value":2432},", the process's one data nozzle, is in ",{"type":26,"tag":38,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":35,"value":2438},"app::router",{"type":35,"value":2440},". Today ",{"type":26,"tag":38,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":35,"value":101},{"type":35,"value":2447}," is handed the data source's description as a string when it registers. Phase 2's Sensor page must ",{"type":26,"tag":31,"props":2449,"children":2450},{},[2451],{"type":35,"value":2452},"swap",{"type":35,"value":2454}," the nozzle (c131 D16), so ",{"type":26,"tag":38,"props":2456,"children":2458},{"className":2457},[],[2459],{"type":35,"value":2430},{"type":35,"value":2461}," has to move somewhere both crates see (",{"type":26,"tag":38,"props":2463,"children":2465},{"className":2464},[],[2466],{"type":35,"value":2467},"nozzle",{"type":35,"value":2469}," behind a ",{"type":26,"tag":38,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":35,"value":2475},"gpui",{"type":35,"value":2477}," feature, the layer, or the crate in question 1). Which one?",{"type":26,"tag":65,"props":2479,"children":2480},{},[2481,2486,2487,2492,2494,2499,2501,2507,2508,2514,2516,2522,2524,2530,2532,2538,2540,2545,2547,2553,2555,2560],{"type":26,"tag":69,"props":2482,"children":2483},{},[2484],{"type":35,"value":2485},"Dead-stripping is what removes the component docs.",{"type":35,"value":1185},{"type":26,"tag":38,"props":2488,"children":2490},{"className":2489},[],[2491],{"type":35,"value":2067},{"type":35,"value":2493}," is compiled into ",{"type":26,"tag":38,"props":2495,"children":2497},{"className":2496},[],[2498],{"type":35,"value":799},{"type":35,"value":2500}," in both variants and has no gate. It is absent from the lean binary because nothing reaches it: thin LTO, ",{"type":26,"tag":38,"props":2502,"children":2504},{"className":2503},[],[2505],{"type":35,"value":2506},"codegen-units = 1",{"type":35,"value":1079},{"type":26,"tag":38,"props":2509,"children":2511},{"className":2510},[],[2512],{"type":35,"value":2513},"strip = true",{"type":35,"value":2515},", and Apple's ",{"type":26,"tag":38,"props":2517,"children":2519},{"className":2518},[],[2520],{"type":35,"value":2521},"ld -dead_strip",{"type":35,"value":2523},". Is that dependable on Linux (",{"type":26,"tag":38,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":35,"value":2529},"--gc-sections",{"type":35,"value":2531},") and Windows (",{"type":26,"tag":38,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":35,"value":2537},"\u002FOPT:REF",{"type":35,"value":2539},"), or should ",{"type":26,"tag":38,"props":2541,"children":2543},{"className":2542},[],[2544],{"type":35,"value":799},{"type":35,"value":2546}," gate ",{"type":26,"tag":38,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":35,"value":2552},"demos",{"type":35,"value":2554}," behind its own feature that ",{"type":26,"tag":38,"props":2556,"children":2558},{"className":2557},[],[2559],{"type":35,"value":101},{"type":35,"value":2561}," turns on? The check will tell on CI; we would like a view before relying on it.",{"type":26,"tag":65,"props":2563,"children":2564},{},[2565,2570,2572,2577,2579,2584,2586,2592,2594,2600,2602,2607,2609,2615,2617,2623,2625,2631],{"type":26,"tag":69,"props":2566,"children":2567},{},[2568],{"type":35,"value":2569},"Feature unification.",{"type":35,"value":2571}," The lean build is ",{"type":26,"tag":38,"props":2573,"children":2575},{"className":2574},[],[2576],{"type":35,"value":2107},{"type":35,"value":2578},". If any workspace member ever depends on ",{"type":26,"tag":38,"props":2580,"children":2582},{"className":2581},[],[2583],{"type":35,"value":2363},{"type":35,"value":2585}," with ",{"type":26,"tag":38,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":35,"value":2591},"features = [\"dev\"]",{"type":35,"value":2593},", a ",{"type":26,"tag":38,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":35,"value":2599},"cargo build --workspace",{"type":35,"value":2601}," would quietly be full. The stories crate avoids this: it depends on ",{"type":26,"tag":38,"props":2603,"children":2605},{"className":2604},[],[2606],{"type":35,"value":101},{"type":35,"value":2608}," directly, not on ",{"type":26,"tag":38,"props":2610,"children":2612},{"className":2611},[],[2613],{"type":35,"value":2614},"app\u002Fdev",{"type":35,"value":2616},". Is a guard worth having, such as a ",{"type":26,"tag":38,"props":2618,"children":2620},{"className":2619},[],[2621],{"type":35,"value":2622},"cargo tree",{"type":35,"value":2624}," check in CI (the lean check already runs one per variant) or a ",{"type":26,"tag":38,"props":2626,"children":2628},{"className":2627},[],[2629],{"type":35,"value":2630},"compile_error!",{"type":35,"value":2632}," in a release profile?",{"type":26,"tag":65,"props":2634,"children":2635},{},[2636,2641],{"type":26,"tag":69,"props":2637,"children":2638},{},[2639],{"type":35,"value":2640},"Teardown.",{"type":35,"value":2642}," An extension page is a view in the shell's one page slot, so leaving it drops the entity. Guide question 4 asks whether dropping an entity is a dependable way to close a stream. Phase 0 has no stream yet, but every Dev page now lives this way. A side effect: the Components page no longer remembers which doc was open after you leave it.",{"type":26,"tag":65,"props":2644,"children":2645},{},[2646,2651,2653,2659],{"type":26,"tag":69,"props":2647,"children":2648},{},[2649],{"type":35,"value":2650},"The proof.",{"type":35,"value":2652}," CI builds both variants and checks the dependency graph and the strings. Is there a stronger check, for example symbols in an unstripped lean build, or ",{"type":26,"tag":38,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":35,"value":2658},"cargo bloat",{"type":35,"value":2660}," crate shares?",{"type":26,"tag":65,"props":2662,"children":2663},{},[2664,2669,2671,2676,2678,2683,2685,2690],{"type":26,"tag":69,"props":2665,"children":2666},{},[2667],{"type":35,"value":2668},"The default.",{"type":35,"value":2670}," Lean by default means ",{"type":26,"tag":38,"props":2672,"children":2674},{"className":2673},[],[2675],{"type":35,"value":341},{"type":35,"value":2677}," no longer shows the Dev pages, even in debug. Developers now type ",{"type":26,"tag":38,"props":2679,"children":2681},{"className":2680},[],[2682],{"type":35,"value":109},{"type":35,"value":2684},". Is a Cargo alias (",{"type":26,"tag":38,"props":2686,"children":2688},{"className":2687},[],[2689],{"type":35,"value":367},{"type":35,"value":2691},") the usual answer, or is it better to keep the friction visible?",{"type":26,"tag":65,"props":2693,"children":2694},{},[2695,2700,2702,2708,2709,2715],{"type":26,"tag":69,"props":2696,"children":2697},{},[2698],{"type":35,"value":2699},"The tray toggle.",{"type":35,"value":2701}," It is a ",{"type":26,"tag":38,"props":2703,"children":2705},{"className":2704},[],[2706],{"type":35,"value":2707},"muda",{"type":35,"value":1185},{"type":26,"tag":38,"props":2710,"children":2712},{"className":2711},[],[2713],{"type":35,"value":2714},"CheckMenuItem",{"type":35,"value":2716},". On macOS, muda flips the check itself on a click; the app then sets it to the state it holds. Linux (ksni) and Windows are not exercised.",{"type":26,"tag":55,"props":2718,"children":2720},{"id":2719},"open-calls-for-mark",[2721],{"type":35,"value":20},{"type":26,"tag":2339,"props":2723,"children":2724},{},[2725,2742,2751,2794,2804,2826,2835,2852,2861,2879],{"type":26,"tag":65,"props":2726,"children":2727},{},[2728,2733,2735,2740],{"type":26,"tag":69,"props":2729,"children":2730},{},[2731],{"type":35,"value":2732},"B confirmed: keep it?",{"type":35,"value":2734}," Recommended: yes. The readings and the four lines say it costs one seam and a second CI build, with no ",{"type":26,"tag":38,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":35,"value":1980},{"type":35,"value":2741}," creep.",{"type":26,"tag":65,"props":2743,"children":2744},{},[2745,2749],{"type":26,"tag":69,"props":2746,"children":2747},{},[2748],{"type":35,"value":254},{"type":35,"value":2750}," (ruling 8, \"to confirm at the Phase 0 review stop\"). Built in the tray menu, which exists in both window and tray-only modes. The app has no menu bar yet, so the proposed app-menu item is not built. Add an app menu now, or when V1 adds one?",{"type":26,"tag":65,"props":2752,"children":2753},{},[2754,2764,2766,2771,2773,2778,2780,2785,2787,2792],{"type":26,"tag":69,"props":2755,"children":2756},{},[2757,2758,2763],{"type":35,"value":277},{"type":26,"tag":38,"props":2759,"children":2761},{"className":2760},[],[2762],{"type":35,"value":140},{"type":35,"value":284},{"type":35,"value":2765}," Built: no. ",{"type":26,"tag":38,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":35,"value":140},{"type":35,"value":2772}," makes developer mode ",{"type":26,"tag":31,"props":2774,"children":2775},{},[2776],{"type":35,"value":2777},"allowed",{"type":35,"value":2779},"; the saved choice decides ",{"type":26,"tag":31,"props":2781,"children":2782},{},[2783],{"type":35,"value":2784},"on",{"type":35,"value":2786},". The first time, with nothing saved, it is on. Once the person turns it off, it stays off even with ",{"type":26,"tag":38,"props":2788,"children":2790},{"className":2789},[],[2791],{"type":35,"value":140},{"type":35,"value":2793},". Keep that, or should a flag also switch it on?",{"type":26,"tag":65,"props":2795,"children":2796},{},[2797,2802],{"type":26,"tag":69,"props":2798,"children":2799},{},[2800],{"type":35,"value":2801},"Leaving a Dev page drops it.",{"type":35,"value":2803}," The Components page forgets the open doc when you leave, like any page. The lifecycle rule (a feed lives only while its page is open) wants this for Live and Monitor. Accept it for Components too?",{"type":26,"tag":65,"props":2805,"children":2806},{},[2807,2817,2819,2824],{"type":26,"tag":69,"props":2808,"children":2809},{},[2810,2815],{"type":26,"tag":38,"props":2811,"children":2813},{"className":2812},[],[2814],{"type":35,"value":341},{"type":35,"value":2816}," is lean now.",{"type":35,"value":2818}," It changes every developer's habit and every session's commands (the c2 session knows). Add a ",{"type":26,"tag":38,"props":2820,"children":2822},{"className":2821},[],[2823],{"type":35,"value":357},{"type":35,"value":2825}," alias, or leave it?",{"type":26,"tag":65,"props":2827,"children":2828},{},[2829,2833],{"type":26,"tag":69,"props":2830,"children":2831},{},[2832],{"type":35,"value":389},{"type":35,"value":2834}," (open after the walk, 1): who and when. This file, Guide page 1 and the readings are what they would be shown.",{"type":26,"tag":65,"props":2836,"children":2837},{},[2838,2843,2845,2850],{"type":26,"tag":69,"props":2839,"children":2840},{},[2841],{"type":35,"value":2842},"The atlas.",{"type":35,"value":2844}," The stories for this stop (lean, off, Tools, Components) were captured locally, not published to design's atlas. Publish them as thread ",{"type":26,"tag":38,"props":2846,"children":2848},{"className":2847},[],[2849],{"type":35,"value":428},{"type":35,"value":2851},"?",{"type":26,"tag":65,"props":2853,"children":2854},{},[2855,2859],{"type":26,"tag":69,"props":2856,"children":2857},{},[2858],{"type":35,"value":443},{"type":35,"value":2860}," on a company's machines: still proposed, not built.",{"type":26,"tag":65,"props":2862,"children":2863},{},[2864,2869,2871,2877],{"type":26,"tag":69,"props":2865,"children":2866},{},[2867],{"type":35,"value":2868},"One launch quit by itself.",{"type":35,"value":2870}," The first \"Components shown\" launch ended about 10 s in. No panic, no crash report, and none of the app's quit paths logged; launchservicesd logged a quit. Three more launches of the same binary in the same state ran their full minute. Unexplained. It is worth watching rather than chasing now: if it recurs, the runner records the exit status (",{"type":26,"tag":38,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":35,"value":2876},"measure2.sh",{"type":35,"value":2878},": a signal against a clean quit).",{"type":26,"tag":65,"props":2880,"children":2881},{},[2882,2887],{"type":26,"tag":69,"props":2883,"children":2884},{},[2885],{"type":35,"value":2886},"Idle readings need an idle Mac.",{"type":35,"value":2888}," Each launch takes focus. A reading is taken only after a minute without input and is retaken if anyone touches the machine. Should the recipe in the README say so? Proposed: yes, as a rule of R7.",{"type":26,"tag":55,"props":2890,"children":2892},{"id":2891},"not-done-here",[2893],{"type":35,"value":21},{"type":26,"tag":61,"props":2895,"children":2896},{},[2897,2902,2907],{"type":26,"tag":65,"props":2898,"children":2899},{},[2900],{"type":35,"value":2901},"Phases 1 to 7. No stream, no Sensor or Config page, no Live or Monitor.",{"type":26,"tag":65,"props":2903,"children":2904},{},[2905],{"type":35,"value":2906},"CI on three OSes: no remote (ruling 7; who creates the repository is open).",{"type":26,"tag":65,"props":2908,"children":2909},{},[2910],{"type":35,"value":2911},"The app menu (open call 2).",{"type":26,"tag":2913,"props":2914,"children":2915},"style",{},[2916],{"type":35,"value":511},1794599291978]