[{"data":1,"prerenderedAt":358},["ShallowReactive",2],{"cycle-doc-design-c121-plan\u002F03-publishing.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\u002F03-publishing.md","03 · Publishing: tray + Changes page (Wave 2)",[13,14,15,16],"Today","Steps","Done when","Look for (review)",{"type":18,"children":19},"root",[20,48,106,112,141,146,331,336,348,353],{"type":21,"tag":22,"props":23,"children":24},"element","p",{},[25,32,34,39,41,46],{"type":21,"tag":26,"props":27,"children":28},"strong",{},[29],{"type":30,"value":31},"text","TL;DR:",{"type":30,"value":33}," local staging stays; \"Save to draft\" puts edits into ",{"type":21,"tag":26,"props":35,"children":36},{},[37],{"type":30,"value":38},"one shared Policy Config draft",{"type":30,"value":40}," (D4). The Changes page becomes: the shared draft (v13 · N pending changes, author per line, BlastRadius of the whole draft, Publish with a note), Policy Config versions (v13 live, rollback with a note, propagation bar), the log, and the config as ",{"type":21,"tag":26,"props":42,"children":43},{},[44],{"type":30,"value":45},"syntax-coloured JSON",{"type":30,"value":47}," with Download and Import.",{"type":21,"tag":22,"props":49,"children":50},{},[51,56,58,65,67,73,74,80,82,88,90,96,98,104],{"type":21,"tag":26,"props":52,"children":53},{},[54],{"type":30,"value":55},"Owns:",{"type":30,"value":57}," ",{"type":21,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":30,"value":64},"app\u002Fpages\u002Fpages\u002Fphase4\u002Fmock\u002Fchanges.vue",{"type":30,"value":66},", ",{"type":21,"tag":59,"props":68,"children":70},{"className":69},[],[71],{"type":30,"value":72},"app\u002Fcomponents\u002Fgovernance\u002Fmock\u002FPublishTray.vue",{"type":30,"value":66},{"type":21,"tag":59,"props":75,"children":77},{"className":76},[],[78],{"type":30,"value":79},"app\u002Flayouts\u002Fgovernance-mock.vue",{"type":30,"value":81},", new ",{"type":21,"tag":59,"props":83,"children":85},{"className":84},[],[86],{"type":30,"value":87},"app\u002Fcomponents\u002Fgovernance\u002Fmock\u002FConfigJson.vue",{"type":30,"value":89},". Uses 00's publishing API and ",{"type":21,"tag":59,"props":91,"children":93},{"className":92},[],[94],{"type":30,"value":95},"configJson\u002FimportConfig\u002FfleetSummary",{"type":30,"value":97},", 01's ",{"type":21,"tag":59,"props":99,"children":101},{"className":100},[],[102],{"type":30,"value":103},"BlastRadius",{"type":30,"value":105},".",{"type":21,"tag":107,"props":108,"children":110},"h2",{"id":109},"today",[111],{"type":30,"value":13},{"type":21,"tag":113,"props":114,"children":115},"ul",{},[116,130],{"type":21,"tag":117,"props":118,"children":119},"li",{},[120,122,128],{"type":30,"value":121},"Tray ",{"type":21,"tag":59,"props":123,"children":125},{"className":124},[],[126],{"type":30,"value":127},"PublishTray.vue",{"type":30,"value":129},": \"Locally Staged Edits · N\" (l.23), numbered list, \"Preview changes in dashboard\" (l.38–41), \"Submit as draft…\" title + note (l.42–54), \"Discard all\", footer \"Live v13 · 97 of 100 endpoints · 2 open drafts · Changes →\" (l.64–69).",{"type":21,"tag":117,"props":131,"children":132},{},[133,139],{"type":21,"tag":59,"props":134,"children":136},{"className":135},[],[137],{"type":30,"value":138},"changes.vue",{"type":30,"value":140},": drafts table with approval toggle (l.8–73), versions table with lineage + propagation bar + roll back (l.76–125), log (l.128–138). No JSON.",{"type":21,"tag":107,"props":142,"children":144},{"id":143},"steps",[145],{"type":30,"value":14},{"type":21,"tag":147,"props":148,"children":149},"ol",{},[150,189,222,262,288,313,326],{"type":21,"tag":117,"props":151,"children":152},{},[153,158,160,165,167,173,175,180,182,187],{"type":21,"tag":26,"props":154,"children":155},{},[156],{"type":30,"value":157},"Tray.",{"type":30,"value":159}," Title stays \"Locally Staged Edits · N\" (Mark's 10-21 polish holds). Each line shows its reason when present; a loosening line without reason can't exist (00 refuses it). Replace \"Submit as draft…\" with ",{"type":21,"tag":26,"props":161,"children":162},{},[163],{"type":30,"value":164},"\"Save to draft\"",{"type":30,"value":166}," (no title; one click; optional note per batch is fine). Keep \"Preview changes in dashboard\" (now ",{"type":21,"tag":59,"props":168,"children":170},{"className":169},[],[171],{"type":30,"value":172},"?preview=draft",{"type":30,"value":174}," + local edits). Footer: \"Live ",{"type":21,"tag":26,"props":176,"children":177},{},[178],{"type":30,"value":179},"Policy Config v13",{"type":30,"value":181}," · 97 of 100 endpoints · ",{"type":21,"tag":26,"props":183,"children":184},{},[185],{"type":30,"value":186},"6 pending changes",{"type":30,"value":188}," · Changes →\"; endpoints count links to the Endpoints page (06's URL).",{"type":21,"tag":117,"props":190,"children":191},{},[192,197,199,205,207,212,214,220],{"type":21,"tag":26,"props":193,"children":194},{},[195],{"type":30,"value":196},"Changes: Pending.",{"type":30,"value":198}," Header \"Policy Config v13 · 6 pending changes\". Itemized list: change · reason · author · when (who changed what and when, I). ",{"type":21,"tag":59,"props":200,"children":202},{"className":201},[],[203],{"type":30,"value":204},"\u003CBlastRadius variant=\"full\" :impact=\"previewDraft(draft.changes)\">",{"type":30,"value":206}," above the list (L: \"use this component to visually, simply, clearly explain what the changes do\"). Validation summary (00 errors, e.g. exception on a removed team) blocks Publish with the affected item named (I). ",{"type":21,"tag":26,"props":208,"children":209},{},[210],{"type":30,"value":211},"Publish…",{"type":30,"value":213}," → note (required) → \"Publish v14\". Discard draft. Changes marked ",{"type":21,"tag":59,"props":215,"children":217},{"className":216},[],[218],{"type":30,"value":219},"redundant",{"type":30,"value":221}," after a rollback show struck with \"already live\".",{"type":21,"tag":117,"props":223,"children":224},{},[225,230,232,238,240,245,247,252,254,260],{"type":21,"tag":26,"props":226,"children":227},{},[228],{"type":30,"value":229},"Changes: Versions.",{"type":30,"value":231}," Row label \"Policy Config v13\" + LIVE pill; drop branch lineage words that only made sense for multi-draft (keep \"rolled away from\"). Propagation bar per the note (",{"type":21,"tag":59,"props":233,"children":235},{"className":234},[],[236],{"type":30,"value":237},"..\u002Fsources\u002Flogseq-propagation.png",{"type":30,"value":239},"): green bar \"97 of 100 endpoints · 3 still on earlier versions\" on live, grey on others. \"Roll back here…\" with required note. Per row: ",{"type":21,"tag":26,"props":241,"children":242},{},[243],{"type":30,"value":244},"View JSON",{"type":30,"value":246}," \u002F ",{"type":21,"tag":26,"props":248,"children":249},{},[250],{"type":30,"value":251},"Download",{"type":30,"value":253}," (",{"type":21,"tag":59,"props":255,"children":257},{"className":256},[],[258],{"type":30,"value":259},"policy-config-v13.json",{"type":30,"value":261},").",{"type":21,"tag":117,"props":263,"children":264},{},[265,270,272,278,280,286],{"type":21,"tag":26,"props":266,"children":267},{},[268],{"type":30,"value":269},"ConfigJson.vue.",{"type":30,"value":271}," A read-only code view of ",{"type":21,"tag":59,"props":273,"children":275},{"className":274},[],[276],{"type":30,"value":277},"configJson(v)",{"type":30,"value":279}," with syntax colouring done in the component (tokenise keys \u002F strings \u002F numbers \u002F booleans with a small regex; no new dependency), line numbers, copy, download. Anchor ",{"type":21,"tag":59,"props":281,"children":283},{"className":282},[],[284],{"type":30,"value":285},"#json",{"type":30,"value":287},"; opens for the live version by default, a version picker for others and \"draft\".",{"type":21,"tag":117,"props":289,"children":290},{},[291,296,297,303,305,311],{"type":21,"tag":26,"props":292,"children":293},{},[294],{"type":30,"value":295},"Import",{"type":30,"value":253},{"type":21,"tag":59,"props":298,"children":300},{"className":299},[],[301],{"type":30,"value":302},"#import",{"type":30,"value":304},"): paste or file → ",{"type":21,"tag":59,"props":306,"children":308},{"className":307},[],[309],{"type":30,"value":310},"importConfig()",{"type":30,"value":312}," → errors listed, or \"Staged N edits — review them in the tray\". States: empty, invalid JSON, validation errors, success.",{"type":21,"tag":117,"props":314,"children":315},{},[316,318,324],{"type":30,"value":317},"Remove the approval toggle, Approve \u002F Promote \u002F Reconcile, the \"viewing as\" approval logic; ",{"type":21,"tag":59,"props":319,"children":321},{"className":320},[],[322],{"type":30,"value":323},"?as=",{"type":30,"value":325}," still decides the author of new edits.",{"type":21,"tag":117,"props":327,"children":328},{},[329],{"type":30,"value":330},"Layout: only if the tray mount needs a prop change.",{"type":21,"tag":107,"props":332,"children":334},{"id":333},"done-when",[335],{"type":30,"value":15},{"type":21,"tag":22,"props":337,"children":338},{},[339,341,347],{"type":30,"value":340},"Flow: stage two edits on S3 → Save to draft → Changes shows 8 pending with authors + BlastRadius → Publish with note → v14 live, bar resets → Roll back to v13 with note → draft changes re-based. JSON view + download + import (valid, invalid). Screenshots ",{"type":21,"tag":59,"props":342,"children":344},{"className":343},[],[345],{"type":30,"value":346},"shots\u002F03-*.png",{"type":30,"value":105},{"type":21,"tag":107,"props":349,"children":351},{"id":350},"look-for-review",[352],{"type":30,"value":16},{"type":21,"tag":22,"props":354,"children":355},{},[356],{"type":30,"value":357},"Nowhere says \"draft D-n\", \"promote\", \"approve\"; version strings are integers; JSON is the whole org config, not a policy.",1794599471622]