[{"data":1,"prerenderedAt":638},["ShallowReactive",2],{"$fWtRl-MELRDVuEoofKpr_KrJ9JsB5HTCzczOE8XmrVBY":3},{"newThing":4,"project":5,"cycle":9,"sections":24,"threads":604,"otherDocs":608,"documents":612,"images":620,"archiveItems":635,"links":636},"View contexts — wrapper components that pre-configure QMap (QMapPolicyViolation)",{"id":6,"label":7,"liveBase":8},"qmap","Qmap",null,{"id":10,"num":11,"dir":12,"name":13,"title":14,"focus":15,"status":16,"statusNote":8,"created":17,"completed":8,"mode":8,"report":8,"recordless":18,"thumbnail":19,"imageCount":20,"artifactCount":21,"lastActivity":22,"hasPickup":18,"hasInitialPrompt":23},"c16",16,"c16.view-contexts","view-contexts","View Contexts","View context abstraction + policy violation view","archived","2025-03-18",false,"\u002Fcycles\u002Fqmap\u002Fc16-policy-violation-settled.png",3,4,"2026-08-15",true,[25,53,501],{"key":26,"title":27,"empty":18,"ast":28},"why","Why",{"type":29,"children":30},"root",[31,48],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46],{"type":37,"value":38},"text","QMap is a production component (c15) with a props-driven API: ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"\u003CQMap :actors :dataflows :groupBy \u002F>",{"type":37,"value":47},". But different consumers need fundamentally different configurations — a policy violation page needs a focused, non-interactive view highlighting specific actors, while a dashboard needs the full interactive map.",{"type":32,"tag":33,"props":49,"children":50},{},[51],{"type":37,"value":52},"This cycle explores the right \"view context\" abstraction and implements the first real view: policy violation.",{"key":54,"title":55,"empty":18,"ast":56},"extra","What Was Built",{"type":29,"children":57},[58,65,76,118,124,171,191,198,211,289,295,434,440],{"type":32,"tag":59,"props":60,"children":62},"h3",{"id":61},"config-object-pattern-validated",[63],{"type":37,"value":64},"Config Object Pattern (validated)",{"type":32,"tag":33,"props":66,"children":67},{},[68,74],{"type":32,"tag":40,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"createViewContext(overrides)",{"type":37,"value":75}," returns a plain object with two parts:",{"type":32,"tag":77,"props":78,"children":79},"ul",{},[80,104],{"type":32,"tag":81,"props":82,"children":83},"li",{},[84,94,96,102],{"type":32,"tag":85,"props":86,"children":87},"strong",{},[88],{"type":32,"tag":40,"props":89,"children":91},{"className":90},[],[92],{"type":37,"value":93},"qmapProps",{"type":37,"value":95}," — props passed directly to ",{"type":32,"tag":40,"props":97,"children":99},{"className":98},[],[100],{"type":37,"value":101},"\u003CQMap>",{"type":37,"value":103}," (width, height, selectable, etc.)",{"type":32,"tag":81,"props":105,"children":106},{},[107,116],{"type":32,"tag":85,"props":108,"children":109},{},[110],{"type":32,"tag":40,"props":111,"children":113},{"className":112},[],[114],{"type":37,"value":115},"behavior",{"type":37,"value":117}," — wrapper-level config (highlights, cameraPreset, interactive, groupBy)",{"type":32,"tag":59,"props":119,"children":121},{"id":120},"policy-violation-view-functional",[122],{"type":37,"value":123},"Policy Violation View (functional)",{"type":32,"tag":33,"props":125,"children":126},{},[127,138,140,146,148,154,156,162,163,169],{"type":32,"tag":85,"props":128,"children":129},{},[130,132],{"type":37,"value":131},"New QMap prop: ",{"type":32,"tag":40,"props":133,"children":135},{"className":134},[],[136],{"type":37,"value":137},"highlightedDataflows",{"type":37,"value":139}," — an array of dataflow objects with a semantic ",{"type":32,"tag":40,"props":141,"children":143},{"className":142},[],[144],{"type":37,"value":145},"status",{"type":37,"value":147}," field (e.g., ",{"type":32,"tag":40,"props":149,"children":151},{"className":150},[],[152],{"type":37,"value":153},"\"violation\"",{"type":37,"value":155},", ",{"type":32,"tag":40,"props":157,"children":159},{"className":158},[],[160],{"type":37,"value":161},"\"healthy\"",{"type":37,"value":155},{"type":32,"tag":40,"props":164,"children":166},{"className":165},[],[167],{"type":37,"value":168},"\"warning\"",{"type":37,"value":170},"). QMap renders these flows immediately on load (no click required), maps the status to visual treatment (color, thickness), and highlights the involved actors while dimming the rest.",{"type":32,"tag":33,"props":172,"children":173},{},[174,176,182,184,189],{"type":37,"value":175},"The wrapper says ",{"type":32,"tag":177,"props":178,"children":179},"em",{},[180],{"type":37,"value":181},"what",{"type":37,"value":183}," the dataflow represents, QMap decides ",{"type":32,"tag":177,"props":185,"children":186},{},[187],{"type":37,"value":188},"how",{"type":37,"value":190}," to render it.",{"type":32,"tag":192,"props":193,"children":195},"h4",{"id":194},"flow-status-visual-mapping",[196],{"type":37,"value":197},"Flow Status → Visual Mapping",{"type":32,"tag":33,"props":199,"children":200},{},[201,203,209],{"type":37,"value":202},"Defined in ",{"type":32,"tag":40,"props":204,"children":206},{"className":205},[],[207],{"type":37,"value":208},"src\u002Fflows\u002FBaseFlow.js",{"type":37,"value":210},":",{"type":32,"tag":77,"props":212,"children":213},{},[214,233,252,271],{"type":32,"tag":81,"props":215,"children":216},{},[217,223,225,231],{"type":32,"tag":40,"props":218,"children":220},{"className":219},[],[221],{"type":37,"value":222},"healthy",{"type":37,"value":224}," — green (",{"type":32,"tag":40,"props":226,"children":228},{"className":227},[],[229],{"type":37,"value":230},"0x34bc6c",{"type":37,"value":232},"), normal thickness",{"type":32,"tag":81,"props":234,"children":235},{},[236,242,244,250],{"type":32,"tag":40,"props":237,"children":239},{"className":238},[],[240],{"type":37,"value":241},"violation",{"type":37,"value":243}," — red (",{"type":32,"tag":40,"props":245,"children":247},{"className":246},[],[248],{"type":37,"value":249},"0xff4444",{"type":37,"value":251},"), 1.3x thickness",{"type":32,"tag":81,"props":253,"children":254},{},[255,261,263,269],{"type":32,"tag":40,"props":256,"children":258},{"className":257},[],[259],{"type":37,"value":260},"warning",{"type":37,"value":262}," — amber (",{"type":32,"tag":40,"props":264,"children":266},{"className":265},[],[267],{"type":37,"value":268},"0xf59e0b",{"type":37,"value":270},"), 1.2x thickness",{"type":32,"tag":81,"props":272,"children":273},{},[274,280,282,288],{"type":32,"tag":40,"props":275,"children":277},{"className":276},[],[278],{"type":37,"value":279},"default",{"type":37,"value":281}," — purple (",{"type":32,"tag":40,"props":283,"children":285},{"className":284},[],[286],{"type":37,"value":287},"0x9c5cf2",{"type":37,"value":232},{"type":32,"tag":192,"props":290,"children":292},{"id":291},"key-changes",[293],{"type":37,"value":294},"Key Changes",{"type":32,"tag":77,"props":296,"children":297},{},[298,331,371,382,400],{"type":32,"tag":81,"props":299,"children":300},{},[301,306,308,314,316,321,323,329],{"type":32,"tag":40,"props":302,"children":304},{"className":303},[],[305],{"type":37,"value":208},{"type":37,"value":307}," — ",{"type":32,"tag":40,"props":309,"children":311},{"className":310},[],[312],{"type":37,"value":313},"FLOW_STATUSES",{"type":37,"value":315}," map, ",{"type":32,"tag":40,"props":317,"children":319},{"className":318},[],[320],{"type":37,"value":145},{"type":37,"value":322}," constructor option, ",{"type":32,"tag":40,"props":324,"children":326},{"className":325},[],[327],{"type":37,"value":328},"getProtocolColor()",{"type":37,"value":330}," returns status color when set",{"type":32,"tag":81,"props":332,"children":333},{},[334,340,341,347,349,354,356,362,363,369],{"type":32,"tag":40,"props":335,"children":337},{"className":336},[],[338],{"type":37,"value":339},"src\u002Fflows\u002Findex.js",{"type":37,"value":307},{"type":32,"tag":40,"props":342,"children":344},{"className":343},[],[345],{"type":37,"value":346},"createFlow()",{"type":37,"value":348}," passes through ",{"type":32,"tag":40,"props":350,"children":352},{"className":351},[],[353],{"type":37,"value":145},{"type":37,"value":355},"\u002F",{"type":32,"tag":40,"props":357,"children":359},{"className":358},[],[360],{"type":37,"value":361},"protocol",{"type":37,"value":355},{"type":32,"tag":40,"props":364,"children":366},{"className":365},[],[367],{"type":37,"value":368},"volume",{"type":37,"value":370}," from flowData",{"type":32,"tag":81,"props":372,"children":373},{},[374,380],{"type":32,"tag":40,"props":375,"children":377},{"className":376},[],[378],{"type":37,"value":379},"src\u002Fcomposables\u002FuseHighlightedDataflows.js",{"type":37,"value":381}," — New composable: creates flows, highlights involved actors, dims others, focuses camera",{"type":32,"tag":81,"props":383,"children":384},{},[385,391,393,398],{"type":32,"tag":40,"props":386,"children":388},{"className":387},[],[389],{"type":37,"value":390},"src\u002Fcomponents\u002FQMap.vue",{"type":37,"value":392}," — New ",{"type":32,"tag":40,"props":394,"children":396},{"className":395},[],[397],{"type":37,"value":137},{"type":37,"value":399}," prop, wires composable, skips click-to-select when highlights active",{"type":32,"tag":81,"props":401,"children":402},{},[403,409,411,416,418,424,426,432],{"type":32,"tag":40,"props":404,"children":406},{"className":405},[],[407],{"type":37,"value":408},"QMapPolicyViolation.vue",{"type":37,"value":410}," — Builds ",{"type":32,"tag":40,"props":412,"children":414},{"className":413},[],[415],{"type":37,"value":137},{"type":37,"value":417}," from violation payload with ",{"type":32,"tag":40,"props":419,"children":421},{"className":420},[],[422],{"type":37,"value":423},"status: 'violation'",{"type":37,"value":425},", removed broken ",{"type":32,"tag":40,"props":427,"children":429},{"className":428},[],[430],{"type":37,"value":431},"applyHighlightsToScene()",{"type":37,"value":433}," hack",{"type":32,"tag":59,"props":435,"children":437},{"id":436},"expression-props-explored-parked",[438],{"type":37,"value":439},"Expression Props (explored, parked)",{"type":32,"tag":33,"props":441,"children":442},{},[443,445,451,453,459,461,467,469,475,477,483,485,491,493,499],{"type":37,"value":444},"Built infrastructure for schema-driven visual tuning: ",{"type":32,"tag":40,"props":446,"children":448},{"className":447},[],[449],{"type":37,"value":450},"DevExpressionControls",{"type":37,"value":452}," auto-generates UI from a ",{"type":32,"tag":40,"props":454,"children":456},{"className":455},[],[457],{"type":37,"value":458},"{ kind, val, props }",{"type":37,"value":460}," schema, ",{"type":32,"tag":40,"props":462,"children":464},{"className":463},[],[465],{"type":37,"value":466},"useExpressionWiring",{"type":37,"value":468}," connects changes to live scene objects. Parked — the ",{"type":32,"tag":40,"props":470,"children":472},{"className":471},[],[473],{"type":37,"value":474},"QMapExpressionLab",{"type":37,"value":476}," component was removed during cleanup; the supporting composable (",{"type":32,"tag":40,"props":478,"children":480},{"className":479},[],[481],{"type":37,"value":482},"useExpressionWiring.js",{"type":37,"value":484},") and schema (",{"type":32,"tag":40,"props":486,"children":488},{"className":487},[],[489],{"type":37,"value":490},"expressionProps.js",{"type":37,"value":492},") remain in ",{"type":32,"tag":40,"props":494,"children":496},{"className":495},[],[497],{"type":37,"value":498},"shared\u002F",{"type":37,"value":500}," for future use.",{"key":54,"title":502,"empty":18,"ast":503},"Files",{"type":29,"children":504},[505,516],{"type":32,"tag":33,"props":506,"children":507},{},[508,510],{"type":37,"value":509},"Experiment: ",{"type":32,"tag":40,"props":511,"children":513},{"className":512},[],[514],{"type":37,"value":515},"dev\u002Fexperiments\u002Fc16.view-contexts\u002F",{"type":32,"tag":77,"props":517,"children":518},{},[519,530,541,552,582,593],{"type":32,"tag":81,"props":520,"children":521},{},[522,528],{"type":32,"tag":40,"props":523,"children":525},{"className":524},[],[526],{"type":37,"value":527},"components\u002FQMapPolicyViolation.vue",{"type":37,"value":529}," — Non-interactive violation wrapper",{"type":32,"tag":81,"props":531,"children":532},{},[533,539],{"type":32,"tag":40,"props":534,"children":536},{"className":535},[],[537],{"type":37,"value":538},"shared\u002Fviews\u002FpolicyViolation.js",{"type":37,"value":540}," — Builds view context + highlighted dataflows",{"type":32,"tag":81,"props":542,"children":543},{},[544,550],{"type":32,"tag":40,"props":545,"children":547},{"className":546},[],[548],{"type":37,"value":549},"shared\u002Fdata\u002FpolicyViolationData.js",{"type":37,"value":551}," — Sample violation payload (8 actors, 6 dataflows, 2 violations)",{"type":32,"tag":81,"props":553,"children":554},{},[555,561,562,568,569,575,576],{"type":32,"tag":40,"props":556,"children":558},{"className":557},[],[559],{"type":37,"value":560},"shared\u002FviewContext.js",{"type":37,"value":307},{"type":32,"tag":40,"props":563,"children":565},{"className":564},[],[566],{"type":37,"value":567},"createViewContext()",{"type":37,"value":155},{"type":32,"tag":40,"props":570,"children":572},{"className":571},[],[573],{"type":37,"value":574},"HIGHLIGHT_STYLES",{"type":37,"value":155},{"type":32,"tag":40,"props":577,"children":579},{"className":578},[],[580],{"type":37,"value":581},"applyHighlights()",{"type":32,"tag":81,"props":583,"children":584},{},[585,591],{"type":32,"tag":40,"props":586,"children":588},{"className":587},[],[589],{"type":37,"value":590},"shared\u002FexpressionProps.js",{"type":37,"value":592}," — Expression schema (parked)",{"type":32,"tag":81,"props":594,"children":595},{},[596,602],{"type":32,"tag":40,"props":597,"children":599},{"className":598},[],[600],{"type":37,"value":601},"shared\u002Fcomposables\u002FuseExpressionWiring.js",{"type":37,"value":603}," — Expression wiring (parked)",[605],{"name":606,"prompt":607,"plan":8},"violation-view","violation-view-prompt.md",[609,610,611],"PLAN.md","controls.md","initial-prompt.md",[613,615,617,618],{"file":609,"title":614},"— Cycle Plan",{"file":610,"title":616},"Controls — QMap Configuration Surface",{"file":611,"title":8},{"file":607,"title":619},"Policy Violation View",[621,628,631],{"src":622,"kind":623,"order":624,"caption":625,"capturedAt":626,"route":627},"\u002Fcycles\u002Fqmap\u002Fc16-policy-violation.png","hero",8,"The Policy Violation context — violating flow highlighted by the wrapper's defaults","2026-08-15T23:43:05.086Z","\u002Fexperiments\u002Fc16.view-contexts\u002F",{"src":19,"kind":623,"order":629,"caption":630,"capturedAt":626,"route":627},9,"Same context after ambient motion settles — honest maximum for a single-view cycle",{"src":632,"kind":623,"order":633,"capturedAt":634,"route":627},"\u002Fcycles\u002Fqmap\u002Fc16-view-contexts.png",4999,"2026-08-15T16:38:13.798Z",[],[637],{"route":627,"href":8},1794599378773]