[{"data":1,"prerenderedAt":794},["ShallowReactive",2],{"$fVG2lEPhxDgj8eo0h91R_Dhz0U6UgnKljfhhMuFUvos4":3},{"newThing":4,"project":5,"cycle":8,"sections":22,"threads":731,"otherDocs":732,"images":734,"archiveItems":785,"links":786},null,{"id":6,"label":7,"liveBase":4},"design","Design",{"id":9,"num":10,"dir":11,"name":12,"title":12,"focus":13,"status":14,"statusNote":4,"created":15,"completed":4,"mode":4,"recordless":16,"thumbnail":17,"imageCount":18,"artifactCount":19,"lastActivity":20,"hasPickup":16,"hasInitialPrompt":21},"c64",64,"c64.control-center-consolidation","control-center-consolidation","Consolidate the overlapping Control Center \u002F Policy & Enforcement \u002F Compliance work — current-state evaluation, ranked consolidation plan, initial-ideas mock","active","2026-08-10",false,"\u002Fcycles\u002Fdesign\u002Fc64-control-center-ideas.png",14,3,"2026-09-11",true,[23,70,104,177],{"key":24,"title":25,"empty":16,"ast":26},"why","Why",{"type":27,"children":28},"root",[29],{"type":30,"tag":31,"props":32,"children":33},"element","p",{},[34,37,44,46,52,54,60,62,68],{"type":35,"value":36},"text","Parallel dash-ui efforts left qdash with three overlapping surfaces: ",{"type":30,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":35,"value":43},"\u002Fcontrols",{"type":35,"value":45}," (Control Center), ",{"type":30,"tag":38,"props":47,"children":49},{"className":48},[],[50],{"type":35,"value":51},"\u002Fpolicy",{"type":35,"value":53}," (Policy & Enforcement), and ",{"type":30,"tag":38,"props":55,"children":57},{"className":56},[],[58],{"type":35,"value":59},"\u002Fcompliance",{"type":35,"value":61}," + ",{"type":30,"tag":38,"props":63,"children":65},{"className":64},[],[66],{"type":35,"value":67},"\u002Fframework",{"type":35,"value":69},". The policy page and Control Center duplicate the control table and its authoring flow with diverging numbers; compliance work overlaps both. Exploration showed the parallelism is temporal, not branch-level — three qcontrol cycles (c3\u002Fc4\u002Fc5) landed within 5 days of each other around a Control Center that was never reconciled, and the queued component-consolidation cycle (qcontrol c2) never ran. An in-depth design pass follows this cycle; c64's job is a crystal-clear picture of the current state plus low-hanging-fruit consolidation moves.",{"key":71,"title":72,"empty":16,"ast":73},"objective","Objective",{"type":27,"children":74},[75],{"type":30,"tag":31,"props":76,"children":77},{},[78,80,86,88,94,96,102],{"type":35,"value":79},"Three deliverables: (1) ",{"type":30,"tag":38,"props":81,"children":83},{"className":82},[],[84],{"type":35,"value":85},"current-state.md",{"type":35,"value":87}," — the duplication map, findings numbered F1–F10 so downstream work can cite them; (2) ",{"type":30,"tag":38,"props":89,"children":91},{"className":90},[],[92],{"type":35,"value":93},"consolidation-plan.md",{"type":35,"value":95}," — ranked low-hanging fruit + questions reserved for the deep pass; (3) ",{"type":30,"tag":38,"props":97,"children":99},{"className":98},[],[100],{"type":35,"value":101},"\u002Fpages\u002Fcontrol-center-ideas",{"type":35,"value":103}," — a c61-style ideas mock with four initial consolidation concepts. Explicitly NOT solving everything — understanding + quick wins only.",{"key":105,"title":106,"empty":16,"ast":107},"scope","Scope",{"type":27,"children":108},[109],{"type":30,"tag":110,"props":111,"children":112},"ul",{},[113,125,136,172],{"type":30,"tag":114,"props":115,"children":116},"li",{},[117,123],{"type":30,"tag":38,"props":118,"children":120},{"className":119},[],[121],{"type":35,"value":122},"cycles\u002Fc64.control-center-consolidation\u002F",{"type":35,"value":124}," — current-state.md, consolidation-plan.md",{"type":30,"tag":114,"props":126,"children":127},{},[128,134],{"type":30,"tag":38,"props":129,"children":131},{"className":130},[],[132],{"type":35,"value":133},"app\u002Fpages\u002Fpages\u002Fcontrol-center-ideas.vue",{"type":35,"value":135}," + page-registry entry",{"type":30,"tag":114,"props":137,"children":138},{},[139,141,147,149,155,156,162,164,170],{"type":35,"value":140},"Read-only inputs: qcontrol ",{"type":30,"tag":38,"props":142,"children":144},{"className":143},[],[145],{"type":35,"value":146},"crates\u002Fqdash\u002Fui",{"type":35,"value":148}," pages + ",{"type":30,"tag":38,"props":150,"children":152},{"className":151},[],[153],{"type":35,"value":154},"docs\u002Fplan\u002Fqdash-information-architecture.md",{"type":35,"value":61},{"type":30,"tag":38,"props":157,"children":159},{"className":158},[],[160],{"type":35,"value":161},"rules.rs",{"type":35,"value":163}," PACKS; bob-wire ",{"type":30,"tag":38,"props":165,"children":167},{"className":166},[],[168],{"type":35,"value":169},"c17-governance.ts",{"type":35,"value":171},"; design c54\u002Fc56\u002Fc63 cycles",{"type":30,"tag":114,"props":173,"children":174},{},[175],{"type":35,"value":176},"No qdash code changes in this cycle (the plan is the deliverable; execution is qcontrol-side follow-up)",{"key":178,"title":179,"empty":16,"ast":180},"key-changes","Key Changes",{"type":27,"children":181},[182],{"type":30,"tag":110,"props":183,"children":184},{},[185,190,200,218,235,262,272,296,320,344,349,354,359,391,432,498,540,564],{"type":30,"tag":114,"props":186,"children":187},{},[188],{"type":35,"value":189},"Exploration: qdash pages + git history (parallelism is temporal, not branch-level — c3\u002Fc4\u002Fc5 in 5 days around an unreconciled \u002Fcontrols; qcontrol c2 never ran) and design-site\u002Fbob-wire reference inventory (Gen 1 card era vs Gen 2 table era; no Control Center mock existed)",{"type":30,"tag":114,"props":191,"children":192},{},[193,198],{"type":30,"tag":38,"props":194,"children":196},{"className":195},[],[197],{"type":35,"value":85},{"type":35,"value":199}," — timeline, page inventory, findings F1–F10, mock inventory, and the normalized control vocabulary (14 controls × c17 family × rules.rs packs) that doubles as the mock dataset",{"type":30,"tag":114,"props":201,"children":202},{},[203,208,210,216],{"type":30,"tag":38,"props":204,"children":206},{"className":205},[],[207],{"type":35,"value":93},{"type":35,"value":209}," — 9 ranked low-hanging-fruit items tagged ",{"type":30,"tag":211,"props":212,"children":213},"span",{},[214],{"type":35,"value":215},"F#",{"type":35,"value":217}," with sequencing, + 5 questions reserved for the deep pass",{"type":30,"tag":114,"props":219,"children":220},{},[221,226,228,233],{"type":30,"tag":38,"props":222,"children":224},{"className":223},[],[225],{"type":35,"value":101},{"type":35,"value":227}," mock (",{"type":30,"tag":38,"props":229,"children":231},{"className":230},[],[232],{"type":35,"value":133},{"type":35,"value":234},", registered in page-registry): Idea 1 \"One vocabulary\" (normalized table, findings vs would-catch as distinct labeled counts), Idea 2 \"One surface, three lenses\" (working Controls\u002FEnforcement\u002FCoverage tabs per the IA doc — recommended), Idea 3 \"Pack toggle = the bridge\" (live pack toggles → provable\u002Fattestation\u002Fout-of-scope buckets, one server evidence CTA), Idea 4 \"Act\u002FProve split\" (compressed alternative for the deep pass to adjudicate)",{"type":30,"tag":114,"props":236,"children":237},{},[238,244,246,252,254,260],{"type":30,"tag":239,"props":240,"children":241},"strong",{},[242],{"type":35,"value":243},"Iteration direction chosen (2026-08-10): start from the existing controls table and iterate.",{"type":35,"value":245}," ",{"type":30,"tag":38,"props":247,"children":249},{"className":248},[],[250],{"type":35,"value":251},"\u002Fpages\u002Fcontrol-center",{"type":35,"value":253}," (",{"type":30,"tag":38,"props":255,"children":257},{"className":256},[],[258],{"type":35,"value":259},"app\u002Fpages\u002Fpages\u002Fcontrol-center.vue",{"type":35,"value":261},") — 1:1 replica of qdash \u002Fcontrols: template + helper logic copied verbatim (same layer DataTable), Panel\u002FPageHeader chrome inlined, live-data snapshot from \u002Fapi\u002Fcontrols + \u002Fapi\u002Fsecurity (12 seeded controls, 107 findings, match counts egress 83 · quota 19 · shadow 4 · budget 1), pack enablement as a ref standing in for localStorage; GovernSheet\u002Fdownloads\u002Fcross-links stubbed with titled affordances",{"type":30,"tag":114,"props":263,"children":264},{},[265,270],{"type":30,"tag":239,"props":266,"children":267},{},[268],{"type":35,"value":269},"Iteration 1 — category sections:",{"type":35,"value":271}," controls grouped by GovernSheet category (8 categories, dropdown order, empty ones dropped) using \u002Fpolicy's section-row idiom; section rows carry control count + rolled-up match total; DataTable swapped for its underlying UxTableList to host section rows, all cells + expand details unchanged. Real categories pulled from \u002Fapi\u002Fcontrols (autonomy ×3, egress ×2, consumption ×2, privilege\u002Fposture\u002Fdata\u002Ftarget\u002Fcoverage ×1)",{"type":30,"tag":114,"props":273,"children":274},{},[275,280,281,287,288,294],{"type":30,"tag":239,"props":276,"children":277},{},[278],{"type":35,"value":279},"Iteration 2 — two-column grid (non-destructive):",{"type":35,"value":245},{"type":30,"tag":38,"props":282,"children":284},{"className":283},[],[285],{"type":35,"value":286},"\u002Fpages\u002Fcontrol-center-v2",{"type":35,"value":253},{"type":30,"tag":38,"props":289,"children":291},{"className":290},[],[292],{"type":35,"value":293},"control-center-v2.vue",{"type":35,"value":295},", registered) — categories as half-width cards in a lg:grid-cols-2, sunken header bands with count + rolled-up matches, compact control rows (name\u002Fcondition + severity + matches, pills + edit on line two). Trade-offs vs iteration 1 noted on-page: one-screen catalog and one-control categories stop dominating, but loses the aligned column grid and expand-row details",{"type":30,"tag":114,"props":297,"children":298},{},[299,304,305,311,312,318],{"type":30,"tag":239,"props":300,"children":301},{},[302],{"type":35,"value":303},"Iteration 3 — category column (non-destructive):",{"type":35,"value":245},{"type":30,"tag":38,"props":306,"children":308},{"className":307},[],[309],{"type":35,"value":310},"\u002Fpages\u002Fcontrol-center-v3",{"type":35,"value":253},{"type":30,"tag":38,"props":313,"children":315},{"className":314},[],[316],{"type":35,"value":317},"control-center-v3.vue",{"type":35,"value":319},", registered) — the replica's flat DataTable exactly as-is plus one Category column (GovernSheet label as a neutral chip). Lightest touch: no grouping chrome, category becomes scannable\u002Fsortable. All three variations + ideas page verified rendering. (Ops note: the dev-server page watcher went stale twice today — new-page routes 404ing until a server restart; restarted twice, qdash :3030 untouched)",{"type":30,"tag":114,"props":321,"children":322},{},[323,328,329,335,336,342],{"type":30,"tag":239,"props":324,"children":325},{},[326],{"type":35,"value":327},"Control expand row (two-section):",{"type":35,"value":245},{"type":30,"tag":38,"props":330,"children":332},{"className":331},[],[333],{"type":35,"value":334},"\u002Fpages\u002Fcontrol-expand",{"type":35,"value":253},{"type":30,"tag":38,"props":337,"children":339},{"className":338},[],[340],{"type":35,"value":341},"control-expand.vue",{"type":35,"value":343},", registered) — the controls table with two-section expand cards (inventory-agent-expand-v2 idiom: bare ExpandRow + stacked UxTableListExpandSection, close X on section 1, egress auto-opens per variation). Section 1 = read (name · active findings · framework coverage), section 2 = edit (condition · decisions · actions, sentence-family pills). Three variations: V1 big-name header + three-column workbench, V2 findings-forward (real egress snapshot rows) + SentenceRow-labeled sentence flow with pill-toggle decisions, V3 one-line identity strip + dense two-column edit. Edit state deliberately shared across variations (\"one model, three skins\"). V4 (2026-08-11): V1's read header + V3's edit as one flex row — condition flex-1 with UxAddBtn for AND clauses (mono summary line dropped), decisions\u002Factions compact columns, save button rule-separated beneath, space-y-8 between sections",{"type":30,"tag":114,"props":345,"children":346},{},[347],{"type":35,"value":348},"V5 (2026-08-11, based on V4): three sections — V4's read header · condition (one-line, UxAddBtn) + clickable severity chips + Category selector (all 8 GovernSheet categories, .ctl-style select with helper caption, forms-plugin chevron) · third section with the GovernSheet's FULL option sets (all 7 decisions with hints, remediation input, all 5 when-it-happens actions incl. require-approval\u002Froute with proj marks, all 10 Satisfies packs editable), save beneath. Edit state extended (sev\u002Fremediation\u002Fapproval\u002Froute\u002Fpacks) — shared across variations",{"type":30,"tag":114,"props":350,"children":351},{},[352],{"type":35,"value":353},"Condition adding wired (2026-08-11): edit model refactored to a clause array; V4 + V5's UxAddBtn appends an AND clause (signal-appropriate default field via a FIELDS-per-signal map, per-clause ✕ remove, 4-clause cap mirroring GovernSheet); first-clause field select upgraded from single-option to the signal's full field list",{"type":30,"tag":114,"props":355,"children":356},{},[357],{"type":35,"value":358},"V5 refinements (2026-08-11): Category moved from section 2 to section 3 left column (above Remediation, GovernSheet order); Save control right-aligned",{"type":30,"tag":114,"props":360,"children":361},{},[362,367,368,374,376,382,383,389],{"type":30,"tag":239,"props":363,"children":364},{},[365],{"type":35,"value":366},"Idea 3 shipped to qdash (2026-08-11):",{"type":35,"value":245},{"type":30,"tag":38,"props":369,"children":371},{"className":370},[],[372],{"type":35,"value":373},"qcontrol\u002Fcrates\u002Fqdash\u002Fui\u002Fapp\u002Fpages\u002Fcontrols.vue",{"type":35,"value":375}," — the packs card grid replaced with the managed-list picker (enabled-only removable chips in qdash's primary tint + SentenceSelect add-pill over the not-yet-enabled remainder). Panel title\u002Fcount\u002Fintro\u002FlocalStorage persistence unchanged; add flows through togglePack so persistence stays in one place. Uncommitted in the qcontrol working tree. First qdash code change of c64 (scope extended by Mark). Note: still the 6-pack list — expanding to the full 10-pack rules.rs vocabulary is consolidation-plan item 2, deliberately not smuggled into this UI change ",{"type":30,"tag":38,"props":377,"children":379},{"className":378},[],[380],{"type":35,"value":381},"\u002Fpages\u002Fframework-picker-ideas",{"type":35,"value":253},{"type":30,"tag":38,"props":384,"children":386},{"className":385},[],[387],{"type":35,"value":388},"framework-picker-ideas.vue",{"type":35,"value":390},", registered) — four compact alternatives to the \u002Fcontrols pack-card grid, rendered against the current grid as baseline at the TRUE 10-pack catalog size (the shipped panel shows 6 — an F2 drift). One shared enabled-set across all variations. Idea 1 toggle chips (all options visible, ~6× less vertical), Idea 2 popover picker (one-line closed state, enable-all), Idea 3 enabled-only + SentenceSelect add-pill (managed-list steady-state), Idea 4 GovernSheet-style checkbox wrap (panel and sheet would read identically)",{"type":30,"tag":114,"props":392,"children":393},{},[394,399,400,406,408,414,416,422,424,430],{"type":30,"tag":239,"props":395,"children":396},{},[397],{"type":35,"value":398},"Layer change — ExpandSection wraps text (2026-08-11):",{"type":35,"value":245},{"type":30,"tag":38,"props":401,"children":403},{"className":402},[],[404],{"type":35,"value":405},"UxTableList",{"type":35,"value":407}," sets ",{"type":30,"tag":38,"props":409,"children":411},{"className":410},[],[412],{"type":35,"value":413},"whitespace-nowrap",{"type":35,"value":415}," on the whole table (cell behavior), which expand-card content inherits — long captions then set the column's min-content and overflow the card padding (seen on V5's Satisfies caption). Fix: ",{"type":30,"tag":38,"props":417,"children":419},{"className":418},[],[420],{"type":35,"value":421},"ExpandSection",{"type":35,"value":423}," root now carries ",{"type":30,"tag":38,"props":425,"children":427},{"className":426},[],[428],{"type":35,"value":429},"whitespace-normal",{"type":35,"value":431}," — expand cards are prose-shaped, not cells. Benefits every ExpandSection consumer",{"type":30,"tag":114,"props":433,"children":434},{},[435,440,442,448,450,456,458,464,466,472,474,480,482,488,490,496],{"type":30,"tag":239,"props":436,"children":437},{},[438],{"type":35,"value":439},"Layer change — SentenceSelect sizes to current selection (2026-08-11):",{"type":35,"value":441}," rebuilt ",{"type":30,"tag":38,"props":443,"children":445},{"className":444},[],[446],{"type":35,"value":447},"q-nuxt-layer\u002Fcomponents\u002Fsentence\u002FSelect.vue",{"type":35,"value":449}," on the mirror-span technique — an invisible in-flow span carrying the ",{"type":30,"tag":451,"props":452,"children":453},"em",{},[454],{"type":35,"value":455},"selected",{"type":35,"value":457}," option's label (same font\u002Fpadding\u002Fborder metrics) sets the pill width, with the select overlaid ",{"type":30,"tag":38,"props":459,"children":461},{"className":460},[],[462],{"type":35,"value":463},"absolute inset-0 w-full h-full",{"type":35,"value":465},". First attempt used inline-grid + ",{"type":30,"tag":38,"props":467,"children":469},{"className":468},[],[470],{"type":35,"value":471},"min-w-0",{"type":35,"value":473}," and did NOT work: an auto grid track still sizes to the select's max-content (its widest option) — the select must be out of flow entirely. Selected label read from ",{"type":30,"tag":38,"props":475,"children":477},{"className":476},[],[478],{"type":35,"value":479},"selectedOptions[0].text",{"type":35,"value":481}," (mount\u002Fupdate\u002Fchange sync; SSR seeds from modelValue). Side-find: the ⌄ chevron on these pills comes from the layer's ",{"type":30,"tag":38,"props":483,"children":485},{"className":484},[],[486],{"type":35,"value":487},"@tailwindcss\u002Fforms",{"type":35,"value":489}," (base strategy) background-image, not the component — ",{"type":30,"tag":38,"props":491,"children":493},{"className":492},[],[494],{"type":35,"value":495},"appearance-none",{"type":35,"value":497}," never affected it, so the component's appearance-suppression was dead code (removed). Chevron reserve slimmed pr-12 → pr-8 (~8px gap between content and the forms-plugin chevron at right 0.5rem)",{"type":30,"tag":114,"props":499,"children":500},{},[501,506,508,514,516,522,524,530,532,538],{"type":30,"tag":239,"props":502,"children":503},{},[504],{"type":35,"value":505},"Layer change — SentenceText de-greedied (2026-08-11):",{"type":35,"value":507}," removed the hardcoded ",{"type":30,"tag":38,"props":509,"children":511},{"className":510},[],[512],{"type":35,"value":513},"flex-1 min-w-[200px]",{"type":35,"value":515}," from ",{"type":30,"tag":38,"props":517,"children":519},{"className":518},[],[520],{"type":35,"value":521},"q-nuxt-layer\u002Fcomponents\u002Fsentence\u002FText.vue",{"type":35,"value":523},"; the pill now sizes to content via the native ",{"type":30,"tag":38,"props":525,"children":527},{"className":526},[],[528],{"type":35,"value":529},"size",{"type":35,"value":531}," attribute (content length, falling back to placeholder length, floor 4) so it sits inline in a sentence like the other pills. Call sites wanting fill pass ",{"type":30,"tag":38,"props":533,"children":535},{"className":534},[],[536],{"type":35,"value":537},"class=\"flex-1\"",{"type":35,"value":539},". Affects all consumers at next layer release — check NotificationRuleCard-style URL fields when bumping",{"type":30,"tag":114,"props":541,"children":542},{},[543,548,549,555,556,562],{"type":30,"tag":239,"props":544,"children":545},{},[546],{"type":35,"value":547},"Control detail page:",{"type":35,"value":245},{"type":30,"tag":38,"props":550,"children":552},{"className":551},[],[553],{"type":35,"value":554},"\u002Fpages\u002Fcontrol-detail",{"type":35,"value":253},{"type":30,"tag":38,"props":557,"children":559},{"className":558},[],[560],{"type":35,"value":561},"control-detail.vue",{"type":35,"value":563},", registered) — the GovernSheet edit modal promoted to a full page (the per-control detail the plan reserved; Figma 12499:26869 territory). Copy, field order, and .ctl\u002F.proj chrome verbatim from qdash GovernSheet.vue; page adds a context header (breadcrumb, name, severity\u002Fcategory chips, mono id, live matches) and a two-column Definition \u002F Response-&-mapping split with bottom save bar. Exemplar = seeded crit control matching Mark's screenshot. Compile-verified (no dev server was running — all servers killed after the .nuxt collision)",{"type":30,"tag":114,"props":565,"children":566},{},[567,572,573,579,581,587,589,595,597,602,604,610,612,618,620,626,628,634,636,642,644,650,652,658,660,666,668,674,676,682,684,690,692,698,700,706,708,714,716,721,723,729],{"type":30,"tag":239,"props":568,"children":569},{},[570],{"type":35,"value":571},"V5 shipped to qdash (2026-08-11):",{"type":35,"value":245},{"type":30,"tag":38,"props":574,"children":576},{"className":575},[],[577],{"type":35,"value":578},"qcontrol",{"type":35,"value":580}," commit ",{"type":30,"tag":38,"props":582,"children":584},{"className":583},[],[585],{"type":35,"value":586},"376baabb",{"type":35,"value":588}," on ",{"type":30,"tag":38,"props":590,"children":592},{"className":591},[],[593],{"type":35,"value":594},"feat\u002Fcontrol-center",{"type":35,"value":596}," — ",{"type":30,"tag":38,"props":598,"children":600},{"className":599},[],[601],{"type":35,"value":43},{"type":35,"value":603}," expand row is now the three-section V5 card (",{"type":30,"tag":38,"props":605,"children":607},{"className":606},[],[608],{"type":35,"value":609},"ControlExpandCard.vue",{"type":35,"value":611},"), replacing the link-list details and the edit-via-modal path for existing controls. Faithful to the mock with reality corrections: vocabulary-backed fields\u002Fsignals\u002Fops\u002Fdecisions instead of the mock's hardcoded lists, static ",{"type":30,"tag":38,"props":613,"children":615},{"className":614},[],[616],{"type":35,"value":617},"and",{"type":35,"value":619}," (backend rules are AND-only — the mock's and\u002For pill was aspirational), GovernSheet's dry-run preview kept under the sentence, section-1 header shows saved values not the draft. Table gains the category column (5 cols, actions kept per Mark). Hygiene rode along: GovernSheet's authoring engine extracted to ",{"type":30,"tag":38,"props":621,"children":623},{"className":622},[],[624],{"type":35,"value":625},"useControlDraft",{"type":35,"value":627}," (modal + card share it; props\u002Femits contract unchanged so policy.vue promote is untouched), shared ",{"type":30,"tag":38,"props":629,"children":631},{"className":630},[],[632],{"type":35,"value":633},"useControlVocab",{"type":35,"value":635}," cache, real ",{"type":30,"tag":38,"props":637,"children":639},{"className":638},[],[640],{"type":35,"value":641},"Control",{"type":35,"value":643}," interface + tested ",{"type":30,"tag":38,"props":645,"children":647},{"className":646},[],[648],{"type":35,"value":649},"sevNorm",{"type":35,"value":651},"\u002F",{"type":30,"tag":38,"props":653,"children":655},{"className":654},[],[656],{"type":35,"value":657},"hasAlert",{"type":35,"value":659}," in ",{"type":30,"tag":38,"props":661,"children":663},{"className":662},[],[664],{"type":35,"value":665},"lib\u002Fcontrol.ts",{"type":35,"value":667},", ",{"type":30,"tag":38,"props":669,"children":671},{"className":670},[],[672],{"type":35,"value":673},".proj",{"type":35,"value":675}," deduplicated into ",{"type":30,"tag":38,"props":677,"children":679},{"className":678},[],[680],{"type":35,"value":681},"ProjMark.vue",{"type":35,"value":683},", and the mock's dense ",{"type":30,"tag":38,"props":685,"children":687},{"className":686},[],[688],{"type":35,"value":689},"rowRefs",{"type":35,"value":691}," callback-ref pattern dropped entirely (DataTable's ",{"type":30,"tag":38,"props":693,"children":695},{"className":694},[],[696],{"type":35,"value":697},"bareDetails",{"type":35,"value":699}," + slot-scoped ",{"type":30,"tag":38,"props":701,"children":703},{"className":702},[],[704],{"type":35,"value":705},"close",{"type":35,"value":707}," covers it). Two latent bugs fixed in passing: the dry-run timer now clears on unmount, and the follow-the-rule watchers are ",{"type":30,"tag":38,"props":709,"children":711},{"className":710},[],[712],{"type":35,"value":713},"immediate",{"type":35,"value":715}," (the shared vocab cache is usually warm before a card mounts, so vocab-change triggers alone never fired — caught via headless-browser verification: New-control category select rendered empty). Layer released as ",{"type":30,"tag":239,"props":717,"children":718},{},[719],{"type":35,"value":720},"v0.9.7",{"type":35,"value":722}," (the three sentence\u002FExpandSection changes above); all consumer lockfiles refreshed. Verified end-to-end in headless Chromium against the live backend: expand\u002Fdry-run\u002Fseverity\u002Fadd-remove clause\u002Fclose-X\u002Fsave-as-copy round trip + New-control modal, zero console errors; ",{"type":30,"tag":38,"props":724,"children":726},{"className":725},[],[727],{"type":35,"value":728},"dist\u002F",{"type":35,"value":730}," regenerated via the isolated build.",[],[85,733],"initial-prompt.md",[735,740,744,748,752,756,760,763,767,770,773,776,779,782],{"src":736,"kind":737,"order":738,"caption":739},"\u002Fcycles\u002Fdesign\u002Fc64-control-center.png","hero",35,"1:1 replica of the live qdash \u002Fcontrols page — framework packs, controls DataTable with expand details, evidence packet. c64 iteration starting point",{"src":741,"kind":737,"order":742,"caption":743},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-v2.png",36,"c64 iteration 2 — categories as half-width cards in a two-column grid, compact control rows, sunken header bands with rolled-up matches",{"src":745,"kind":737,"order":746,"caption":747},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-v3.png",37,"c64 iteration 3 — the replica's flat table exactly as-is plus a Category column chip; lightest-touch variation",{"src":749,"kind":737,"order":750,"caption":751},"\u002Fcycles\u002Fdesign\u002Fc64-control-detail.png",38,"c64 — the GovernSheet edit modal promoted to a full page: context header, two-column definition\u002Fresponse split, condition sentence, decisions, projected enforce marks, pack mapping",{"src":753,"kind":737,"order":754,"caption":755},"\u002Fcycles\u002Fdesign\u002Fc64-control-expand.png",39,"c64 — sectioned expand card on the controls table, five variations: read section (name · findings · coverage) over editable condition\u002Fdecisions\u002Factions — V5 with full GovernSheet option sets in three sections",{"src":757,"kind":737,"order":758,"caption":759},"\u002Fcycles\u002Fdesign\u002Fc64-framework-picker-ideas.png",40,"c64 — compact alternatives to the \u002Fcontrols pack-card grid: toggle chips, popover picker, enabled-only + add pill, checkbox wrap — one shared enabled-set, full 10-pack vocabulary",{"src":17,"kind":737,"order":761,"caption":762},41,"Four c64 consolidation concepts — normalized vocabulary table, three-lens Control Center, pack-toggle coverage bridge, Act\u002FProve split",{"src":764,"kind":765,"order":766},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-full.png","full",9035,{"src":768,"kind":765,"order":769},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-v2-full.png",9036,{"src":771,"kind":765,"order":772},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-v3-full.png",9037,{"src":774,"kind":765,"order":775},"\u002Fcycles\u002Fdesign\u002Fc64-control-detail-full.png",9038,{"src":777,"kind":765,"order":778},"\u002Fcycles\u002Fdesign\u002Fc64-control-expand-full.png",9039,{"src":780,"kind":765,"order":781},"\u002Fcycles\u002Fdesign\u002Fc64-framework-picker-ideas-full.png",9040,{"src":783,"kind":765,"order":784},"\u002Fcycles\u002Fdesign\u002Fc64-control-center-ideas-full.png",9041,[],[787,788,789,790,791,792,793],{"route":101,"href":101},{"route":286,"href":286},{"route":310,"href":310},{"route":251,"href":251},{"route":554,"href":554},{"route":334,"href":334},{"route":381,"href":381},1789151081978]