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