[{"data":1,"prerenderedAt":1169},["ShallowReactive",2],{"cycle-doc-qnative-c2-review-tour.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":20},{"id":5,"title":6},"c2","Expressive Range",{"id":8,"label":9},"qnative","Qnative (provisional)","review-tour.md","Review stop: the Tour stretch",[13,14,15,16,17,18,19],"How to try it","What the DOM did, and what stands in","The pieces","Decided rather than copied (the spec's oddities)","The budget","Open, for you","Ruled (2026-11-11, design c131 D20) and built",{"type":21,"children":22},"root",[23,68,74,79,169,174,464,469,667,672,710,715,736,851,914,919,1089,1094,1164],{"type":24,"tag":25,"props":26,"children":27},"element","p",{},[28],{"type":24,"tag":29,"props":30,"children":31},"em",{},[32,35,42,44,50,52,58,60,66],{"type":33,"value":34},"text","2026-11-11. Design c131 Phase 2, \"Stretch: the Tour guide\". The lab's tour layer (design c125 v5 · Panel, with c123's tour type) runs natively over the Inventory section: the engine, one new tour (\"What's on this machine\"), Info View, and the ",{"type":24,"tag":36,"props":37,"children":39},"code",{"className":38},[],[40],{"type":33,"value":41},"qpoint-guide",{"type":33,"value":43}," MCP driving the window through an endpoint inside the app. Measured against the lab on design ",{"type":24,"tag":36,"props":45,"children":47},{"className":46},[],[48],{"type":33,"value":49},":3000",{"type":33,"value":51}," at 1120 × 720 (",{"type":24,"tag":36,"props":53,"children":55},{"className":54},[],[56],{"type":33,"value":57},"spec-tour.md",{"type":33,"value":59},"). 22 captures in the atlas, thread ",{"type":24,"tag":36,"props":61,"children":63},{"className":62},[],[64],{"type":33,"value":65},"p2-tour",{"type":33,"value":67},".",{"type":24,"tag":69,"props":70,"children":72},"h2",{"id":71},"how-to-try-it",[73],{"type":33,"value":13},{"type":24,"tag":25,"props":75,"children":76},{},[77],{"type":33,"value":78},"The tour starts from the guide (or a story); there is no launcher on the pages yet.",{"type":24,"tag":80,"props":81,"children":82},"ul",{},[83,110,127,144],{"type":24,"tag":84,"props":85,"children":86},"li",{},[87,93,95,101,103,109],{"type":24,"tag":88,"props":89,"children":90},"strong",{},[91],{"type":33,"value":92},"Run the app:",{"type":33,"value":94}," ",{"type":24,"tag":36,"props":96,"children":98},{"className":97},[],[99],{"type":33,"value":100},"QPOINT_DATA=synthetic cargo run -p app",{"type":33,"value":102},". It logs ",{"type":24,"tag":36,"props":104,"children":106},{"className":105},[],[107],{"type":33,"value":108},"guide: MCP on http:\u002F\u002F127.0.0.1:7891\u002Fmcp",{"type":33,"value":67},{"type":24,"tag":84,"props":111,"children":112},{},[113,118,119,125],{"type":24,"tag":88,"props":114,"children":115},{},[116],{"type":33,"value":117},"Connect a harness:",{"type":33,"value":94},{"type":24,"tag":36,"props":120,"children":122},{"className":121},[],[123],{"type":33,"value":124},"claude mcp add --transport http qpoint-guide-native http:\u002F\u002F127.0.0.1:7891\u002Fmcp",{"type":33,"value":126},", then ask it for the tour, or where anything is.",{"type":24,"tag":84,"props":128,"children":129},{},[130,135,136,142],{"type":24,"tag":88,"props":131,"children":132},{},[133],{"type":33,"value":134},"Check the map and the tours against the running app:",{"type":33,"value":94},{"type":24,"tag":36,"props":137,"children":139},{"className":138},[],[140],{"type":33,"value":141},"scripts\u002Fguide-check.py",{"type":33,"value":143},". It opens all 16 pages and checks every region the map names; then it walks all 9 tour steps and checks each step's targets. 117 of 117 pass.",{"type":24,"tag":84,"props":145,"children":146},{},[147,152,153,159,161,167],{"type":24,"tag":88,"props":148,"children":149},{},[150],{"type":33,"value":151},"Turn the endpoint off:",{"type":33,"value":94},{"type":24,"tag":36,"props":154,"children":156},{"className":155},[],[157],{"type":33,"value":158},"QPOINT_GUIDE=off",{"type":33,"value":160},". ",{"type":24,"tag":36,"props":162,"children":164},{"className":163},[],[165],{"type":33,"value":166},"QPOINT_GUIDE_PORT",{"type":33,"value":168}," moves it.",{"type":24,"tag":69,"props":170,"children":172},{"id":171},"what-the-dom-did-and-what-stands-in",[173],{"type":33,"value":14},{"type":24,"tag":175,"props":176,"children":177},"table",{},[178,197],{"type":24,"tag":179,"props":180,"children":181},"thead",{},[182],{"type":24,"tag":183,"props":184,"children":185},"tr",{},[186,192],{"type":24,"tag":187,"props":188,"children":189},"th",{},[190],{"type":33,"value":191},"The lab leans on",{"type":24,"tag":187,"props":193,"children":194},{},[195],{"type":33,"value":196},"Natively",{"type":24,"tag":198,"props":199,"children":200},"tbody",{},[201,266,286,299,312,333,360,387,406,425,444],{"type":24,"tag":183,"props":202,"children":203},{},[204,216],{"type":24,"tag":205,"props":206,"children":207},"td",{},[208,214],{"type":24,"tag":36,"props":209,"children":211},{"className":210},[],[212],{"type":33,"value":213},"data-qp-id",{"type":33,"value":215}," found by selector, measured every frame",{"type":24,"tag":205,"props":217,"children":218},{},[219,225,227,233,235,241,243,248,250,256,258,264],{"type":24,"tag":36,"props":220,"children":222},{"className":221},[],[223],{"type":33,"value":224},".qp_id(\"models.band\")",{"type":33,"value":226}," on any element (",{"type":24,"tag":36,"props":228,"children":230},{"className":229},[],[231],{"type":33,"value":232},".key(..)",{"type":33,"value":234}," for a row, ",{"type":24,"tag":36,"props":236,"children":238},{"className":237},[],[239],{"type":33,"value":240},".text(..)",{"type":33,"value":242}," for what it says). A wrapper that adds ",{"type":24,"tag":88,"props":244,"children":245},{},[246],{"type":33,"value":247},"no layout node",{"type":33,"value":249},": it hands the child's layout to the parent and records the child's box in prepaint into a per-window registry. Bands key their cards, and tables key their rows, by name (",{"type":24,"tag":36,"props":251,"children":253},{"className":252},[],[254],{"type":33,"value":255},"models.row",{"type":33,"value":257},", ",{"type":24,"tag":36,"props":259,"children":261},{"className":260},[],[262],{"type":33,"value":263},"harness.session.row",{"type":33,"value":265},").",{"type":24,"tag":183,"props":267,"children":268},{},[269,274],{"type":24,"tag":205,"props":270,"children":271},{},[272],{"type":33,"value":273},"A rAF loop re-measuring targets",{"type":24,"tag":205,"props":275,"children":276},{},[277,279,284],{"type":33,"value":278},"The overlay is the window's last deferred draw. Its prepaint commits the frame's boxes, so the dim and the ring paint from ",{"type":24,"tag":88,"props":280,"children":281},{},[282],{"type":33,"value":283},"this",{"type":33,"value":285}," frame with no lag. Callouts are built in render from the last frame. The overlay asks for one more frame only when a box it placed against has moved, so a still tour costs nothing idle.",{"type":24,"tag":183,"props":287,"children":288},{},[289,294],{"type":24,"tag":205,"props":290,"children":291},{},[292],{"type":33,"value":293},"Ring: a bordered div with a box-shadow",{"type":24,"tag":205,"props":295,"children":296},{},[297],{"type":33,"value":298},"Two quads: 2 px at radius 10, and a 6 px band at 0.3 for the glow.",{"type":24,"tag":183,"props":300,"children":301},{},[302,307],{"type":24,"tag":205,"props":303,"children":304},{},[305],{"type":33,"value":306},"Dim: an SVG with rounded holes",{"type":24,"tag":205,"props":308,"children":309},{},[310],{"type":33,"value":311},"One even-odd path with a 10 px rounded hole per focus box.",{"type":24,"tag":183,"props":313,"children":314},{},[315,328],{"type":24,"tag":205,"props":316,"children":317},{},[318,320,326],{"type":33,"value":319},"Fade: walk the DOM, set ",{"type":24,"tag":36,"props":321,"children":323},{"className":322},[],[324],{"type":33,"value":325},"opacity",{"type":33,"value":327}," on siblings",{"type":24,"tag":205,"props":329,"children":330},{},[331],{"type":33,"value":332},"The same path in the page's own background at 0.72. Over that background this is exactly what opacity 0.28 looks like, and the page isn't restyled.",{"type":24,"tag":183,"props":334,"children":335},{},[336,341],{"type":24,"tag":205,"props":337,"children":338},{},[339],{"type":33,"value":340},"Floating UI + the obstacle score",{"type":24,"tag":205,"props":342,"children":343},{},[344,350,352,358],{"type":24,"tag":36,"props":345,"children":347},{"className":346},[],[348],{"type":33,"value":349},"place()",{"type":33,"value":351},": the preferred side, then top, bottom, right and left, ",{"type":24,"tag":36,"props":353,"children":355},{"className":354},[],[356],{"type":33,"value":357},"-start",{"type":33,"value":359}," aligned, shifted to stay 12 px inside the safe area. Each side is scored by its area outside the safe area plus its overlap with obstacles. The callout's size comes from the text system, so there is no frame of lag.",{"type":24,"tag":183,"props":361,"children":362},{},[363,374],{"type":24,"tag":205,"props":364,"children":365},{},[366,372],{"type":24,"tag":36,"props":367,"children":369},{"className":368},[],[370],{"type":33,"value":371},"scrollIntoView",{"type":33,"value":373},", the eased glide",{"type":24,"tag":205,"props":375,"children":376},{},[377,379,385],{"type":33,"value":378},"Each region remembers the scroller it was drawn inside. The glide is the web's: band 80, ",{"type":24,"tag":36,"props":380,"children":382},{"className":381},[],[383],{"type":33,"value":384},"min(1600, 700 + 0.6·d)",{"type":33,"value":386}," ms, ease-in-out quint, and it gives way when the person scrolls.",{"type":24,"tag":183,"props":388,"children":389},{},[390,401],{"type":24,"tag":205,"props":391,"children":392},{},[393,399],{"type":24,"tag":36,"props":394,"children":396},{"className":395},[],[397],{"type":33,"value":398},"\u003Chtml>",{"type":33,"value":400}," padding for Split",{"type":24,"tag":205,"props":402,"children":403},{},[404],{"type":33,"value":405},"The dock is a 420 px column in the window's row; the page narrows beside it.",{"type":24,"tag":183,"props":407,"children":408},{},[409,420],{"type":24,"tag":205,"props":410,"children":411},{},[412,414],{"type":33,"value":413},"The rail's ",{"type":24,"tag":36,"props":415,"children":417},{"className":416},[],[418],{"type":33,"value":419},"data-qp-key",{"type":24,"tag":205,"props":421,"children":422},{},[423],{"type":33,"value":424},"The kit's sidebar item can't be wrapped, so a zero-size probe in its suffix records the item's row against the sidebar column.",{"type":24,"tag":183,"props":426,"children":427},{},[428,439],{"type":24,"tag":205,"props":429,"children":430},{},[431,437],{"type":24,"tag":36,"props":432,"children":434},{"className":433},[],[435],{"type":33,"value":436},"innerText",{"type":33,"value":438}," for read-page and point",{"type":24,"tag":205,"props":440,"children":441},{},[442],{"type":33,"value":443},"Each region supplies its own text. A region without any reads as the text of the regions drawn inside it, and a named table reads as its rows.",{"type":24,"tag":183,"props":445,"children":446},{},[447,452],{"type":24,"tag":205,"props":448,"children":449},{},[450],{"type":33,"value":451},"The dev server's MCP route + an SSE relay to the tab",{"type":24,"tag":205,"props":453,"children":454},{},[455,457,462],{"type":33,"value":456},"A loopback HTTP server in the app on its own thread: Streamable HTTP with JSON responses, sessions, and Origin checked. It hands each call to the main thread over a channel. ",{"type":24,"tag":88,"props":458,"children":459},{},[460],{"type":33,"value":461},"Same 16 tool names, same arguments, same instructions",{"type":33,"value":463}," (fleet words translated). No tool presses anything.",{"type":24,"tag":69,"props":465,"children":467},{"id":466},"the-pieces",[468],{"type":33,"value":15},{"type":24,"tag":80,"props":470,"children":471},{},[472,525,551,587,657],{"type":24,"tag":84,"props":473,"children":474},{},[475,480,482,488,490],{"type":24,"tag":88,"props":476,"children":477},{},[478],{"type":33,"value":479},"Tours as data",{"type":33,"value":481}," (",{"type":24,"tag":36,"props":483,"children":485},{"className":484},[],[486],{"type":33,"value":487},"crates\u002Fapp\u002Ftours\u002F*.json",{"type":33,"value":489},").\n",{"type":24,"tag":80,"props":491,"children":492},{},[493,506],{"type":24,"tag":84,"props":494,"children":495},{},[496,498,504],{"type":33,"value":497},"c123's ",{"type":24,"tag":36,"props":499,"children":501},{"className":500},[],[502],{"type":33,"value":503},"Tour",{"type":33,"value":505}," type, mirrored in serde: stops, steps, ring, callouts, spots, and blocks (lede, ask, numbers, list, expect, yours, note, route).",{"type":24,"tag":84,"props":507,"children":508},{},[509,511,516,517,523],{"type":33,"value":510},"A step's numbers and texts name ",{"type":24,"tag":88,"props":512,"children":513},{},[514],{"type":33,"value":515},"facts",{"type":33,"value":481},{"type":24,"tag":36,"props":518,"children":520},{"className":519},[],[521],{"type":33,"value":522},"{models.top.share}",{"type":33,"value":524},"), worked out from the same repositories and period the pages read. A route can name a fact too: the harness step opens the busiest harness's own page.",{"type":24,"tag":84,"props":526,"children":527},{},[528,533],{"type":24,"tag":88,"props":529,"children":530},{},[531],{"type":33,"value":532},"The native tour, \"What's on this machine\".",{"type":24,"tag":80,"props":534,"children":535},{},[536,541,546],{"type":24,"tag":84,"props":537,"children":538},{},[539],{"type":33,"value":540},"7 stops and 9 steps over the Inventory: the overview, Providers, Harnesses, one harness (with three spots), Models, MCP servers, Tools, Skills, Workspaces.",{"type":24,"tag":84,"props":542,"children":543},{},[544],{"type":33,"value":545},"Next and Back move through it; a stop marker goes to that stop's first step.",{"type":24,"tag":84,"props":547,"children":548},{},[549],{"type":33,"value":550},"The person's own click onto the next step's page advances it (follow the page).",{"type":24,"tag":84,"props":552,"children":553},{},[554,559],{"type":24,"tag":88,"props":555,"children":556},{},[557],{"type":33,"value":558},"The panel, v5 at the spec's numbers.",{"type":24,"tag":80,"props":560,"children":561},{},[562,567,572,577,582],{"type":24,"tag":84,"props":563,"children":564},{},[565],{"type":33,"value":566},"Split (420) or Float (400, radius 14, on the side the web's rule picks).",{"type":24,"tag":84,"props":568,"children":569},{},[570],{"type":33,"value":571},"The header: \"Tour : name ▾\" with the tour menu, minimize, ✕.",{"type":24,"tag":84,"props":573,"children":574},{},[575],{"type":33,"value":576},"The stop bar and \"n of N\", then the label, title and description, the \"So, today\" line, the spots, and the \"on another page\" box.",{"type":24,"tag":84,"props":578,"children":579},{},[580],{"type":33,"value":581},"Back outlined; Next filled, labelled the web's way.",{"type":24,"tag":84,"props":583,"children":584},{},[585],{"type":33,"value":586},"Minimized to the 48 px circle. The lab's placeholder route mark is drawn as paths: the kit's bundled icons have none, and bundling all of Lucide would grow the binary.",{"type":24,"tag":84,"props":588,"children":589},{},[590,595],{"type":24,"tag":88,"props":591,"children":592},{},[593],{"type":33,"value":594},"The unscripted guide.",{"type":24,"tag":80,"props":596,"children":597},{},[598,609,619,630],{"type":24,"tag":84,"props":599,"children":600},{},[601,607],{"type":24,"tag":36,"props":602,"children":604},{"className":603},[],[605],{"type":33,"value":606},"find-in-app",{"type":33,"value":608}," searches a native app map (16 pages, 108 regions, 13 concepts for one machine) with the web's scoring, ported as is.",{"type":24,"tag":84,"props":610,"children":611},{},[612,617],{"type":24,"tag":88,"props":613,"children":614},{},[615],{"type":33,"value":616},"The map's rows come from the data",{"type":33,"value":618},": each provider, harness, model, server, skill, tool and workspace on this machine, each opening its own page. The web's are a fixture.",{"type":24,"tag":84,"props":620,"children":621},{},[622,628],{"type":24,"tag":36,"props":623,"children":625},{"className":624},[],[626],{"type":33,"value":627},"open-page",{"type":33,"value":629}," rings the way in the sidebar for 1.6 s, then opens the page (1.8 s in all; the web measured 1.75 s).",{"type":24,"tag":84,"props":631,"children":632},{},[633,639,641,647,649,655],{"type":24,"tag":36,"props":634,"children":636},{"className":635},[],[637],{"type":33,"value":638},"point",{"type":33,"value":640}," and ",{"type":24,"tag":36,"props":642,"children":644},{"className":643},[],[645],{"type":33,"value":646},"highlight",{"type":33,"value":648}," ring any region; ",{"type":24,"tag":36,"props":650,"children":652},{"className":651},[],[653],{"type":33,"value":654},"read-page",{"type":33,"value":656}," lists what's on screen.",{"type":24,"tag":84,"props":658,"children":659},{},[660,665],{"type":24,"tag":88,"props":661,"children":662},{},[663],{"type":33,"value":664},"Info View, native first.",{"type":33,"value":666}," \"Info\" in the footer opens a pane that says what the region under the pointer is: the same map entries, the live rows, and a quiet ring on the region. The web hasn't built it (c125 objective 1).",{"type":24,"tag":69,"props":668,"children":670},{"id":669},"decided-rather-than-copied-the-specs-oddities",[671],{"type":33,"value":16},{"type":24,"tag":80,"props":673,"children":674},{},[675,680,685,695,700,705],{"type":24,"tag":84,"props":676,"children":677},{},[678],{"type":33,"value":679},"A step's callout keeps off the sidebar: the web's safe area lets it sit over the rail.",{"type":24,"tag":84,"props":681,"children":682},{},[683],{"type":33,"value":684},"The guide's pointer gets a safe area, and its own region as its one obstacle. The web gives it none.",{"type":24,"tag":84,"props":686,"children":687},{},[688,693],{"type":24,"tag":88,"props":689,"children":690},{},[691],{"type":33,"value":692},"Dark Dim darkens:",{"type":33,"value":694}," black at 0.55. The lab's #73858F tint lightens a dark page.",{"type":24,"tag":84,"props":696,"children":697},{},[698],{"type":33,"value":699},"Stops are looked up by number, not index.",{"type":24,"tag":84,"props":701,"children":702},{},[703],{"type":33,"value":704},"A picked spot keeps its border's width.",{"type":24,"tag":84,"props":706,"children":707},{},[708],{"type":33,"value":709},"The first route the window shows isn't a move by the person.",{"type":24,"tag":69,"props":711,"children":713},{"id":712},"the-budget",[714],{"type":33,"value":17},{"type":24,"tag":25,"props":716,"children":717},{},[718,720,726,728,734],{"type":33,"value":719},"Release builds, c1's recipe (strobe for 60 s after a 5 s settle, ",{"type":24,"tag":36,"props":721,"children":723},{"className":722},[],[724],{"type":33,"value":725},"QPOINT_DATA=synthetic",{"type":33,"value":727},"), today, the review-stop-3 build (",{"type":24,"tag":36,"props":729,"children":731},{"className":730},[],[732],{"type":33,"value":733},"cdf3bf0",{"type":33,"value":735},") interleaved with this one:",{"type":24,"tag":175,"props":737,"children":738},{},[739,758],{"type":24,"tag":179,"props":740,"children":741},{},[742],{"type":24,"tag":183,"props":743,"children":744},{},[745,748,753],{"type":24,"tag":187,"props":746,"children":747},{},[],{"type":24,"tag":187,"props":749,"children":750},{},[751],{"type":33,"value":752},"Review stop 3",{"type":24,"tag":187,"props":754,"children":755},{},[756],{"type":33,"value":757},"The Tour stretch",{"type":24,"tag":198,"props":759,"children":760},{},[761,779,797,815,833],{"type":24,"tag":183,"props":762,"children":763},{},[764,769,774],{"type":24,"tag":205,"props":765,"children":766},{},[767],{"type":33,"value":768},"Binary",{"type":24,"tag":205,"props":770,"children":771},{},[772],{"type":33,"value":773},"23.2 MB",{"type":24,"tag":205,"props":775,"children":776},{},[777],{"type":33,"value":778},"24.2 MB (+1.05 MB: the guide, the tour, the map and the tour as JSON; tiny_http was already in the tree for the fixture plane)",{"type":24,"tag":183,"props":780,"children":781},{},[782,787,792],{"type":24,"tag":205,"props":783,"children":784},{},[785],{"type":33,"value":786},"Private memory, window idle on the overview (the second interleaved pair)",{"type":24,"tag":205,"props":788,"children":789},{},[790],{"type":33,"value":791},"62.9 MB",{"type":24,"tag":205,"props":793,"children":794},{},[795],{"type":33,"value":796},"63.0 MB",{"type":24,"tag":183,"props":798,"children":799},{},[800,805,810],{"type":24,"tag":205,"props":801,"children":802},{},[803],{"type":33,"value":804},"CPU, idle",{"type":24,"tag":205,"props":806,"children":807},{},[808],{"type":33,"value":809},"0.006 % of a core",{"type":24,"tag":205,"props":811,"children":812},{},[813],{"type":33,"value":814},"0.007 %",{"type":24,"tag":183,"props":816,"children":817},{},[818,823,828],{"type":24,"tag":205,"props":819,"children":820},{},[821],{"type":33,"value":822},"Wakes per second",{"type":24,"tag":205,"props":824,"children":825},{},[826],{"type":33,"value":827},"1.2",{"type":24,"tag":205,"props":829,"children":830},{},[831],{"type":33,"value":832},"1.1",{"type":24,"tag":183,"props":834,"children":835},{},[836,841,846],{"type":24,"tag":205,"props":837,"children":838},{},[839],{"type":33,"value":840},"A tour open on Providers (Dim, a callout), idle",{"type":24,"tag":205,"props":842,"children":843},{},[844],{"type":33,"value":845},"—",{"type":24,"tag":205,"props":847,"children":848},{},[849],{"type":33,"value":850},"91 MB, 0.004 %, 0.9 wakes a second",{"type":24,"tag":80,"props":852,"children":853},{},[854,871,881],{"type":24,"tag":84,"props":855,"children":856},{},[857,862,864,870],{"type":24,"tag":88,"props":858,"children":859},{},[860],{"type":33,"value":861},"A tour costs nothing at idle.",{"type":33,"value":863}," The overlay asks for a frame only when a box it placed against has moved. The guide's thread sleeps in ",{"type":24,"tag":36,"props":865,"children":867},{"className":866},[],[868],{"type":33,"value":869},"accept",{"type":33,"value":67},{"type":24,"tag":84,"props":872,"children":873},{},[874,879],{"type":24,"tag":88,"props":875,"children":876},{},[877],{"type":33,"value":878},"The readings drift across a session.",{"type":33,"value":880}," The review-stop-3 build read 76 MB earlier today and 62 MB yesterday. One reading of the tour build caught someone using the window: 127 MB, the level the app reaches once every page has been shown, at 7 % of a core. So builds are compared interleaved, in one session.",{"type":24,"tag":84,"props":882,"children":883},{},[884,889,890,896,898,904,906,912],{"type":24,"tag":88,"props":885,"children":886},{},[887],{"type":33,"value":888},"Recordings:",{"type":33,"value":94},{"type":24,"tag":36,"props":891,"children":893},{"className":892},[],[894],{"type":33,"value":895},"rec_c37e45",{"type":33,"value":897}," (stop 3) and ",{"type":24,"tag":36,"props":899,"children":901},{"className":900},[],[902],{"type":33,"value":903},"rec_29b1ad",{"type":33,"value":905}," (the tour build), the second pair; ",{"type":24,"tag":36,"props":907,"children":909},{"className":908},[],[910],{"type":33,"value":911},"rec_36b9a3",{"type":33,"value":913}," (the tour open).",{"type":24,"tag":69,"props":915,"children":917},{"id":916},"open-for-you",[918],{"type":33,"value":18},{"type":24,"tag":920,"props":921,"children":922},"ol",{},[923,941,958,998,1008,1026,1044],{"type":24,"tag":84,"props":924,"children":925},{},[926,931,933,939],{"type":24,"tag":88,"props":927,"children":928},{},[929],{"type":33,"value":930},"No launcher on the pages.",{"type":33,"value":932}," The tour starts from the guide or a story. The web's launcher is a lab page (",{"type":24,"tag":36,"props":934,"children":936},{"className":935},[],[937],{"type":33,"value":938},"\u002Fpages\u002Fphase4\u002Ftours",{"type":33,"value":940},"). Natively it could be a button in the sidebar's header, or the overview's.",{"type":24,"tag":84,"props":942,"children":943},{},[944,949,951,956],{"type":24,"tag":88,"props":945,"children":946},{},[947],{"type":33,"value":948},"The docked panel leaves the page 488 px at 1120.",{"type":33,"value":950}," The web does the same: its reference capture shows the MCP table clipped. Here the bands' devices overflow at that width (Tokens' legend runs into Spend), which the layer never had to handle. Natively the window could ",{"type":24,"tag":88,"props":952,"children":953},{},[954],{"type":33,"value":955},"grow by the dock's 420 px",{"type":33,"value":957}," when a tour docks and give it back after. Or keep the page narrow and fix the bands' overflow.",{"type":24,"tag":84,"props":959,"children":960},{},[961,966,967,973,975,981,983,989,991,996],{"type":24,"tag":88,"props":962,"children":963},{},[964],{"type":33,"value":965},"The one-prompt run by a real harness is owed.",{"type":33,"value":94},{"type":24,"tag":36,"props":968,"children":970},{"className":969},[],[971],{"type":33,"value":972},"claude -p",{"type":33,"value":974}," here failed on the CLI's own expired login, so the guide was driven over MCP by ",{"type":24,"tag":36,"props":976,"children":978},{"className":977},[],[979],{"type":33,"value":980},"mcp.sh",{"type":33,"value":982}," (curl) and ",{"type":24,"tag":36,"props":984,"children":986},{"className":985},[],[987],{"type":33,"value":988},"guide-check.py",{"type":33,"value":990},". Run ",{"type":24,"tag":36,"props":992,"children":994},{"className":993},[],[995],{"type":33,"value":124},{"type":33,"value":997}," and ask for the tour.",{"type":24,"tag":84,"props":999,"children":1000},{},[1001,1006],{"type":24,"tag":88,"props":1002,"children":1003},{},[1004],{"type":33,"value":1005},"The endpoint is on by default, on loopback.",{"type":33,"value":1007}," Any local process can drive the window: it can navigate, ring and point, but never press. For V1: a token, or off unless asked?",{"type":24,"tag":84,"props":1009,"children":1010},{},[1011,1016,1018,1024],{"type":24,"tag":88,"props":1012,"children":1013},{},[1014],{"type":33,"value":1015},"Keyboard.",{"type":33,"value":1017}," As on the web, Esc and the arrows do nothing. Natively ⌘",{"type":24,"tag":1019,"props":1020,"children":1021},"span",{},[1022],{"type":33,"value":1023}," and ⌘",{"type":33,"value":1025}," (or ← →) could move the tour while it has focus.",{"type":24,"tag":84,"props":1027,"children":1028},{},[1029,1034,1036,1042],{"type":24,"tag":88,"props":1030,"children":1031},{},[1032],{"type":33,"value":1033},"Waiting at this stop, from your D15–D17 rulings",{"type":33,"value":1035}," (design c131): recut and rename the worlds, so nina-mbp is the quiet default laptop and priya's is the ",{"type":24,"tag":36,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":33,"value":1041},"pilot",{"type":33,"value":1043}," world; and the settings switch for the world. The first violation tour, the one D15 names, comes with c137. It uses this engine; \"What's on this machine\" is the plan's Inventory tour.",{"type":24,"tag":84,"props":1045,"children":1046},{},[1047,1052],{"type":24,"tag":88,"props":1048,"children":1049},{},[1050],{"type":33,"value":1051},"Not ported:",{"type":24,"tag":80,"props":1053,"children":1054},{},[1055,1060,1065,1084],{"type":24,"tag":84,"props":1056,"children":1057},{},[1058],{"type":33,"value":1059},"Examples and drills: render functions over live components; natively they would be stories.",{"type":24,"tag":84,"props":1061,"children":1062},{},[1063],{"type":33,"value":1064},"The tour menu lists only the native tour; the lab's five are governance tours over pages this app doesn't have.",{"type":24,"tag":84,"props":1066,"children":1067},{},[1068,1070,1076,1077,1083],{"type":33,"value":1069},"The step action (",{"type":24,"tag":36,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":33,"value":1075},"stage",{"type":33,"value":257},{"type":24,"tag":36,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":33,"value":1082},"drill",{"type":33,"value":265},{"type":24,"tag":84,"props":1085,"children":1086},{},[1087],{"type":33,"value":1088},"The chrome tint: the native window has no sticky chrome above the scrim except the pinned band, which the safe area already keeps clear of.",{"type":24,"tag":69,"props":1090,"children":1092},{"id":1091},"ruled-2026-11-11-design-c131-d20-and-built",[1093],{"type":33,"value":19},{"type":24,"tag":920,"props":1095,"children":1096},{},[1097,1107,1117,1134,1144,1154],{"type":24,"tag":84,"props":1098,"children":1099},{},[1100,1105],{"type":24,"tag":88,"props":1101,"children":1102},{},[1103],{"type":33,"value":1104},"The launcher:",{"type":33,"value":1106}," a Getting started (Help) section in the sidebar, gathering the tours with the other ways in. Built.",{"type":24,"tag":84,"props":1108,"children":1109},{},[1110,1115],{"type":24,"tag":88,"props":1111,"children":1112},{},[1113],{"type":33,"value":1114},"The panel floats, locked to the window's right edge, never docked",{"type":33,"value":1116},"; resizing reveals what it covers. Built; when a step's highlight is under the panel, the panel says to widen the window.",{"type":24,"tag":84,"props":1118,"children":1119},{},[1120,1125,1127,1133],{"type":24,"tag":88,"props":1121,"children":1122},{},[1123],{"type":33,"value":1124},"The real-harness run:",{"type":33,"value":1126}," done the same evening. Claude Code connected with the token and, from one prompt, started the tour, opened Models by way of the sidebar, pointed at the model list and answered from the live rows. Ten turns, 18 s, no errors, nothing pressed (",{"type":24,"tag":36,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":33,"value":1132},"harness-run.md",{"type":33,"value":265},{"type":24,"tag":84,"props":1135,"children":1136},{},[1137,1142],{"type":24,"tag":88,"props":1138,"children":1139},{},[1140],{"type":33,"value":1141},"The endpoint stays on, with a per-launch token",{"type":33,"value":1143}," the agent must present (shown in Help). Built.",{"type":24,"tag":84,"props":1145,"children":1146},{},[1147,1152],{"type":24,"tag":88,"props":1148,"children":1149},{},[1150],{"type":33,"value":1151},"Keys while the panel has focus:",{"type":33,"value":1153}," ← → move, Esc closes, the mouse still works. Built.",{"type":24,"tag":84,"props":1155,"children":1156},{},[1157,1162],{"type":24,"tag":88,"props":1158,"children":1159},{},[1160],{"type":33,"value":1161},"The D15–D17 hand-on",{"type":33,"value":1163}," follows. D15 and D16 are built; D17 and the violation tour wait on qcontrol and c137.",{"type":24,"tag":25,"props":1165,"children":1166},{},[1167],{"type":33,"value":1168},"The record is in CYCLE.md, under \"Mark's rulings on both review stops, built\".",1794599291973]