[{"data":1,"prerenderedAt":2162},["ShallowReactive",2],{"$fu8WPgUxzj1W1JSwJjIiNq0JzCnsuc-So_X9KSKTXc8U":3},{"newThing":4,"project":5,"cycle":8,"sections":24,"threads":2148,"otherDocs":2156,"images":2159,"archiveItems":2160,"links":2161},null,{"id":6,"label":7,"liveBase":4},"design","Design",{"id":9,"num":10,"dir":11,"name":12,"title":13,"focus":14,"status":15,"statusNote":16,"created":17,"completed":4,"mode":18,"recordless":19,"thumbnail":4,"imageCount":20,"artifactCount":21,"lastActivity":22,"hasPickup":19,"hasInitialPrompt":23},"c79",79,"c79.finding-lifecycle","finding-lifecycle","Finding Lifecycle","Mock the finding-lifecycle state machine and the mechanics\u002FUI of turning findings into SLA data — the design answer to c78's open resolution-workflow gap.","active","large — lifecycle machine + findings-page redesign","2026-08-25","Evolution — extends the c78 report world down one layer, from the rendered SLA report to the mechanics that produce its rows.",false,0,6,"2026-09-11",true,[25,77,87,244,1501,1514,1966,2007],{"key":26,"title":27,"empty":19,"ast":28},"why","Why",{"type":29,"children":30},"root",[31,56],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46,48,54],{"type":37,"value":38},"text","The c78 SLA Insights report (",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"\u002Fpages\u002Freport-sla-v1",{"type":37,"value":47},") carries a recorded dependency: the finding resolution workflow — acknowledge \u002F ignore \u002F exception \u002F escalate \u002F enforce with a persisted audit record — isn't in the product; the report assumes it in fixture form. Mark M (Mark Peterson, external CISO advisor) named those verbs and the org-defined SLA rubric on the 2026-08-20 product review call; his own program's rubric is critical 14d \u002F high 30d \u002F medium 90d \u002F low soft. SLA data is a pure function — ",{"type":32,"tag":40,"props":49,"children":51},{"className":50},[],[52],{"type":37,"value":53},"f(finding events, rubric, now)",{"type":37,"value":55}," — and until the lifecycle that emits those events is designed, the SLA report is a surface with no floor under it.",{"type":32,"tag":33,"props":57,"children":58},{},[59,61,67,69,75],{"type":37,"value":60},"Deliberate non-goals, from the kick-off prompt: do ",{"type":32,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":37,"value":66},"not",{"type":37,"value":68}," build what customers already have — ticketing, on-call routing, remediation project tracking. Those are integration seams (Mark M's own stack: ",{"type":32,"tag":40,"props":70,"children":72},{"className":71},[],[73],{"type":37,"value":74},"#wiz_alerts",{"type":37,"value":76},"-style Slack channels, Jira), rendered as stubs.",{"key":78,"title":79,"empty":19,"ast":80},"objective","Objective",{"type":29,"children":81},[82],{"type":32,"tag":33,"props":83,"children":84},{},[85],{"type":37,"value":86},"Understand — by building — the simple mechanics\u002FUI of turning findings into SLA data: the state machine ruled and drawn, a disposition panel exercising all five verbs, the rubric as org config, and an interactive centerpiece where acting on a finding appends to its audit trail and recomputes the SLA rollups live.",{"key":88,"title":89,"empty":19,"ast":90},"scope","Scope",{"type":29,"children":91},[92],{"type":32,"tag":93,"props":94,"children":95},"ul",{},[96,149,178,231],{"type":32,"tag":97,"props":98,"children":99},"li",{},[100,102,108,110,116,118,124,126,132,134,140,142,147],{"type":37,"value":101},"New fixture module ",{"type":32,"tag":40,"props":103,"children":105},{"className":104},[],[106],{"type":37,"value":107},"app\u002Fdata\u002Flifecycle-fixtures.ts",{"type":37,"value":109}," — event-sourced findings (append-only ",{"type":32,"tag":40,"props":111,"children":113},{"className":112},[],[114],{"type":37,"value":115},"FindingEvent",{"type":37,"value":117}," log), Mark M's real rubric, pure ",{"type":32,"tag":40,"props":119,"children":121},{"className":120},[],[122],{"type":37,"value":123},"deriveFinding",{"type":37,"value":125}," \u002F ",{"type":32,"tag":40,"props":127,"children":129},{"className":128},[],[130],{"type":37,"value":131},"deriveWorld",{"type":37,"value":133},". Imports from ",{"type":32,"tag":40,"props":135,"children":137},{"className":136},[],[138],{"type":37,"value":139},"report-fixtures.ts",{"type":37,"value":141},"; ",{"type":32,"tag":62,"props":143,"children":144},{},[145],{"type":37,"value":146},"never modifies it",{"type":37,"value":148}," (c78 is unclosed pending Mark's picks).",{"type":32,"tag":97,"props":150,"children":151},{},[152,154,160,162,168,170,176],{"type":37,"value":153},"Local organs ",{"type":32,"tag":40,"props":155,"children":157},{"className":156},[],[158],{"type":37,"value":159},"app\u002Fcomponents\u002Flifecycle\u002F",{"type":37,"value":161}," — ",{"type":32,"tag":40,"props":163,"children":165},{"className":164},[],[166],{"type":37,"value":167},"DispositionPanel",{"type":37,"value":169},", ",{"type":32,"tag":40,"props":171,"children":173},{"className":172},[],[174],{"type":37,"value":175},"AuditTrail",{"type":37,"value":177},".",{"type":32,"tag":97,"props":179,"children":180},{},[181,183,189,191,197,199,205,207,213,215,221,223,229],{"type":37,"value":182},"Four pages in ",{"type":32,"tag":40,"props":184,"children":186},{"className":185},[],[187],{"type":37,"value":188},"app\u002Fpages\u002Fpages\u002F",{"type":37,"value":190},", registered in the existing ",{"type":32,"tag":40,"props":192,"children":194},{"className":193},[],[195],{"type":37,"value":196},"reports",{"type":37,"value":198}," group: ",{"type":32,"tag":40,"props":200,"children":202},{"className":201},[],[203],{"type":37,"value":204},"findings-lifecycle-v1",{"type":37,"value":206}," (static anatomy: states, verb map, clock rules, worked example), ",{"type":32,"tag":40,"props":208,"children":210},{"className":209},[],[211],{"type":37,"value":212},"finding-disposition-v1",{"type":37,"value":214}," (the panel across scenarios), ",{"type":32,"tag":40,"props":216,"children":218},{"className":217},[],[219],{"type":37,"value":220},"sla-rubric-config-v1",{"type":37,"value":222}," (editable targets + live consequence panel), ",{"type":32,"tag":40,"props":224,"children":226},{"className":225},[],[227],{"type":37,"value":228},"findings-to-sla-v1",{"type":37,"value":230}," (interactive centerpiece with simulated clock).",{"type":32,"tag":97,"props":232,"children":233},{},[234,236,242],{"type":37,"value":235},"Out of scope: ticketing\u002Fon-call\u002Fremediation tooling beyond one-line seam stubs; reconciling ",{"type":32,"tag":40,"props":237,"children":239},{"className":238},[],[240],{"type":37,"value":241},"report-sla-v1",{"type":37,"value":243}," onto the derived world; cross-report entity resolution.",{"key":245,"title":246,"empty":19,"ast":247},"key-changes","Key Changes",{"type":29,"children":248},[249],{"type":32,"tag":93,"props":250,"children":251},{},[252,313,360,400,432,457,531,654,671,692,740,812,867,920,969,1082,1139,1170,1201,1257,1281,1388],{"type":32,"tag":97,"props":253,"children":254},{},[255,260,262,267,269,274,276,282,284,290,292,297,299,304,306,311],{"type":32,"tag":62,"props":256,"children":257},{},[258],{"type":37,"value":259},"Stage 1 — fixtures (2026-08-25):",{"type":37,"value":261}," ",{"type":32,"tag":40,"props":263,"children":265},{"className":264},[],[266],{"type":37,"value":107},{"type":37,"value":268}," — the rulings as code. ",{"type":32,"tag":40,"props":270,"children":272},{"className":271},[],[273],{"type":37,"value":115},{"type":37,"value":275}," (append-only, 9 verbs), ",{"type":32,"tag":40,"props":277,"children":279},{"className":278},[],[280],{"type":37,"value":281},"RubricTarget",{"type":37,"value":283}," with ",{"type":32,"tag":40,"props":285,"children":287},{"className":286},[],[288],{"type":37,"value":289},"days: number|null",{"type":37,"value":291}," (Mark M's 14\u002F30\u002F90\u002Fsoft), 19 findings as event logs (7 live c78 identities + 12 historical so quarters derive), pure ",{"type":32,"tag":40,"props":293,"children":295},{"className":294},[],[296],{"type":37,"value":123},{"type":37,"value":298}," (the state-machine fold: pause credit, mechanical expiry re-open, one due formula) and ",{"type":32,"tag":40,"props":300,"children":302},{"className":301},[],[303],{"type":37,"value":131},{"type":37,"value":305}," (open\u002Fbreaches\u002Fexcepted\u002Fignored, withinSlaPct with documented denominator, event-derived found\u002Fresolved\u002Fexcepted quarter rows, audit feed). Sanity-checked via tsx: 90% within-SLA (10 judged), F-0951 pause exemplar (79d paused → 16d clock, within 90), F-0918 late, +30d → F-1041 breaches and verdict drops to 82%, +60d → F-1022's lapsed exception mechanically re-opens. ",{"type":32,"tag":40,"props":307,"children":309},{"className":308},[],[310],{"type":37,"value":139},{"type":37,"value":312}," untouched.",{"type":32,"tag":97,"props":314,"children":315},{},[316,321,322,328,330,336,338,343,345,350,352,358],{"type":32,"tag":62,"props":317,"children":318},{},[319],{"type":37,"value":320},"Stage 2 — anatomy (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":323,"children":325},{"className":324},[],[326],{"type":37,"value":327},"\u002Fpages\u002Ffindings-lifecycle-v1",{"type":37,"value":329}," + ",{"type":32,"tag":40,"props":331,"children":333},{"className":332},[],[334],{"type":37,"value":335},"app\u002Fcomponents\u002Flifecycle\u002FAuditTrail.vue",{"type":37,"value":337}," (the persisted audit record rendered — verb-toned rows, reused by every later page), registered in the ",{"type":32,"tag":40,"props":339,"children":341},{"className":340},[],[342],{"type":37,"value":196},{"type":37,"value":344}," group. The contract page: state diagram (open + three terminals, return paths incl. mechanical expiry), 9-verb table with clock effects and seam markers, the one clock formula with six numbered rules, ",{"type":32,"tag":40,"props":346,"children":348},{"className":347},[],[349],{"type":37,"value":115},{"type":37,"value":351}," in a code block, and two worked examples computed live from ",{"type":32,"tag":40,"props":353,"children":355},{"className":354},[],[356],{"type":37,"value":357},"deriveFinding()",{"type":37,"value":359}," (F-1027 register case; F-0951 pause exemplar) — the on-page proof rulings and code agree. Smoke-checked 200, derived values (paused 79d \u002F clock 16d \u002F within SLA) confirmed in SSR output, clean log.",{"type":32,"tag":97,"props":361,"children":362},{},[363,368,369,375,376,382,384,390,392,398],{"type":32,"tag":62,"props":364,"children":365},{},[366],{"type":37,"value":367},"Stage 3 — disposition organ (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":370,"children":372},{"className":371},[],[373],{"type":37,"value":374},"app\u002Fcomponents\u002Flifecycle\u002FDispositionPanel.vue",{"type":37,"value":329},{"type":32,"tag":40,"props":377,"children":379},{"className":378},[],[380],{"type":37,"value":381},"\u002Fpages\u002Ffinding-disposition-v1",{"type":37,"value":383},", registered. The panel owns no state machine — renders a ",{"type":32,"tag":40,"props":385,"children":387},{"className":386},[],[388],{"type":37,"value":389},"DerivedFinding",{"type":37,"value":391},", emits ",{"type":32,"tag":40,"props":393,"children":395},{"className":394},[],[396],{"type":37,"value":397},"act",{"type":37,"value":399},"; the page appends and re-derives. Six scenarios on the house tab-picker (fresh \u002F acknowledged \u002F past-SLA \u002F near-expiry \u002F ignored \u002F escalated), each with its own live event log and reset. Verb availability by status; ignore\u002Freopen gate on reason, exception on reason + expiry (+30d default); escalate\u002Fenforce are one line + one stamped ref (\"would create tracker:SEC-… — finding stays open here · stub\"); resolve is the visually-apart green \"simulate: fix detected\" (evidence, not judgment). Smoke-checked 200 (needed the nuxt.config touch — new page files added under a running server, per the known gotcha).",{"type":32,"tag":97,"props":401,"children":402},{},[403,408,409,415,417,423,425,430],{"type":32,"tag":62,"props":404,"children":405},{},[406],{"type":37,"value":407},"Stage 4 — rubric config (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":410,"children":412},{"className":411},[],[413],{"type":37,"value":414},"\u002Fpages\u002Fsla-rubric-config-v1",{"type":37,"value":416},", registered. Editable per-severity targets seeded with Mark M's real program; \"hard target\" checkbox makes advisory (",{"type":32,"tag":40,"props":418,"children":420},{"className":419},[],[421],{"type":37,"value":422},"days: null",{"type":37,"value":424},") a first-class value; three program presets (Mark M 14\u002F30\u002F90\u002Fadv, superseded c78 placeholder, the 48h-criticals program from the call) demonstrate that the same findings get three different judgments. Live consequence panel re-judges the open world as you type (",{"type":32,"tag":40,"props":426,"children":428},{"className":427},[],[429],{"type":37,"value":131},{"type":37,"value":431}," takes the rubric as an argument — the page is the function). Clock policy rendered as fixed rulings with a link to the anatomy page — deliberately not knobs. New open thread recorded: rubric changes after a quarterly export rewrite submitted history → rubric versioning is a product need. Smoke-checked 200, default verdict (90% · 10 judged) in SSR output.",{"type":32,"tag":97,"props":433,"children":434},{},[435,440,441,447,449,455],{"type":32,"tag":62,"props":436,"children":437},{},[438],{"type":37,"value":439},"Stage 5 — centerpiece (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":442,"children":444},{"className":443},[],[445],{"type":37,"value":446},"\u002Fpages\u002Ffindings-to-sla-v1",{"type":37,"value":448},", registered — the c78 open-thread answer. Two columns: worklist (open nearest-due-first, accepted-risk, recently closed) with rows expanding into the shared DispositionPanel; SLA rail (within-SLA verdict numeral, open\u002Fbreach\u002Fexcepted counts, event-derived found\u002Fresolved\u002Fexcepted quarter table, live audit feed). Reset + advance-clock chips (+1d\u002F+7d\u002F+30d); rubric fixed to Mark M's program (the knob lives on the config page). Verified headlessly with Playwright: escalate stamps ",{"type":32,"tag":40,"props":450,"children":452},{"className":451},[],[453],{"type":37,"value":454},"tracker:SEC-1041",{"type":37,"value":456}," into the feed, exception pauses F-1041's clock, +60d drops the verdict 90%→82% and mechanically re-opens F-1022's lapsed exception with the queue line \"re-entered queue mechanically\", reset restores 90%, zero console\u002Fpage errors. All four c79 pages smoke-checked 200 together.",{"type":32,"tag":97,"props":458,"children":459},{},[460,465,467,473,475,481,483,489,491,497,499,505,507,513,515,521,523,529],{"type":32,"tag":62,"props":461,"children":462},{},[463],{"type":37,"value":464},"Thread — findings-regroup (2026-08-25):",{"type":37,"value":466}," revision of qdash ",{"type":32,"tag":40,"props":468,"children":470},{"className":469},[],[471],{"type":37,"value":472},"\u002Ffindings",{"type":37,"value":474}," at condition grain, from Mark's 200-disallowed-tool-calls question (prompt\u002Fplan in ",{"type":32,"tag":40,"props":476,"children":478},{"className":477},[],[479],{"type":37,"value":480},"findings-regroup-*.md",{"type":37,"value":482},"). Additive ",{"type":32,"tag":40,"props":484,"children":486},{"className":485},[],[487],{"type":37,"value":488},"occur",{"type":37,"value":490}," verb in ",{"type":32,"tag":40,"props":492,"children":494},{"className":493},[],[495],{"type":37,"value":496},"lifecycle-fixtures.ts",{"type":37,"value":498}," (count\u002FlastSeen fold; occur-after-terminal = mechanical reopen with ",{"type":32,"tag":40,"props":500,"children":502},{"className":501},[],[503],{"type":37,"value":504},"recurred",{"type":37,"value":506}," flag; c79 base world regression-checked unchanged at 90% · 10 judged). New ",{"type":32,"tag":40,"props":508,"children":510},{"className":509},[],[511],{"type":37,"value":512},"findings-page-fixtures.ts",{"type":37,"value":514},": qdash control catalog subset with per-control occurrence nouns (the fix for qdash c5's hardcoded-units thread), 9 conditions as event logs including the ×200 case (199 generated tool-call occurs + reclassify medium→high on magnitude) and a resolved egress condition primed for recurrence. New ",{"type":32,"tag":40,"props":516,"children":518},{"className":517},[],[519],{"type":37,"value":520},"\u002Fpages\u002Ffindings-regroup-v1",{"type":37,"value":522}," (registry group ",{"type":32,"tag":40,"props":524,"children":526},{"className":525},[],[527],{"type":37,"value":528},"security",{"type":37,"value":530},"): control sections → condition rows (severity · scope · ×N unit + lastSeen · agents · SLA clock) → expanded DispositionPanel + evidence list + occur-free audit record + \"simulate: new occurrence\". Playwright-verified: exception moves stats 5→4 open \u002F 1→2 excepted; simulated occurrence on the resolved condition re-opens it at 35d\u002F30d — instantly past SLA (open 4→5, past target 0→1, verdict 100%→0%); reset restores. All six related pages (c79 four + regroup + report-sla) smoke-checked 200.",{"type":32,"tag":97,"props":532,"children":533},{},[534,539,540,546,548,553,555,561,562,568,570,576,578,584,586,592,594,600,601,607,608,614,616,622,624,629,631,636,638,644,646,652],{"type":32,"tag":62,"props":535,"children":536},{},[537],{"type":37,"value":538},"Thread — findings-regroup v2, qdash-chassis rebuild (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":541,"children":543},{"className":542},[],[544],{"type":37,"value":545},"\u002Fpages\u002Ffindings-regroup-v2",{"type":37,"value":547},", registered — the condition-grain revision rebuilt 1:1 on the real ",{"type":32,"tag":40,"props":549,"children":551},{"className":550},[],[552],{"type":37,"value":472},{"type":37,"value":554}," components, all already in the layer: ",{"type":32,"tag":40,"props":556,"children":558},{"className":557},[],[559],{"type":37,"value":560},"UxTableList",{"type":37,"value":329},{"type":32,"tag":40,"props":563,"children":565},{"className":564},[],[566],{"type":37,"value":567},"Sorter",{"type":37,"value":569},"\u002F",{"type":32,"tag":40,"props":571,"children":573},{"className":572},[],[574],{"type":37,"value":575},"ColumnHeader",{"type":37,"value":577}," (working Policy-column search + group sorts), ",{"type":32,"tag":40,"props":579,"children":581},{"className":580},[],[582],{"type":37,"value":583},"UxTableListExpandRow",{"type":37,"value":585}," purple-ruled expansion, ",{"type":32,"tag":40,"props":587,"children":589},{"className":588},[],[590],{"type":37,"value":591},"SecurityPolicyRibbon",{"type":37,"value":593}," (hot\u002Fwarm\u002Ftepid), ",{"type":32,"tag":40,"props":595,"children":597},{"className":596},[],[598],{"type":37,"value":599},"ComplianceTag",{"type":37,"value":169},{"type":32,"tag":40,"props":602,"children":604},{"className":603},[],[605],{"type":37,"value":606},"AgentAvatar",{"type":37,"value":169},{"type":32,"tag":40,"props":609,"children":611},{"className":610},[],[612],{"type":37,"value":613},"_shadow-box",{"type":37,"value":615}," stat cards, filter-pill bar, ",{"type":32,"tag":40,"props":617,"children":619},{"className":618},[],[620],{"type":37,"value":621},"_darken-me",{"type":37,"value":623}," open-row brightening. Grain changes quoted against the original: members are conditions (scope + ×N unit + SLA clock + status) not signal rows; \"Manage\" → \"Disposition\" (the c79 verb panel + evidence + audit inset); group sub-line \"N conditions · N open · N past SLA\" replaces \"N violations\"; qdash's empty info stat card becomes ",{"type":32,"tag":62,"props":625,"children":626},{},[627],{"type":37,"value":628},"past SLA",{"type":37,"value":630},"; expansion meta gains ",{"type":32,"tag":62,"props":632,"children":633},{},[634],{"type":37,"value":635},"Nearest SLA",{"type":37,"value":637},". Same interactive world as v1 (shared fixtures, simulated clock). Playwright-verified through the real ExpandRow: expand → disposition → exception drops the high card 2→1, +60d puts 2 conditions past SLA, sorter works, reset restores, zero console errors. (Playwright gotcha logged: ",{"type":32,"tag":40,"props":639,"children":641},{"className":640},[],[642],{"type":37,"value":643},"getByRole",{"type":37,"value":645}," name-matches substrings by default — \"Disposition\" matched the \"Dispositioned\" filter pill; use ",{"type":32,"tag":40,"props":647,"children":649},{"className":648},[],[650],{"type":37,"value":651},"exact: true",{"type":37,"value":653},".)",{"type":32,"tag":97,"props":655,"children":656},{},[657,662,664,669],{"type":32,"tag":62,"props":658,"children":659},{},[660],{"type":37,"value":661},"Thread — findings-regroup: Conditions column + two-agent case (2026-08-25):",{"type":37,"value":663}," from Mark's \"two unapproved tool uses by different agents\" question. New fixture C-2010 (Codex · ravi, ×14 tool calls, own detect\u002Fclock) — same rule as C-2001, different agent = a second condition under one control; both avatars on the group row, separate clocks and dispositions in the expansion. v2 gains a sortable ",{"type":32,"tag":62,"props":665,"children":666},{},[667],{"type":37,"value":668},"Conditions",{"type":37,"value":670}," column (big-numeral, \"N open · N past SLA\" breakdown beneath, paired beside Total Occurrences — sorting by conditions ranks workload, by occurrences ranks noise); the old \"N violations\" sub-line removed so the count lives in one place (policy cell now shows the control category). Ruled in notes: scope choice stays per-rule — fleet-level remediation (qdash's egress) would legitimately collapse agents into one condition. Playwright-verified: approval row reads 2 \u002F 214 tool calls with both avatars, Conditions sort puts it first, both members (×200 high, ×14 medium) expand with independent clocks; zero console errors.",{"type":32,"tag":97,"props":672,"children":673},{},[674,679,681,690],{"type":32,"tag":62,"props":675,"children":676},{},[677],{"type":37,"value":678},"Thread — findings-regroup: occurrences leave the summary; findings become a table (2026-08-25):",{"type":37,"value":680}," Mark's hierarchy call — occurrences are a sub-item of a finding, so the Total Occurrences column left the summary table (a 200+14 sum across agents is semantically weak; the control-level noise sort is an accepted loss). Rollup moved to the expansion's Findings header (\"· ×214 tool calls\"); the ×N stays on each finding row. Then the findings section converted from flex rows to ",{"type":32,"tag":62,"props":682,"children":683},{},[684],{"type":32,"tag":40,"props":685,"children":687},{"className":686},[],[688],{"type":37,"value":689},"UxTable variant=\"band\"",{"type":37,"value":691}," — columns Severity · Finding (scope + reason\u002Ftitle sub-line) · Occurrences · Last Seen · Agent · SLA · Adjudicate, with the adjudication panel opening as a full-width colspan row. Verified in browser: band header renders, ×200 row reads columnar, colspan inset opens, acknowledge stamps the audit; zero console errors.",{"type":32,"tag":97,"props":693,"children":694},{},[695,700,702,708,710,716,718,724,726,731,733,738],{"type":32,"tag":62,"props":696,"children":697},{},[698],{"type":37,"value":699},"Thread — findings-regroup: two-section expansion + terminology (2026-08-25):",{"type":37,"value":701}," v2's group expansion split into two stacked ",{"type":32,"tag":40,"props":703,"children":705},{"className":704},[],[706],{"type":37,"value":707},"UxTableListExpandSection",{"type":37,"value":709}," cards via ExpandRow ",{"type":32,"tag":40,"props":711,"children":713},{"className":712},[],[714],{"type":37,"value":715},"bare",{"type":37,"value":717}," (the inventory-agent-expand-v2 pattern, well tint between): section 1 = the ",{"type":32,"tag":719,"props":720,"children":721},"em",{},[722],{"type":37,"value":723},"policy",{"type":37,"value":725}," (ribbon, name, remediation, meta incl. Nearest SLA; close-X wired), section 2 = the ",{"type":32,"tag":719,"props":727,"children":728},{},[729],{"type":37,"value":730},"findings",{"type":37,"value":732}," (its own \"Findings : N · open · past SLA\" header + the worklist) — context and work stop sharing one card. Terminology ruling applied (see Decisions): \"condition\" → ",{"type":32,"tag":62,"props":734,"children":735},{},[736],{"type":37,"value":737},"finding",{"type":37,"value":739}," across both regroup pages' UI copy, column header now \"Findings\", ladder stated as Control → Finding → Occurrence. Both pages 200, sections + disposition verified in browser, zero console errors.",{"type":32,"tag":97,"props":741,"children":742},{},[743,748,750,756,758,763,765,771,773,779,781,786,788,794,796,802,804,810],{"type":32,"tag":62,"props":744,"children":745},{},[746],{"type":37,"value":747},"Thread — SecuritySeverityTag (2026-08-25):",{"type":37,"value":749}," new layer component ",{"type":32,"tag":40,"props":751,"children":753},{"className":752},[],[754],{"type":37,"value":755},"security\u002FSeverityTag.vue",{"type":37,"value":757}," — severity pill on the ComplianceTag chassis, no icon. ",{"type":32,"tag":62,"props":759,"children":760},{},[761],{"type":37,"value":762},"Rules the layer's severity-ladder split",{"type":37,"value":764}," (SecuritySeverity had high on warning; qdash findings had high on error): critical = the only solid error fill (rank by intensity, not a fifth hue) · high = error outline · medium = warning outline · low = muted grey (ComplianceTag's ",{"type":32,"tag":40,"props":766,"children":768},{"className":767},[],[769],{"type":37,"value":770},"gap",{"type":37,"value":772}," register). ",{"type":32,"tag":40,"props":774,"children":776},{"className":775},[],[777],{"type":37,"value":778},"ink",{"type":37,"value":780}," prop = the open-row ",{"type":32,"tag":40,"props":782,"children":784},{"className":783},[],[785],{"type":37,"value":621},{"type":37,"value":787}," register (content-token border\u002Ftext + 10% content fill — theme-safe, flips in dark mode), driven from ExpandRow's ",{"type":32,"tag":40,"props":789,"children":791},{"className":790},[],[792],{"type":37,"value":793},"@detailsOpen\u002F@detailsClose",{"type":37,"value":795},". Documented per house rule: registry entry + ",{"type":32,"tag":40,"props":797,"children":799},{"className":798},[],[800],{"type":37,"value":801},"_demos\u002FSecuritySeverityTag.vue",{"type":37,"value":803}," (full adminProps, ladder both sizes, slot override, overflow, ink-on-tint, in-context finding row). Swapped into findings-regroup-v2 (group rows with ink-on-open, inner table, expansion meta) and the shared DispositionPanel. Dev server now runs ",{"type":32,"tag":40,"props":805,"children":807},{"className":806},[],[808],{"type":37,"value":809},"NUXT_LOCAL_LAYER=1",{"type":37,"value":811}," (moved to port 3000); layer release needed before CI\u002Fprod consumes the component. Ink flip verified in browser: error\u002F60 border → content ink on open → reverts on close.",{"type":32,"tag":97,"props":813,"children":814},{},[815,820,821,827,829,835,837,842,844,850,852,858,860,865],{"type":32,"tag":62,"props":816,"children":817},{},[818],{"type":37,"value":819},"Thread — finding-detail (2026-08-25):",{"type":37,"value":261},{"type":32,"tag":40,"props":822,"children":824},{"className":823},[],[825],{"type":37,"value":826},"\u002Fpages\u002Ffinding-detail-v1",{"type":37,"value":828}," (+ registry, ",{"type":32,"tag":40,"props":830,"children":832},{"className":831},[],[833],{"type":37,"value":834},"?id=",{"type":37,"value":836}," picks the finding, default the ×200 case) — the \"view all\" drill and demoted-flat-view home. Identity header (SeverityTag + ",{"type":32,"tag":62,"props":838,"children":839},{},[840],{"type":37,"value":841},"displayed-status chip",{"type":37,"value":843}," + remediation clock + qdash-italic meta), adjudication panel, the full occurrence stream as a house table (Time · citable ID · Agent · Action chip · Detail(stretch) · Session) with text filter and simulate button, occur-free audit record. Fixture support (additive): ",{"type":32,"tag":40,"props":845,"children":847},{"className":846},[],[848],{"type":37,"value":849},"action",{"type":37,"value":851}," on occur events (observed\u002Fheld\u002Fblocked), ",{"type":32,"tag":40,"props":853,"children":855},{"className":854},[],[856],{"type":37,"value":857},"displayStatus",{"type":37,"value":859}," ladder in ",{"type":32,"tag":40,"props":861,"children":863},{"className":862},[],[864],{"type":37,"value":123},{"type":37,"value":866}," — c79 base world regression-clean (90% · 10). Worklist evidence headers now read \"last 5 of 200 · view all →\" linking through. Verified in browser: chip flips acknowledged → risk accepted on adjudication, deep link lands with the right id, 200 rows render, zero console errors.",{"type":32,"tag":97,"props":868,"children":869},{},[870,875,877,882,884,890,892,897,899,904,906,911,913,918],{"type":32,"tag":62,"props":871,"children":872},{},[873],{"type":37,"value":874},"Thread — adjudication card, Mark's design (2026-08-25):",{"type":37,"value":876}," built from Mark's manual mock. Layer: ",{"type":32,"tag":40,"props":878,"children":880},{"className":879},[],[881],{"type":37,"value":707},{"type":37,"value":883}," gains ",{"type":32,"tag":40,"props":885,"children":887},{"className":886},[],[888],{"type":37,"value":889},"theme=\"grape\"",{"type":37,"value":891}," — the CHILD register (grape-50 fill, grape-150 border, no shadow; dark grape-850\u002F30) for a card that belongs to a row of the section above; registry entry updated. v2: each finding row in the inner findings table is now itself a ",{"type":32,"tag":40,"props":893,"children":895},{"className":894},[],[896],{"type":37,"value":583},{"type":37,"value":898}," — whole-row click AND the Adjudicate button (handler-less, bubbles to the row) open the grape adjudication card as the row's own expansion. Card per the design: severity pill + 22px title · meta band (Agent avatar \u002F Machine·User from new seed fields \u002F ",{"type":32,"tag":62,"props":900,"children":901},{},[902],{"type":37,"value":903},"Remediation Clock as a progress bar",{"type":37,"value":905}," — content fill on grape-150 track, error fill on breach) · ",{"type":32,"tag":62,"props":907,"children":908},{},[909],{"type":37,"value":910},"Ignore + Accept Risk",{"type":37,"value":912}," as the only verb buttons (axis 1, capture-gated — the accept-risk label applied) · Evidence and Audit Record as two bold-header columns with 3px rules · ",{"type":32,"tag":62,"props":914,"children":915},{},[916],{"type":37,"value":917},"handling as the Status dropdown",{"type":37,"value":919}," (UxSimpleSelect: Acknowledged\u002FEscalated\u002FEnforced — axis 2 as a status control, exactly the axis alignment ruling; selecting appends the clock-neutral event with its ref). DispositionPanel no longer used on v2 (remains the organ on the other three pages — convergence is an open thread). Verified: row click toggles, button opens, select\u002Fcapture don't close the row, audit updates live, zero console errors.",{"type":32,"tag":97,"props":921,"children":922},{},[923,928,930,946,948,953,954,960,962,967],{"type":32,"tag":62,"props":924,"children":925},{},[926],{"type":37,"value":927},"Thread — quiet expand register (2026-08-25):",{"type":37,"value":929}," Mark's ruling: the row and its parent row stay white; only the grape card is tinted. Evaluated (CSS override spike vs prop vs style-props vs new component) and ruled: ",{"type":32,"tag":62,"props":931,"children":932},{},[933,939,941],{"type":32,"tag":40,"props":934,"children":936},{"className":935},[],[937],{"type":37,"value":938},"quiet",{"type":37,"value":940}," boolean prop on ",{"type":32,"tag":40,"props":942,"children":944},{"className":943},[],[945],{"type":37,"value":583},{"type":37,"value":947}," — open row and details well stay surface, no purple rules\u002Ftint\u002Fbordered well\u002Fflash; everything else unchanged; default false so existing consumers untouched. ",{"type":32,"tag":40,"props":949,"children":951},{"className":950},[],[952],{"type":37,"value":938},{"type":37,"value":329},{"type":32,"tag":40,"props":955,"children":957},{"className":956},[],[958],{"type":37,"value":959},"ExpandSection theme=\"grape\"",{"type":37,"value":961}," together form the ",{"type":32,"tag":62,"props":963,"children":964},{},[965],{"type":37,"value":966},"child-register vocabulary",{"type":37,"value":968},": quiet row + grape card = \"this content belongs to the row above.\" Applied and then refined per Mark: the OUTER control rows keep the loud register (qdash's own open treatment — purple rules + grape tint); only the nested finding rows are quiet, with the grape card as their tinted surface. CSS spike reverted; registry updated. Measured: outer open row grape\u002F10 tint with its 2 purple rules, inner open row rgb(255,255,255), card exactly grape-50 (#F9F7FF).",{"type":32,"tag":97,"props":970,"children":971},{},[972,977,978,984,986,991,993,998,1000,1005,1007,1012,1014,1019,1021,1027,1028,1034,1035,1041,1042,1048,1050,1055,1057,1062,1063,1068,1069,1074,1075,1080],{"type":32,"tag":62,"props":973,"children":974},{},[975],{"type":37,"value":976},"Thread — status-column bake-off (2026-08-26):",{"type":37,"value":261},{"type":32,"tag":40,"props":979,"children":981},{"className":980},[],[982],{"type":37,"value":983},"\u002Fpages\u002Ffindings-status-column-v1",{"type":37,"value":985},", registered — from Mark's ask for a clearly visible (possibly dropdown) status in the findings worklist. Four treatments of the same world, each with its own event-log clone: ",{"type":32,"tag":62,"props":987,"children":988},{},[989],{"type":37,"value":990},"A",{"type":37,"value":992}," static chip · ",{"type":32,"tag":62,"props":994,"children":995},{},[996],{"type":37,"value":997},"B",{"type":37,"value":999}," dropdown-everywhere (the honest failure on display — half the menu permanently grey, since adjudication values need reasons and resolved is the system's) · ",{"type":32,"tag":62,"props":1001,"children":1002},{},[1003],{"type":37,"value":1004},"C",{"type":37,"value":1006}," hybrid (handling dropdown while open, chip when terminal — recommended) · ",{"type":32,"tag":62,"props":1008,"children":1009},{},[1010],{"type":37,"value":1011},"C2",{"type":37,"value":1013}," hybrid quiet-until-hover. All four share the slimmed ",{"type":32,"tag":62,"props":1015,"children":1016},{},[1017],{"type":37,"value":1018},"pure-clock SLA column",{"type":37,"value":1020}," (",{"type":32,"tag":40,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":37,"value":1026},"11d\u002F30d · due 09-04",{"type":37,"value":125},{"type":32,"tag":40,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":37,"value":1033},"paused · exp",{"type":37,"value":125},{"type":32,"tag":40,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":37,"value":1040},"in 2d",{"type":37,"value":125},{"type":32,"tag":40,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":37,"value":1047},"—",{"type":37,"value":1049},") so the status word lives in one column and the treatment is the only variable. Unacknowledged wears warning tone throughout. The axis rule decides selectability: clock-neutral handling verbs are one-click safe; adjudication stays behind the card. Verified: 4 live tables, isolated worlds, C's select acts, C2's quiet border transparent, zero console errors. ",{"type":32,"tag":62,"props":1051,"children":1052},{},[1053],{"type":37,"value":1054},"Verdict (Mark, 2026-08-26): C — status as a dropdown.",{"type":37,"value":1056}," Graduated into findings-regroup-v2: 8-column inner table (Status between Agent and SLA — handling dropdown while open with click.stop so it doesn't toggle the expand row, terminal chip otherwise), SLA slimmed to pure clock (",{"type":32,"tag":40,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":37,"value":1026},{"type":37,"value":125},{"type":32,"tag":40,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":37,"value":1033},{"type":37,"value":125},{"type":32,"tag":40,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":37,"value":1040},{"type":37,"value":125},{"type":32,"tag":40,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":37,"value":1047},{"type":37,"value":1081},"). Verified in browser: row-level escalate via the dropdown without expanding the row.",{"type":32,"tag":97,"props":1083,"children":1084},{},[1085,1090,1092,1098,1100,1106,1108,1114,1116,1122,1124,1129,1131,1137],{"type":32,"tag":62,"props":1086,"children":1087},{},[1088],{"type":37,"value":1089},"Thread — StretchBox measurement bug (2026-08-26):",{"type":37,"value":1091}," Mark spotted the top expand row animating open ~an inch short, then snapping after a beat. Root cause found by instrumented measurement: ",{"type":32,"tag":40,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":37,"value":1097},"UxStretchBox",{"type":37,"value":1099}," measures a ",{"type":32,"tag":40,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":37,"value":1105},"cloneNode",{"type":37,"value":1107}," appended to ",{"type":32,"tag":40,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":37,"value":1113},"document.body",{"type":37,"value":1115}," (absolute, off-screen), where the clone lays out at body width (1440px) instead of the well's real width (1310px) — text wraps differently, so the clone measured 405px vs the real 464px; the box animates to the short height (300ms) and sits clipped until the ",{"type":32,"tag":40,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":37,"value":1121},"height:initial",{"type":37,"value":1123}," override lands (~1200ms) and snaps. Only the first row showed it because only the approval card's content is width-sensitive (wrapping remediation line + full meta cluster). ",{"type":32,"tag":62,"props":1125,"children":1126},{},[1127],{"type":37,"value":1128},"Layer fix:",{"type":37,"value":1130}," when ",{"type":32,"tag":40,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":37,"value":1136},"stretchWidth",{"type":37,"value":1138}," is false (width externally determined — the ExpandRow case), the clone is pinned to the live content width before measuring; width-stretching consumers unchanged. Verified: mid-animation height now exactly matches content (464\u002F464), no snap.",{"type":32,"tag":97,"props":1140,"children":1141},{},[1142,1147,1148,1154,1156,1161,1163,1168],{"type":32,"tag":62,"props":1143,"children":1144},{},[1145],{"type":37,"value":1146},"Thread — topline bake-off (2026-08-26):",{"type":37,"value":261},{"type":32,"tag":40,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":37,"value":1153},"\u002Fpages\u002Ffindings-topline-v1",{"type":37,"value":1155},", registered — from Mark's read that the severity 4-up misses the opportunity (his seeds: handling-state counts, clocks running low). Analysis ranked the topline's job as triage: unseen (unack + oldest age — the adjudication-lag signal's only home) · about-to-breach (early warning beats breach count, per c78's card audit) · already late · severity mix (context) · throughput + within-SLA % (report tie) · expiring exceptions · worst control. Eight live-derived treatments: extended cards · handling funnel · ",{"type":32,"tag":62,"props":1157,"children":1158},{},[1159],{"type":37,"value":1160},"remediation runway",{"type":37,"value":1162}," (findings as ticks on a 45d axis — time as position) · two-axis grid · verdict + worst lines (c78 idiom) · ",{"type":32,"tag":62,"props":1164,"children":1165},{},[1166],{"type":37,"value":1167},"Your move",{"type":37,"value":1169}," (three action cards each naming their top item; severity demoted to a footer line) · scoreboard (throughput debt + worst control) · compact strip. Provisional verdict: 6 (Your move) — every element an action with a name; 8 as the minimal alternative; 3's runway the idea worth stealing into any winner. Verified: 8 sections, 6 runway ticks, your-move names the oldest unack (2d · Codex · ravi), zero console errors. Mark's pick pending.",{"type":32,"tag":97,"props":1171,"children":1172},{},[1173,1178,1179,1185,1187,1192,1194,1199],{"type":32,"tag":62,"props":1174,"children":1175},{},[1176],{"type":37,"value":1177},"Thread — topline bake-off, iteration 2 (2026-08-26):",{"type":37,"value":261},{"type":32,"tag":40,"props":1180,"children":1182},{"className":1181},[],[1183],{"type":37,"value":1184},"\u002Fpages\u002Ffindings-topline-v2",{"type":37,"value":1186}," — Mark's critique of v1: anemic, wants meaning at a glance, punchy and clear. Iteration rule applied: ",{"type":32,"tag":62,"props":1188,"children":1189},{},[1190],{"type":37,"value":1191},"every element is a claim",{"type":37,"value":1193}," — labels are sentences, top items are named, consequences stated (\"returns to the queue Sep 15\"), and zeros speak (\"Nothing is past SLA\" beats a mute 0). Six treatments (briefing lines · your-move-spoken cards · annotated runway with named tick list · claim cards · the paragraph · worded strip) + a ",{"type":32,"tag":62,"props":1195,"children":1196},{},[1197],{"type":37,"value":1198},"today\u002F+30d stress toggle",{"type":37,"value":1200}," — a topline must communicate on both kinds of day (stressed world crosses sofia's deadline and surfaces marcus's lapsed exception automatically). Within-SLA % dropped from the topline: at 1-judged it's a dishonest hero number; it belongs on the report. v1's explainer variants (funnel, grid) dropped — they taught the model without triaging the day. Provisional read: 2 (your-move-spoken); 1 if vertical space is cheap; 3's named runway list under either. Verified in both worlds, zero console errors.",{"type":32,"tag":97,"props":1202,"children":1203},{},[1204,1209,1211,1217,1218,1224,1226,1232,1234,1240,1242,1248,1250,1255],{"type":32,"tag":62,"props":1205,"children":1206},{},[1207],{"type":37,"value":1208},"Thread — AgentPill + finding-first column (2026-08-26):",{"type":37,"value":1210}," from Mark's design pair (inline and stacked pill mocks). New layer component ",{"type":32,"tag":40,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":37,"value":1216},"agent\u002FPill.vue",{"type":37,"value":1020},{"type":32,"tag":40,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":37,"value":1223},"AgentPill",{"type":37,"value":1225},"): pixel-pawn face in its own bordered cell + name \u002F user in grape; ",{"type":32,"tag":40,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":37,"value":1231},"stacked",{"type":37,"value":1233}," for the two-line layout; art via ",{"type":32,"tag":40,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":37,"value":1239},"\u003Cimg>",{"type":37,"value":1241}," per the pawn rule. Documented (registry + full demo). In findings-regroup-v2: the Finding column drops the redundant ",{"type":32,"tag":40,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":37,"value":1247},"agent: Claude Code · sofia",{"type":37,"value":1249}," scope line — the ",{"type":32,"tag":62,"props":1251,"children":1252},{},[1253],{"type":37,"value":1254},"finding title leads",{"type":37,"value":1256}," in the primary style, reason as the sub-line — and the Agent column's text chip becomes the AgentPill. Identity now lives in exactly one column, as a face. Verified: pill renders \"Claude Code \u002F sofia\" with the pawn loaded, no scope prefixes remain, zero console errors.",{"type":32,"tag":97,"props":1258,"children":1259},{},[1260,1265,1267,1272,1274,1279],{"type":32,"tag":62,"props":1261,"children":1262},{},[1263],{"type":37,"value":1264},"Thread — policy header rework (2026-08-26, Mark's design):",{"type":37,"value":1266}," section 1 of the group expansion rebuilt: identity left (ribbon · 24px name · remediation as plain grey sub-text), ",{"type":32,"tag":62,"props":1268,"children":1269},{},[1270],{"type":37,"value":1271},"Findings severity box",{"type":37,"value":1273}," (big toned numerals in a bordered cell strip, only non-zero severities render), and ",{"type":32,"tag":62,"props":1275,"children":1276},{},[1277],{"type":37,"value":1278},"Upcoming Remediation Deadlines",{"type":37,"value":1280}," (soonest three open findings: bold day + month · \"N days from now\" toned by nearness — error ≤7d or overdue, warning ≤30d — · \"view\" linking to the finding's detail page). The old meta cluster (Policy: label, first\u002Flast seen, nearest-SLA, framework tag stack) removed — frameworks live on the collapsed row, recency on the finding rows. Verified calm (1 High 1 Med · 18\u002F87 days out) and stressed (+30d flips to \"days overdue\" in error ink), zero console errors.",{"type":32,"tag":97,"props":1282,"children":1283},{},[1284,1289,1291,1296,1298,1304,1306,1312,1314,1319,1321,1327,1329,1335,1337,1342,1344,1349,1351,1356,1358,1363,1365,1371,1373,1378,1380,1386],{"type":32,"tag":62,"props":1285,"children":1286},{},[1287],{"type":37,"value":1288},"Thread — worklist polish sweep (2026-08-26):",{"type":37,"value":1290}," batch of Mark-directed refinements on findings-regroup-v2. ",{"type":32,"tag":62,"props":1292,"children":1293},{},[1294],{"type":37,"value":1295},"AgentPill hardening:",{"type":37,"value":1297}," tighter padding + dot separator; then two real clipping bugs fixed in the layer — ",{"type":32,"tag":40,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":37,"value":1303},"shrink-0",{"type":37,"value":1305}," (overflow-hidden zeroes a flex item's automatic min-width) and ",{"type":32,"tag":40,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":37,"value":1311},"w-max",{"type":37,"value":1313}," (inline-flex width:auto is shrink-to-fit, so starved table cells compressed the pill) — a chip never compresses. ",{"type":32,"tag":62,"props":1315,"children":1316},{},[1317],{"type":37,"value":1318},"Column mechanics ruled:",{"type":37,"value":1320}," in table auto-layout, no-slack + inline pills + wrap-on-squeeze can't all hold; chose no-slack + inline via ",{"type":32,"tag":40,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":37,"value":1326},"w-max flex-nowrap",{"type":37,"value":1328}," containers with the Policy column as the ",{"type":32,"tag":40,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":37,"value":1334},"width:100%",{"type":37,"value":1336}," stretcher and 3-visible + \"+N\" caps on agents and frameworks (approval seeded with 5 frameworks to prove the cap). AgentPill adopted in the outer Agents column too (person when one finding, ×N when several). ",{"type":32,"tag":62,"props":1338,"children":1339},{},[1340],{"type":37,"value":1341},"Findings column",{"type":37,"value":1343}," now the severity-box pattern at row scale (toned per-severity numerals, divider cells, past-SLA fragment only when present), placed right of Policy + Conditions after trying left; clean groups render a ",{"type":32,"tag":62,"props":1345,"children":1346},{},[1347],{"type":37,"value":1348},"green 0 · Open",{"type":37,"value":1350}," — zeros follow the pattern. ",{"type":32,"tag":62,"props":1352,"children":1353},{},[1354],{"type":37,"value":1355},"Deadline \"view\" opens the finding's row below",{"type":37,"value":1357}," via the ExpandRow open() ref pattern instead of navigating away. ",{"type":32,"tag":62,"props":1359,"children":1360},{},[1361],{"type":37,"value":1362},"Adjudicate ↔ Close",{"type":37,"value":1364}," label flips CSS-driven off ",{"type":32,"tag":40,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":37,"value":1370},"_open-row",{"type":37,"value":1372},", like the chevron. ",{"type":32,"tag":62,"props":1374,"children":1375},{},[1376],{"type":37,"value":1377},"Fonts:",{"type":37,"value":1379}," font-black was silently clamping to 700 (Google Fonts URL carried only 400–700); fixed, then Inter moved to its official home (",{"type":32,"tag":40,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":37,"value":1385},"rsms.me\u002Finter\u002Finter.css",{"type":37,"value":1387},") — all weights + variable font; severity-box numerals font-black at both scales, Inter not mono. Every change browser-verified; gotchas saved to memory.",{"type":32,"tag":97,"props":1389,"children":1390},{},[1391,1396,1398,1403,1405,1411,1413,1418,1420,1425,1427,1433,1435,1441,1443,1449,1451,1469,1471,1477,1478,1484,1486,1492,1494,1500],{"type":32,"tag":62,"props":1392,"children":1393},{},[1394],{"type":37,"value":1395},"Thread — the qdash port (2026-08-27):",{"type":37,"value":1397}," findings-regroup-v2 shipped into the live product — qcontrol's qdash ",{"type":32,"tag":40,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":37,"value":472},{"type":37,"value":1404}," rewritten in place on ",{"type":32,"tag":40,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":37,"value":1410},"feat\u002FSLA-findings",{"type":37,"value":1412}," (qdash cycle ",{"type":32,"tag":62,"props":1414,"children":1415},{},[1416],{"type":37,"value":1417},"c14.finding-lifecycle-port",{"type":37,"value":1419},"). Layer released as ",{"type":32,"tag":62,"props":1421,"children":1422},{},[1423],{"type":37,"value":1424},"v0.9.11",{"type":37,"value":1426}," to carry AgentPill, SecuritySeverityTag, and the grape\u002Fquiet ExpandSection registers; all five consumer lockfiles refreshed. The two-axis model derives from the backend's single workflow row (",{"type":32,"tag":40,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":37,"value":1432},"lib\u002Ffindings-status.ts",{"type":37,"value":1434},", id-and-label-tolerant); SLA is the Mark M rubric client-side (",{"type":32,"tag":40,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":37,"value":1440},"lib\u002Ffindings-sla.ts",{"type":37,"value":1442},") until the backend writes ",{"type":32,"tag":40,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":37,"value":1448},"sla_due",{"type":37,"value":1450},"; the adjudication card became the ",{"type":32,"tag":62,"props":1452,"children":1453},{},[1454,1456,1462,1463],{"type":37,"value":1455},"first frontend consumer of ",{"type":32,"tag":40,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":37,"value":1461},"\u002Fapi\u002Ffinding-decision",{"type":37,"value":125},{"type":32,"tag":40,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":37,"value":1468},"\u002Fapi\u002Ffinding-state",{"type":37,"value":1470}," (Ignore rides finding-state as a ",{"type":32,"tag":40,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":37,"value":1476},"resolved",{"type":37,"value":329},{"type":32,"tag":40,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":37,"value":1483},"ignore",{"type":37,"value":1485}," sentinel — no registry id yet). Honest degradations, each wearing a ProjMark: Evidence = first\u002Flast seen only, Audit = latest state only (no occurrence event log server-side). Divergence accepted for now: the backend's block decisions Resolve, so enforce renders terminal — c79's clock-neutral enforcement is a recorded backend follow-up. Simulated clock, composition notes, and fixtures stayed here; port verified on real seed data (screenshots in ",{"type":32,"tag":40,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":37,"value":1491},"public\u002Fcycles\u002Fc79\u002Fc79-qdash-port-*.png",{"type":37,"value":1493},"), 37 lib tests, published-layer build clean. Full plan: ",{"type":32,"tag":40,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":37,"value":1499},"qcontrol-port-plan.md",{"type":37,"value":177},{"key":1502,"title":1503,"empty":19,"ast":1504},"outcome","Outcome",{"type":29,"children":1505},[1506],{"type":32,"tag":33,"props":1507,"children":1508},{},[1509],{"type":32,"tag":719,"props":1510,"children":1511},{},[1512],{"type":37,"value":1513},"(pending)",{"key":1515,"title":1516,"empty":19,"ast":1517},"extra","Decisions",{"type":29,"children":1518},[1519],{"type":32,"tag":93,"props":1520,"children":1521},{},[1522,1568,1578,1588,1606,1621,1638,1648,1664,1680,1698,1708,1718,1728,1746,1784,1809,1819,1837,1855,1865,1875,1901,1911,1921],{"type":32,"tag":97,"props":1523,"children":1524},{},[1525,1530,1532,1538,1539,1544,1545,1551,1552,1558,1560,1566],{"type":32,"tag":62,"props":1526,"children":1527},{},[1528],{"type":37,"value":1529},"States are derived, never stored",{"type":37,"value":1531}," — status is a pure fold over the ordered event log: ",{"type":32,"tag":40,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":37,"value":1537},"open",{"type":37,"value":125},{"type":32,"tag":40,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":37,"value":1476},{"type":37,"value":125},{"type":32,"tag":40,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":37,"value":1550},"accepted-risk",{"type":37,"value":125},{"type":32,"tag":40,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":37,"value":1557},"ignored",{"type":37,"value":1559},", plus an ",{"type":32,"tag":40,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":37,"value":1565},"acknowledged",{"type":37,"value":1567}," flag on open.",{"type":32,"tag":97,"props":1569,"children":1570},{},[1571,1576],{"type":32,"tag":62,"props":1572,"children":1573},{},[1574],{"type":37,"value":1575},"Acknowledge does nothing to SLA math",{"type":37,"value":1577}," — purely evidentiary (who saw it, when).",{"type":32,"tag":97,"props":1579,"children":1580},{},[1581,1586],{"type":32,"tag":62,"props":1582,"children":1583},{},[1584],{"type":37,"value":1585},"Ignore ≠ exception",{"type":37,"value":1587}," — ignore = \"not a real finding\" (no expiry, exits SLA denominator, audit persists); exception = \"real risk, formally accepted\" (mandatory expiry, clock paused, stays in the \"not resolved — here's why\" bucket).",{"type":32,"tag":97,"props":1589,"children":1590},{},[1591,1596,1598,1604],{"type":32,"tag":62,"props":1592,"children":1593},{},[1594],{"type":37,"value":1595},"Escalate and enforce are events, not states",{"type":37,"value":1597}," — the finding stays open and the clock keeps running; routing work elsewhere never stops SLA exposure. Seams stay one inline line + one ",{"type":32,"tag":40,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":37,"value":1603},"ref",{"type":37,"value":1605},"-stamped event.",{"type":32,"tag":97,"props":1607,"children":1608},{},[1609,1614,1616],{"type":32,"tag":62,"props":1610,"children":1611},{},[1612],{"type":37,"value":1613},"Resolve is a system verb, not one of Mark M's five",{"type":37,"value":1615}," — dispositions are human judgment, resolution is evidence (a re-scan clears the condition). ",{"type":32,"tag":719,"props":1617,"children":1618},{},[1619],{"type":37,"value":1620},"(product-semantics claim — surface for Mark's confirmation)",{"type":32,"tag":97,"props":1622,"children":1623},{},[1624,1629,1630,1636],{"type":32,"tag":62,"props":1625,"children":1626},{},[1627],{"type":37,"value":1628},"One clock formula",{"type":37,"value":161},{"type":32,"tag":40,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":37,"value":1635},"dueTs = detectTs + targetDays + pausedDays",{"type":37,"value":1637},"; covers exception pause, expiry re-open, and reclassify re-baseline.",{"type":32,"tag":97,"props":1639,"children":1640},{},[1641,1646],{"type":32,"tag":62,"props":1642,"children":1643},{},[1644],{"type":37,"value":1645},"Quarter rollups show found \u002F resolved \u002F excepted",{"type":37,"value":1647}," — accepted-risk never counts as resolved.",{"type":32,"tag":97,"props":1649,"children":1650},{},[1651,1662],{"type":32,"tag":62,"props":1652,"children":1653},{},[1654,1656],{"type":37,"value":1655},"Simulated clock, never ",{"type":32,"tag":40,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":37,"value":1661},"Date.now()",{"type":37,"value":1663}," — deterministic ages, SSR-safe; advance-clock chips give back what a live clock would show.",{"type":32,"tag":97,"props":1665,"children":1666},{},[1667,1672,1673,1678],{"type":32,"tag":62,"props":1668,"children":1669},{},[1670],{"type":37,"value":1671},"Rubric: low severity has no hard target",{"type":37,"value":1020},{"type":32,"tag":40,"props":1674,"children":1676},{"className":1675},[],[1677],{"type":37,"value":422},{"type":37,"value":1679},", renders \"advisory\") — per Mark M's actual program; c78's 7\u002F30\u002F90\u002F180 placeholder noted as superseded, but its module left untouched.",{"type":32,"tag":97,"props":1681,"children":1682},{},[1683,1688,1690,1696],{"type":32,"tag":62,"props":1684,"children":1685},{},[1686],{"type":37,"value":1687},"Three grains",{"type":37,"value":1689}," (findings-regroup thread): control = section\u002Fcontext · condition = the remediable thing (qdash's ",{"type":32,"tag":40,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":37,"value":1695},"finding_key = v2:{control}:{scope_kind}:{scope_id}",{"type":37,"value":1697}," is already the fingerprint) — owns status, SLA clock, reasons · occurrence = evidence (count, lastSeen, detail), never its own clock.",{"type":32,"tag":97,"props":1699,"children":1700},{},[1701,1706],{"type":32,"tag":62,"props":1702,"children":1703},{},[1704],{"type":37,"value":1705},"Occurrences never reset the clock",{"type":37,"value":1707}," — first occurrence = detect (the exposure anchor); repeats increment count\u002FlastSeen.",{"type":32,"tag":97,"props":1709,"children":1710},{},[1711,1716],{"type":32,"tag":62,"props":1712,"children":1713},{},[1714],{"type":37,"value":1715},"Occurrence after resolution = mechanical reopen",{"type":37,"value":1717}," (recurrence) — and it re-opens against the original anchor, so a fix that didn't hold can land instantly past SLA. That's the honest reading.",{"type":32,"tag":97,"props":1719,"children":1720},{},[1721,1726],{"type":32,"tag":62,"props":1722,"children":1723},{},[1724],{"type":37,"value":1725},"Magnitude informs severity, not multiplicity",{"type":37,"value":1727}," — ×200 is a reason to reclassify, never 200 rows.",{"type":32,"tag":97,"props":1729,"children":1730},{},[1731,1736,1738,1744],{"type":32,"tag":62,"props":1732,"children":1733},{},[1734],{"type":37,"value":1735},"qdash decision vocabulary maps onto the verbs",{"type":37,"value":1737}," — investigate\u002Fassign_owner → acknowledge · accept_risk → exception · open_ticket → escalate · block_* → enforce · approve_destination → control edit (not a finding verb). ",{"type":32,"tag":40,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":37,"value":1743},"snoozed",{"type":37,"value":1745}," deliberately has no successor: snooze is an exception without a reason or expiry.",{"type":32,"tag":97,"props":1747,"children":1748},{},[1749,1754,1756,1761,1763,1768,1770,1775,1777,1782],{"type":32,"tag":62,"props":1750,"children":1751},{},[1752],{"type":37,"value":1753},"Door verb ruled: Adjudicate",{"type":37,"value":1755}," (2026-08-25, Mark's pick over Decide\u002FJudge\u002FMark\u002FManage). Two registers: ",{"type":32,"tag":719,"props":1757,"children":1758},{},[1759],{"type":37,"value":1760},"adjudicate",{"type":37,"value":1762}," is the act — the clearance-world and vuln-tooling term of art for a human rendering a recorded judgment; ",{"type":32,"tag":719,"props":1764,"children":1765},{},[1766],{"type":37,"value":1767},"disposition",{"type":37,"value":1769}," stays the stored outcome (the auditor's word); ",{"type":32,"tag":719,"props":1771,"children":1772},{},[1773],{"type":37,"value":1774},"resolve",{"type":37,"value":1776}," stays reserved for evidence — no human closes a finding by fiat. Filter tabs: ",{"type":32,"tag":62,"props":1778,"children":1779},{},[1780],{"type":37,"value":1781},"Open \u002F Closed \u002F All",{"type":37,"value":1783}," — accepted-risk stays under Open (still on the report's \"tell me why\" list); only resolved\u002Fignored are honestly Closed. Rejected: Manage (the incumbent mystery-meat door), Decide (fine, but adjudicate is unambiguous and domain-precedented), Judge\u002FRule\u002FMark\u002FClassify\u002FTriage (collisions or scope errors, see thread).",{"type":32,"tag":97,"props":1785,"children":1786},{},[1787,1792,1794,1799,1801,1807],{"type":32,"tag":62,"props":1788,"children":1789},{},[1790],{"type":37,"value":1791},"Two-axis model; one displayed status (2026-08-25).",{"type":37,"value":1793}," Axis 1 = risk state (open \u002F accepted-risk \u002F resolved \u002F ignored) — the only thing SLA math, tabs, clocks, and reports read. Axis 2 = handling (unacknowledged → acknowledged → escalated\u002Fenforced) — a derived read-out of attention progress, zero SLA effect; nothing is tracked, correlated, or automated on it (the underlying events and refs ARE the tracked record). Display: one status word by precedence — risk states decisive; handling shows only while open, latest routing wins. Derived (",{"type":32,"tag":40,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":37,"value":857},{"type":37,"value":1800}," in the fold), never stored. The fence exists because qdash's single ",{"type":32,"tag":40,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":37,"value":1806},"workflow.status",{"type":37,"value":1808}," enum (open|triaged|accepted|resolved|snoozed) mixes the axes — the pathology this split fixes.",{"type":32,"tag":97,"props":1810,"children":1811},{},[1812,1817],{"type":32,"tag":62,"props":1813,"children":1814},{},[1815],{"type":37,"value":1816},"Verb clusters align to the axes (2026-08-25).",{"type":37,"value":1818}," Handling: acknowledge · escalate ↗ · enforce ↗ (clock-neutral, at most a stamped ref). Adjudication: ignore · accept risk · reopen (reason mandatory, changes risk state). Evidence: resolve (system only). The mandatory-reason rule and the axis boundary are the same line. Panel's \"Adjudication :\" label is currently over-broad — the two-cluster relabel is a pending revision.",{"type":32,"tag":97,"props":1820,"children":1821},{},[1822,1827,1829,1835],{"type":32,"tag":62,"props":1823,"children":1824},{},[1825],{"type":37,"value":1826},"Verb rename ruled: \"accept risk\" replaces \"exception\" as the act",{"type":37,"value":1828}," — aligns verb→state (accepted-risk), qdash's ",{"type":32,"tag":40,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":37,"value":1834},"accept_risk",{"type":37,"value":1836}," decision id, and auditor vocabulary; \"create exception\" rejected (artifact-centric, and misreadable as a policy carve-out, which is a control edit — a different door). \"Exception\" survives as the artifact noun (the exceptions register, \"expires 10-01\"). Full rename pending.",{"type":32,"tag":97,"props":1838,"children":1839},{},[1840,1845,1847,1853],{"type":32,"tag":62,"props":1841,"children":1842},{},[1843],{"type":37,"value":1844},"Resolution paths ruled (2026-08-25).",{"type":37,"value":1846}," Humans never set resolved. Three evidence shapes: re-scannable state (config\u002Finstall re-check), policy-settled (rule stops matching after enforce\u002Fapprove), and the gap — attestation for non-re-scannable conditions. ",{"type":32,"tag":40,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":37,"value":1852},"attest resolved",{"type":37,"value":1854}," parked as an open thread: human claim + MANDATORY evidence artifact, rendered distinct from system-observed resolution in the audit record.",{"type":32,"tag":97,"props":1856,"children":1857},{},[1858,1863],{"type":32,"tag":62,"props":1859,"children":1860},{},[1861],{"type":37,"value":1862},"Clock naming ruled: it's the remediation clock",{"type":37,"value":1864}," (detection → resolution; Mark M's \"remediated 14 days\"). \"Adjudication lag\" (detect → first human verb, the MTTA analog) is a separate derived metric, free from the event log — open thread, no second hard target in the mock.",{"type":32,"tag":97,"props":1866,"children":1867},{},[1868,1873],{"type":32,"tag":62,"props":1869,"children":1870},{},[1871],{"type":37,"value":1872},"Evidence vs audit record ruled (2026-08-25).",{"type":37,"value":1874}," Same event log, two lenses: Evidence = the occurrence stream (detect\u002Foccur — what the world did; truncation-honest: \"last 5 of 200 · view all →\"); Audit record = everything except occur (what humans did — complete on its face, occur-excluded so 200 system rows can't drown five human judgments).",{"type":32,"tag":97,"props":1876,"children":1877},{},[1878,1883,1885,1891,1893,1899],{"type":32,"tag":62,"props":1879,"children":1880},{},[1881],{"type":37,"value":1882},"Occurrences get no standalone pages.",{"type":37,"value":1884}," Three layers instead: peek (envelope in place), anchor (deep link to the session moment \u002F native surface), citable id (stable handle for the audit packet — qdash's ",{"type":32,"tag":40,"props":1886,"children":1888},{"className":1887},[],[1889],{"type":37,"value":1890},"\u002Fapi\u002Fsecurity-packet",{"type":37,"value":1892},"). The full stream lives on the finding's detail page (",{"type":32,"tag":40,"props":1894,"children":1896},{"className":1895},[],[1897],{"type":37,"value":1898},"\u002Ffindings\u002F:id",{"type":37,"value":1900}," in product terms) — the demoted flat view's true home. Future unification: raw occurrences promotable into curated EvidenceItems (the compliance report's EV-#### shape).",{"type":32,"tag":97,"props":1902,"children":1903},{},[1904,1909],{"type":32,"tag":62,"props":1905,"children":1906},{},[1907],{"type":37,"value":1908},"Occurrence envelope",{"type":37,"value":1910}," (partially mocked): per-occurrence attribution (agent instance), runtime action (observed\u002Fheld\u002Fblocked), session anchor, signal specifics, capture provenance. The worklist inset shows ts+detail; the detail page shows the columns.",{"type":32,"tag":97,"props":1912,"children":1913},{},[1914,1919],{"type":32,"tag":62,"props":1915,"children":1916},{},[1917],{"type":37,"value":1918},"Terminology ruled: Control → Finding → Occurrence",{"type":37,"value":1920}," (2026-08-25).",{"type":32,"tag":97,"props":1922,"children":1923},{},[1924,1929,1931,1935,1937,1942,1944,1950,1951,1957,1958,1964],{"type":32,"tag":62,"props":1925,"children":1926},{},[1927],{"type":37,"value":1928},"\"Occurrences\" stays as the column header (2026-08-26)",{"type":37,"value":1930}," — it's the ruled third grain's name and the header is where the UI teaches it; \"Total\" rejected (ambiguous beside the Findings numerals, and it resurrects qdash's instances-as-the-countable framing). Recorded alternative if shorter is ever wanted: the per-control unit noun as a dynamic header (Tool Calls \u002F Connections \u002F Opens). \"Condition\" was thread scaffolding; the clocked, dispositioned unit is what the SLA report, Mark M's requirement, and the F-#### ids already call a ",{"type":32,"tag":719,"props":1932,"children":1933},{},[1934],{"type":37,"value":737},{"type":37,"value":1936},". The term moves up a grain — qdash's current per-signal rows get the honest name, ",{"type":32,"tag":719,"props":1938,"children":1939},{},[1940],{"type":37,"value":1941},"occurrences",{"type":37,"value":1943},". \"Issue\" is the Wiz-style fallback if the qdash port needs to disambiguate mid-migration. UI copy renamed on both regroup pages; fixture identifiers (",{"type":32,"tag":40,"props":1945,"children":1947},{"className":1946},[],[1948],{"type":37,"value":1949},"ConditionSeed",{"type":37,"value":169},{"type":32,"tag":40,"props":1952,"children":1954},{"className":1953},[],[1955],{"type":37,"value":1956},"conditionSeeds",{"type":37,"value":169},{"type":32,"tag":40,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":37,"value":1963},"conditionEvents",{"type":37,"value":1965},") keep the scaffolding name until the port settles the vocabulary.",{"key":1515,"title":1967,"empty":19,"ast":1968},"Standing Considerations",{"type":29,"children":1969},[1970],{"type":32,"tag":93,"props":1971,"children":1972},{},[1973,2002],{"type":32,"tag":97,"props":1974,"children":1975},{},[1976,1978,1984,1986,1992,1994,2000],{"type":37,"value":1977},"Alert ink uses ",{"type":32,"tag":40,"props":1979,"children":1981},{"className":1980},[],[1982],{"type":37,"value":1983},"rose-*",{"type":37,"value":1985},", never ",{"type":32,"tag":40,"props":1987,"children":1989},{"className":1988},[],[1990],{"type":37,"value":1991},"red-*",{"type":37,"value":1993}," (layer's flat ",{"type":32,"tag":40,"props":1995,"children":1997},{"className":1996},[],[1998],{"type":37,"value":1999},"red",{"type":37,"value":2001}," clobbers the scale — c78 finding).",{"type":32,"tag":97,"props":2003,"children":2004},{},[2005],{"type":37,"value":2006},"Derived quarters are a smaller honest world than c78's authored counts — anyone comparing the two SLA surfaces will see different numbers until reconciliation (open thread).",{"key":1515,"title":2008,"empty":19,"ast":2009},"Open Threads",{"type":29,"children":2010},[2011],{"type":32,"tag":93,"props":2012,"children":2013},{},[2014,2032,2045,2055,2065,2075,2087,2092,2097,2118,2123],{"type":32,"tag":97,"props":2015,"children":2016},{},[2017,2022,2024,2030],{"type":32,"tag":62,"props":2018,"children":2019},{},[2020],{"type":37,"value":2021},"Pending panel revision (approved direction, not yet built):",{"type":37,"value":2023}," two-cluster verb row (Handling : \u002F Adjudication :), full accept-risk verb rename (",{"type":32,"tag":40,"props":2025,"children":2027},{"className":2026},[],[2028],{"type":37,"value":2029},"FindingVerb",{"type":37,"value":2031},", fixtures, anatomy table, audit badges), spent-verbs-as-receipts (acknowledged · kai · Aug 6 instead of a greyed button), Status column on the worklist's inner findings table.",{"type":32,"tag":97,"props":2033,"children":2034},{},[2035,2043],{"type":32,"tag":62,"props":2036,"children":2037},{},[2038],{"type":32,"tag":40,"props":2039,"children":2041},{"className":2040},[],[2042],{"type":37,"value":1852},{"type":37,"value":2044}," — human attestation with mandatory evidence artifact for non-re-scannable conditions; renders distinct from system-observed resolution. The third cluster's human entry point.",{"type":32,"tag":97,"props":2046,"children":2047},{},[2048,2053],{"type":32,"tag":62,"props":2049,"children":2050},{},[2051],{"type":37,"value":2052},"Adjudication lag",{"type":37,"value":2054}," as a derived metric (detect → first human verb); possible triage-SLA config later (Vanta-style), deliberately not now.",{"type":32,"tag":97,"props":2056,"children":2057},{},[2058,2063],{"type":32,"tag":62,"props":2059,"children":2060},{},[2061],{"type":37,"value":2062},"Occurrence → EvidenceItem promotion",{"type":37,"value":2064}," for the security packet; session deep-links should anchor to the specific turn (c77 dependency).",{"type":32,"tag":97,"props":2066,"children":2067},{},[2068,2073],{"type":32,"tag":62,"props":2069,"children":2070},{},[2071],{"type":37,"value":2072},"Per-rule scope spec",{"type":37,"value":2074}," — each control declares its fingerprint scope (incl. compound scopes; the sens file-vs-(file,agent) wrinkle) next to its rule definition.",{"type":32,"tag":97,"props":2076,"children":2077},{},[2078,2080,2085],{"type":37,"value":2079},"Reconcile ",{"type":32,"tag":40,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":37,"value":241},{"type":37,"value":2086}," onto the derived world + Mark M rubric once c78 closes.",{"type":32,"tag":97,"props":2088,"children":2089},{},[2090],{"type":37,"value":2091},"Enforce semantics: does policy enforcement auto-exception the instance? (Current ruling: no — policy prevents recurrence, the instance still resolves on evidence.)",{"type":32,"tag":97,"props":2093,"children":2094},{},[2095],{"type":37,"value":2096},"Ignore-vs-exception bucket line needs Mark M's confirmation — auditors care where \"tell me why\" items land.",{"type":32,"tag":97,"props":2098,"children":2099},{},[2100,2102,2108,2110,2116],{"type":37,"value":2101},"Layer extraction of ",{"type":32,"tag":40,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":37,"value":2107},"lifecycle\u002F",{"type":37,"value":2109}," organs alongside the ",{"type":32,"tag":40,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":37,"value":2115},"report\u002F",{"type":37,"value":2117}," organs (c78 thread).",{"type":32,"tag":97,"props":2119,"children":2120},{},[2121],{"type":37,"value":2122},"Rubric versioning — changing targets after a quarterly export silently rewrites submitted history; targets become a contract at first submission.",{"type":32,"tag":97,"props":2124,"children":2125},{},[2126,2132,2133,2138,2140,2146],{"type":32,"tag":2127,"props":2128,"children":2129},"del",{},[2130],{"type":37,"value":2131},"Port the condition-grain findings table back to qdash",{"type":37,"value":161},{"type":32,"tag":62,"props":2134,"children":2135},{},[2136],{"type":37,"value":2137},"done 2026-08-27",{"type":37,"value":2139}," (see the qdash-port thread above; qdash c14). Still open from the recorded requirements: deep-link auto-expand (blocked on the layer's ExpandRow ",{"type":32,"tag":40,"props":2141,"children":2143},{"className":2142},[],[2144],{"type":37,"value":2145},"isOpen",{"type":37,"value":2147}," shadowing) and the flat per-occurrence view as the finding's drill (needs the occurrence event log server-side).",[2149,2153],{"name":2150,"prompt":2151,"plan":2152},"findings-regroup","findings-regroup-prompt.md","findings-regroup-plan.md",{"name":2154,"prompt":2155,"plan":1499},"qcontrol-port","qcontrol-port-prompt.md",[2157,2158],"initial-prompt.md","plan.md",[],[],[],1789151074000]