[{"data":1,"prerenderedAt":473},["ShallowReactive",2],{"cycle-doc-design-c121-plan\u002F02-policy-detail.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":17},{"id":5,"title":6},"c121","Governance v1 Scope",{"id":8,"label":9},"design","Design","plan\u002F02-policy-detail.md","02 · Policy detail (S3) + policies listing (Wave 2)",[13,14,15,16],"Today","Steps","Done when","Look for (review)",{"type":18,"children":19},"root",[20,34,112,118,258,263,424,429,463,468],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,32],{"type":21,"tag":26,"props":27,"children":28},"strong",{},[29],{"type":30,"value":31},"text","TL;DR:",{"type":30,"value":33}," Snooze goes; the policy's mode becomes ModeUntil, the same control the exception editor uses. Loosening and revoking require a reason (D1); expiry is optional with a nudge (D7). The exception editor shows BlastRadius. \"Who does this apply to?\" comes off. Header label says \"Qpoint recommendation\".",{"type":21,"tag":22,"props":35,"children":36},{},[37,42,44,51,53,59,60,66,67,73,74,80,82,88,89,95,97,103,104,110],{"type":21,"tag":26,"props":38,"children":39},{},[40],{"type":30,"value":41},"Owns:",{"type":30,"value":43}," ",{"type":21,"tag":45,"props":46,"children":48},"code",{"className":47},[],[49],{"type":30,"value":50},"app\u002Fpages\u002Fpages\u002Fphase4\u002Fmock\u002Fpolicy-detail.vue",{"type":30,"value":52},", ",{"type":21,"tag":45,"props":54,"children":56},{"className":55},[],[57],{"type":30,"value":58},"app\u002Fcomponents\u002Fgovernance\u002Fpart\u002F{PolicyExceptions,PolicyMode,PolicyOverview}.vue",{"type":30,"value":52},{"type":21,"tag":45,"props":61,"children":63},{"className":62},[],[64],{"type":30,"value":65},"app\u002Fcomponents\u002Fgovernance\u002Fmock\u002F{ModeControl,SeverityPicker}.vue",{"type":30,"value":52},{"type":21,"tag":45,"props":68,"children":70},{"className":69},[],[71],{"type":30,"value":72},"app\u002Fcomponents\u002Fgovernance\u002Flive\u002FControlsPolicies.vue",{"type":30,"value":52},{"type":21,"tag":45,"props":75,"children":77},{"className":76},[],[78],{"type":30,"value":79},"app\u002Fcomposables\u002FuseControlCenterMock.ts",{"type":30,"value":81},". Uses 01's ",{"type":21,"tag":45,"props":83,"children":85},{"className":84},[],[86],{"type":30,"value":87},"ModeUntil",{"type":30,"value":52},{"type":21,"tag":45,"props":90,"children":92},{"className":91},[],[93],{"type":30,"value":94},"BlastRadius",{"type":30,"value":96},"; 00's ",{"type":21,"tag":45,"props":98,"children":100},{"className":99},[],[101],{"type":30,"value":102},"stage()",{"type":30,"value":52},{"type":21,"tag":45,"props":105,"children":107},{"className":106},[],[108],{"type":30,"value":109},"previewChange()",{"type":30,"value":111},".",{"type":21,"tag":113,"props":114,"children":116},"h2",{"id":115},"today",[117],{"type":30,"value":13},{"type":21,"tag":119,"props":120,"children":121},"ul",{},[122,160,173,192,205,232,245],{"type":21,"tag":123,"props":124,"children":125},"li",{},[126,128,134,136,142,144,150,152,158],{"type":30,"value":127},"Exception sheet: ",{"type":21,"tag":45,"props":129,"children":131},{"className":130},[],[132],{"type":30,"value":133},"policy-detail.vue",{"type":30,"value":135}," l.70–119 (form l.157–176, change l.185–207); bare ",{"type":21,"tag":45,"props":137,"children":139},{"className":138},[],[140],{"type":30,"value":141},"UxTabGroup",{"type":30,"value":143}," l.87 + date l.91; W.6 \"required: it loosens\" l.92, ",{"type":21,"tag":45,"props":145,"children":147},{"className":146},[],[148],{"type":30,"value":149},"canApply",{"type":30,"value":151}," l.206; reason optional → ",{"type":21,"tag":45,"props":153,"children":155},{"className":154},[],[156],{"type":30,"value":157},"'—'",{"type":30,"value":159}," l.194.",{"type":21,"tag":123,"props":161,"children":162},{},[163,165,171],{"type":30,"value":164},"Snooze: ",{"type":21,"tag":45,"props":166,"children":168},{"className":167},[],[169],{"type":30,"value":170},"PolicyMode.vue",{"type":30,"value":172}," l.16–35; mode tooltip + strip note \"Snoozed: observing until …\".",{"type":21,"tag":123,"props":174,"children":175},{},[176,182,184,190],{"type":21,"tag":45,"props":177,"children":179},{"className":178},[],[180],{"type":30,"value":181},"ModeControl.vue",{"type":30,"value":183}," (UxTabGroup + rollout note + hover tooltip l.74–99); variants ",{"type":21,"tag":45,"props":185,"children":187},{"className":186},[],[188],{"type":30,"value":189},"?v.mode=strip|header",{"type":30,"value":191}," (policy-detail l.149–154).",{"type":21,"tag":123,"props":193,"children":194},{},[195,197,203],{"type":30,"value":196},"\"Who does this apply to?\": ",{"type":21,"tag":45,"props":198,"children":200},{"className":199},[],[201],{"type":30,"value":202},"PolicyExceptions.vue",{"type":30,"value":204}," l.58–77 + why-sentence l.160–173.",{"type":21,"tag":123,"props":206,"children":207},{},[208,210,215,217,222,224,230],{"type":30,"value":209},"Duplicated \"what it overrides\" logic: ",{"type":21,"tag":45,"props":211,"children":213},{"className":212},[],[214],{"type":30,"value":202},{"type":30,"value":216}," l.117–119 and ",{"type":21,"tag":45,"props":218,"children":220},{"className":219},[],[221],{"type":30,"value":133},{"type":30,"value":223}," l.166–172 (no D9). Use the fixture's ",{"type":21,"tag":45,"props":225,"children":227},{"className":226},[],[228],{"type":30,"value":229},"applicability()",{"type":30,"value":231}," instead.",{"type":21,"tag":123,"props":233,"children":234},{},[235,237,243],{"type":30,"value":236},"Header: ",{"type":21,"tag":45,"props":238,"children":240},{"className":239},[],[241],{"type":30,"value":242},"PolicyOverview.vue",{"type":30,"value":244}," l.8–36 — Mode, Frameworks, Organization Severity + \"Recommended : sev\", Findings count.",{"type":21,"tag":123,"props":246,"children":247},{},[248,250,256],{"type":30,"value":249},"Listing: ",{"type":21,"tag":45,"props":251,"children":253},{"className":252},[],[254],{"type":30,"value":255},"ControlsPolicies.vue",{"type":30,"value":257}," l.70–75 black mode pill + snooze note.",{"type":21,"tag":113,"props":259,"children":261},{"id":260},"steps",[262],{"type":30,"value":14},{"type":21,"tag":264,"props":265,"children":266},"ol",{},[267,315,348,374,391,401,411],{"type":21,"tag":123,"props":268,"children":269},{},[270,275,277,282,284,290,292,298,300,305,307,313],{"type":21,"tag":26,"props":271,"children":272},{},[273],{"type":30,"value":274},"Mode section (L, R, I).",{"type":30,"value":276}," Replace the Snooze block and the bare mode in PolicyMode with ",{"type":21,"tag":45,"props":278,"children":280},{"className":279},[],[281],{"type":30,"value":87},{"type":30,"value":283}," (",{"type":21,"tag":45,"props":285,"children":287},{"className":286},[],[288],{"type":30,"value":289},"replaces",{"type":30,"value":291}," = current live mode). Changing mode down requires the reason field (D1) in its ",{"type":21,"tag":45,"props":293,"children":295},{"className":294},[],[296],{"type":30,"value":297},"#reason",{"type":30,"value":299}," slot; stage via ",{"type":21,"tag":45,"props":301,"children":303},{"className":302},[],[304],{"type":30,"value":102},{"type":30,"value":306}," and show the refusal inline if 00 returns ",{"type":21,"tag":45,"props":308,"children":310},{"className":309},[],[311],{"type":30,"value":312},"why:'reason'",{"type":30,"value":314},". ModeControl in the strip stays compact (no Until), its note reads \"Observe until Nov 15, then Enforce\" when set; delete the snooze strings everywhere in owned files.",{"type":21,"tag":123,"props":316,"children":317},{},[318,323,325,330,332,338,340,346],{"type":21,"tag":26,"props":319,"children":320},{},[321],{"type":30,"value":322},"Exception editor.",{"type":30,"value":324}," Use ",{"type":21,"tag":45,"props":326,"children":328},{"className":327},[],[329],{"type":30,"value":87},{"type":30,"value":331}," for mode\u002Funtil. Reason: required when the exception loosens (label \"Reason (required: it loosens Enforce → Observe)\"), optional otherwise; remove W.6's date requirement and the 2-week prefill (D7). Replace the \"Reach \u002F Findings\" lines with ",{"type":21,"tag":45,"props":333,"children":335},{"className":334},[],[336],{"type":30,"value":337},"\u003CBlastRadius variant=\"full\" :impact=\"previewChange(...)\">",{"type":30,"value":339},". Read ",{"type":21,"tag":45,"props":341,"children":343},{"className":342},[],[344],{"type":30,"value":345},"?add=user:\u003Cid>|team:\u003Cid>|org",{"type":30,"value":347}," to open the sheet prefilled (04 links here).",{"type":21,"tag":123,"props":349,"children":350},{},[351,356,358,364,366,372],{"type":21,"tag":26,"props":352,"children":353},{},[354],{"type":30,"value":355},"Revoke.",{"type":30,"value":357}," Revoke opens the sheet with BlastRadius + a required \"Reason for revoking\" (D1) → ",{"type":21,"tag":45,"props":359,"children":361},{"className":360},[],[362],{"type":30,"value":363},"exception-revoke",{"type":30,"value":365}," with ",{"type":21,"tag":45,"props":367,"children":369},{"className":368},[],[370],{"type":30,"value":371},"revokeNote",{"type":30,"value":373},". Exceptions table shows revoked rows' note in history.",{"type":21,"tag":123,"props":375,"children":376},{},[377,382,384,389],{"type":21,"tag":26,"props":378,"children":379},{},[380],{"type":30,"value":381},"Remove \"Who does this apply to?\"",{"type":30,"value":383}," and its why-sentence (cascade simulator cut). Remove the duplicated overrides logic; read ",{"type":21,"tag":45,"props":385,"children":387},{"className":386},[],[388],{"type":30,"value":229},{"type":30,"value":390}," for \"overrides\".",{"type":21,"tag":123,"props":392,"children":393},{},[394,399],{"type":21,"tag":26,"props":395,"children":396},{},[397],{"type":30,"value":398},"Header (R \"locked\").",{"type":30,"value":400}," Label \"Qpoint recommendation: High\" under Organization Severity; keep Frameworks and open Findings. No other header change.",{"type":21,"tag":123,"props":402,"children":403},{},[404,409],{"type":21,"tag":26,"props":405,"children":406},{},[407],{"type":30,"value":408},"Policies listing.",{"type":30,"value":410}," Mode pill shows \"Observe · until Nov 15\"; drop the snooze note.",{"type":21,"tag":123,"props":412,"children":413},{},[414,416,422],{"type":30,"value":415},"Remove any remaining shim calls to ",{"type":21,"tag":45,"props":417,"children":419},{"className":418},[],[420],{"type":30,"value":421},"previewChangeCounts",{"type":30,"value":423}," in owned files.",{"type":21,"tag":113,"props":425,"children":427},{"id":426},"done-when",[428],{"type":30,"value":15},{"type":21,"tag":22,"props":430,"children":431},{},[432,438,440,446,448,454,456,462],{"type":21,"tag":45,"props":433,"children":435},{"className":434},[],[436],{"type":30,"value":437},"\u002Fpages\u002Fphase4\u002Fmock\u002Fpolicy-detail?policy=P-NO-ROOT",{"type":30,"value":439}," (until shown), ",{"type":21,"tag":45,"props":441,"children":443},{"className":442},[],[444],{"type":30,"value":445},"?policy=P-MCP",{"type":30,"value":447}," (exceptions, add one that loosens → reason required, BlastRadius red; add one that tightens → blue, reason optional), revoke flow, ",{"type":21,"tag":45,"props":449,"children":451},{"className":450},[],[452],{"type":30,"value":453},"?add=team:finance",{"type":30,"value":455},". Screenshots ",{"type":21,"tag":45,"props":457,"children":459},{"className":458},[],[460],{"type":30,"value":461},"shots\u002F02-*.png",{"type":30,"value":111},{"type":21,"tag":113,"props":464,"children":466},{"id":465},"look-for-review",[467],{"type":30,"value":16},{"type":21,"tag":22,"props":469,"children":470},{},[471],{"type":30,"value":472},"Mode and exception editor read as the same control (Rob: \"the org-wide default and the scoped override read as the same familiar pattern\"); nothing says \"snooze\"; no simulator.",1794599471605]