[{"data":1,"prerenderedAt":509},["ShallowReactive",2],{"cycle-doc-design-c121-plan\u002F01-shared-components.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":18},{"id":5,"title":6},"c121","Governance v1 Scope",{"id":8,"label":9},"design","Design","plan\u002F01-shared-components.md","01 · Shared components: ModeUntil + BlastRadius (Wave 1)",[13,14,15,16,17],"ModeUntil","BlastRadius","Steps","Done when","Look for (review)",{"type":19,"children":20},"root",[21,56,122,219,225,313,318,421,426,476,481,499,504],{"type":22,"tag":23,"props":24,"children":25},"element","p",{},[26,33,35,39,41,48,50,54],{"type":22,"tag":27,"props":28,"children":29},"strong",{},[30],{"type":31,"value":32},"text","TL;DR:",{"type":31,"value":34}," two components every Wave-2 surface uses. ",{"type":22,"tag":27,"props":36,"children":37},{},[38],{"type":31,"value":13},{"type":31,"value":40}," is the one Off · Observe · Enforce control with an optional Until, the same on the policy and in the exception editor (Logseq screenshot ",{"type":22,"tag":42,"props":43,"children":45},"code",{"className":44},[],[46],{"type":31,"value":47},"..\u002Fsources\u002Flogseq-mode-until.png",{"type":31,"value":49},"). ",{"type":22,"tag":27,"props":51,"children":52},{},[53],{"type":31,"value":14},{"type":31,"value":55}," says, simply and visually, what a change does: who, which teams, who drops out of visibility, what tightened (blue), what loosened (red), which findings resolve or reopen.",{"type":22,"tag":23,"props":57,"children":58},{},[59,64,66,72,74,80,82,88,90,96,98,104,106,112,114,120],{"type":22,"tag":27,"props":60,"children":61},{},[62],{"type":31,"value":63},"Owns:",{"type":31,"value":65}," new ",{"type":22,"tag":42,"props":67,"children":69},{"className":68},[],[70],{"type":31,"value":71},"app\u002Fdata\u002Fgovernance-impact.ts",{"type":31,"value":73}," (the ",{"type":22,"tag":42,"props":75,"children":77},{"className":76},[],[78],{"type":31,"value":79},"Impact",{"type":31,"value":81}," interface, README §4, verbatim + a ",{"type":22,"tag":42,"props":83,"children":85},{"className":84},[],[86],{"type":31,"value":87},"Direction",{"type":31,"value":89}," helper), new ",{"type":22,"tag":42,"props":91,"children":93},{"className":92},[],[94],{"type":31,"value":95},"app\u002Fcomponents\u002Fgovernance\u002Fmock\u002FModeUntil.vue",{"type":31,"value":97},", new ",{"type":22,"tag":42,"props":99,"children":101},{"className":100},[],[102],{"type":31,"value":103},"app\u002Fcomponents\u002Fgovernance\u002Fmock\u002FBlastRadius.vue",{"type":31,"value":105},", demo rows in ",{"type":22,"tag":42,"props":107,"children":109},{"className":108},[],[110],{"type":31,"value":111},"app\u002Fpages\u002Fpages\u002Fphase4\u002Fmock\u002Fparts.vue",{"type":31,"value":113},", parts registry entries in ",{"type":22,"tag":42,"props":115,"children":117},{"className":116},[],[118],{"type":31,"value":119},"app\u002Fdata\u002Fgovernance-parts.ts",{"type":31,"value":121}," (registry only; 06 later edits the rail in the same file).",{"type":22,"tag":23,"props":123,"children":124},{},[125,130,132,138,140,146,148,154,156,162,163,169,171,177,179,185,187,193,195,201,203,209,211,217],{"type":22,"tag":27,"props":126,"children":127},{},[128],{"type":31,"value":129},"Assemble first",{"type":31,"value":131}," (CLAUDE.md: design is assemblage): layer ",{"type":22,"tag":42,"props":133,"children":135},{"className":134},[],[136],{"type":31,"value":137},"UxTabGroup",{"type":31,"value":139}," (black\u002Fwhite, c110) for the mode, ",{"type":22,"tag":42,"props":141,"children":143},{"className":142},[],[144],{"type":31,"value":145},"UxInput",{"type":31,"value":147},"\u002Fnative date like today's sheet, ",{"type":22,"tag":42,"props":149,"children":151},{"className":150},[],[152],{"type":31,"value":153},"UxTooltip",{"type":31,"value":155},", ",{"type":22,"tag":42,"props":157,"children":159},{"className":158},[],[160],{"type":31,"value":161},"DataMetric",{"type":31,"value":155},{"type":22,"tag":42,"props":164,"children":166},{"className":165},[],[167],{"type":31,"value":168},"UxAvatar",{"type":31,"value":170},"\u002Fname chips, ",{"type":22,"tag":42,"props":172,"children":174},{"className":173},[],[175],{"type":31,"value":176},"ComplianceTag",{"type":31,"value":178},"-style pills; look at the qdash live inventory tiles and ",{"type":22,"tag":42,"props":180,"children":182},{"className":181},[],[183],{"type":31,"value":184},"DataHistoryGraph",{"type":31,"value":186}," before drawing anything new. Check ",{"type":22,"tag":42,"props":188,"children":190},{"className":189},[],[191],{"type":31,"value":192},"..\u002Fq-nuxt-layer\u002FCLAUDE.md",{"type":31,"value":194}," for the catalog. No arbitrary-value Tailwind; ",{"type":22,"tag":42,"props":196,"children":198},{"className":197},[],[199],{"type":31,"value":200},"rose-*",{"type":31,"value":202}," not ",{"type":22,"tag":42,"props":204,"children":206},{"className":205},[],[207],{"type":31,"value":208},"red-*",{"type":31,"value":210}," (gotcha); ",{"type":22,"tag":42,"props":212,"children":214},{"className":213},[],[215],{"type":31,"value":216},"--qp-*",{"type":31,"value":218}," vars are RGB triplets.",{"type":22,"tag":220,"props":221,"children":223},"h2",{"id":222},"modeuntil",[224],{"type":31,"value":13},{"type":22,"tag":226,"props":227,"children":228},"ul",{},[229,274,279,300],{"type":22,"tag":230,"props":231,"children":232},"li",{},[233,235,241,242,248,250,256,258,264,266,272],{"type":31,"value":234},"Props: ",{"type":22,"tag":42,"props":236,"children":238},{"className":237},[],[239],{"type":31,"value":240},"modelValue: { mode, until? }",{"type":31,"value":155},{"type":22,"tag":42,"props":243,"children":245},{"className":244},[],[246],{"type":31,"value":247},"enforceable",{"type":31,"value":249}," (hide Enforce), ",{"type":22,"tag":42,"props":251,"children":253},{"className":252},[],[254],{"type":31,"value":255},"replaces?: Mode",{"type":31,"value":257}," (to show \"then Enforce\" and decide loosening), ",{"type":22,"tag":42,"props":259,"children":261},{"className":260},[],[262],{"type":31,"value":263},"compact",{"type":31,"value":265},". Emits ",{"type":22,"tag":42,"props":267,"children":269},{"className":268},[],[270],{"type":31,"value":271},"update:modelValue",{"type":31,"value":273},".",{"type":22,"tag":230,"props":275,"children":276},{},[277],{"type":31,"value":278},"Layout per the screenshot: label column \"Mode\" \u002F \"Until\"; Until is a date input with a trailing hint: \"optional: it holds until revoked\" when tightening\u002Fequal; when loosening (D7) a rose hint \"No end date: this stays open until someone revokes it\" — never blocks.",{"type":22,"tag":230,"props":280,"children":281},{},[282,284,290,292,298],{"type":31,"value":283},"When ",{"type":22,"tag":42,"props":285,"children":287},{"className":286},[],[288],{"type":31,"value":289},"until",{"type":31,"value":291}," set and ",{"type":22,"tag":42,"props":293,"children":295},{"className":294},[],[296],{"type":31,"value":297},"replaces",{"type":31,"value":299}," given: a quiet line \"then {replaces}\" (D6).",{"type":22,"tag":230,"props":301,"children":302},{},[303,305,311],{"type":31,"value":304},"Optional ",{"type":22,"tag":42,"props":306,"children":308},{"className":307},[],[309],{"type":31,"value":310},"#reason",{"type":31,"value":312}," slot under it so editors can attach the required reason field (D1) without the control owning it.",{"type":22,"tag":220,"props":314,"children":316},{"id":315},"blastradius",[317],{"type":31,"value":14},{"type":22,"tag":226,"props":319,"children":320},{},[321,347,400,411,416],{"type":22,"tag":230,"props":322,"children":323},{},[324,325,331,332,338,339,345],{"type":31,"value":234},{"type":22,"tag":42,"props":326,"children":328},{"className":327},[],[329],{"type":31,"value":330},"impact: Impact",{"type":31,"value":155},{"type":22,"tag":42,"props":333,"children":335},{"className":334},[],[336],{"type":31,"value":337},"variant: 'full' | 'inline'",{"type":31,"value":155},{"type":22,"tag":42,"props":340,"children":342},{"className":341},[],[343],{"type":31,"value":344},"label?",{"type":31,"value":346},". No data fetching — pure presentation.",{"type":22,"tag":230,"props":348,"children":349},{},[350,356,358,363,365,370,372,377,379,384,386,391,393,398],{"type":22,"tag":42,"props":351,"children":353},{"className":352},[],[354],{"type":31,"value":355},"full",{"type":31,"value":357}," (exception editor, draft review): headline sentence (\"Loosens P-MCP for 3 people in Finance. Small blast radius.\"), then rows: ",{"type":22,"tag":27,"props":359,"children":360},{},[361],{"type":31,"value":362},"People",{"type":31,"value":364}," (avatars\u002Fnames with from → to), ",{"type":22,"tag":27,"props":366,"children":367},{},[368],{"type":31,"value":369},"Teams",{"type":31,"value":371}," (team · affected of total, a thin bar), ",{"type":22,"tag":27,"props":373,"children":374},{},[375],{"type":31,"value":376},"Out of visibility",{"type":31,"value":378}," (D9, only when non-empty), ",{"type":22,"tag":27,"props":380,"children":381},{},[382],{"type":31,"value":383},"Tightened",{"type":31,"value":385}," (blue-ish chips) \u002F ",{"type":22,"tag":27,"props":387,"children":388},{},[389],{"type":31,"value":390},"Loosened",{"type":31,"value":392}," (rose chips), ",{"type":22,"tag":27,"props":394,"children":395},{},[396],{"type":31,"value":397},"Findings",{"type":31,"value":399}," (N resolve · M reopen · K resolve as Enforced, ids linking to S1).",{"type":22,"tag":230,"props":401,"children":402},{},[403,409],{"type":22,"tag":42,"props":404,"children":406},{"className":405},[],[407],{"type":31,"value":408},"inline",{"type":31,"value":410}," (one line for list rows \u002F tray): direction dot + \"3 people · 1 team · 2 findings reopen\".",{"type":22,"tag":230,"props":412,"children":413},{},[414],{"type":31,"value":415},"Size words: ≤5 people \"small\", ≤25 \"medium\", else \"large\" — one constant, documented.",{"type":22,"tag":230,"props":417,"children":418},{},[419],{"type":31,"value":420},"Empty: \"No one's mode changes.\" (still show findings if any).",{"type":22,"tag":220,"props":422,"children":424},{"id":423},"steps",[425],{"type":31,"value":15},{"type":22,"tag":427,"props":428,"children":429},"ol",{},[430,443,463],{"type":22,"tag":230,"props":431,"children":432},{},[433,435,441],{"type":31,"value":434},"Write ",{"type":22,"tag":42,"props":436,"children":438},{"className":437},[],[439],{"type":31,"value":440},"governance-impact.ts",{"type":31,"value":442}," first and tell 00 it exists (00 imports it).",{"type":22,"tag":230,"props":444,"children":445},{},[446,448,453,455,461],{"type":31,"value":447},"Build both components against hand-written ",{"type":22,"tag":42,"props":449,"children":451},{"className":450},[],[452],{"type":31,"value":79},{"type":31,"value":454}," fixtures in ",{"type":22,"tag":42,"props":456,"children":458},{"className":457},[],[459],{"type":31,"value":460},"parts.vue",{"type":31,"value":462}," (minimal \u002F typical \u002F large \u002F mixed tighten+loosen \u002F empty) — the demo is the test.",{"type":22,"tag":230,"props":464,"children":465},{},[466,468,474],{"type":31,"value":467},"Register them in the parts registry so ",{"type":22,"tag":42,"props":469,"children":471},{"className":470},[],[472],{"type":31,"value":473},"\u002Fpages\u002Fphase4\u002Fmock\u002Fparts",{"type":31,"value":475}," lists them.",{"type":22,"tag":220,"props":477,"children":479},{"id":478},"done-when",[480],{"type":31,"value":16},{"type":22,"tag":23,"props":482,"children":483},{},[484,489,491,497],{"type":22,"tag":42,"props":485,"children":487},{"className":486},[],[488],{"type":31,"value":473},{"type":31,"value":490}," shows both with all five scenarios, light screenshots in ",{"type":22,"tag":42,"props":492,"children":494},{"className":493},[],[495],{"type":31,"value":496},"shots\u002F01-*.png",{"type":31,"value":498},"; no edits outside owned files.",{"type":22,"tag":220,"props":500,"children":502},{"id":501},"look-for-review",[503],{"type":31,"value":17},{"type":22,"tag":23,"props":505,"children":506},{},[507],{"type":31,"value":508},"Is the blue\u002Fred legible without the legend? Does \"small blast radius\" read as the confidence moment Rob described (\"This is 3 people … I'm comfortable\")?",1794599471594]