diff --git a/.beads/backup/backup_state.json b/.beads/backup/backup_state.json index 2c0e65a..d5ca1cd 100644 --- a/.beads/backup/backup_state.json +++ b/.beads/backup/backup_state.json @@ -1,13 +1,13 @@ { - "last_dolt_commit": "tnffhnifkmu4ot98b1haog1qsbbpm97n", + "last_dolt_commit": "7cpidanl0tmjlf1e69ikqpc3d8guvl5u", "last_event_id": 0, - "timestamp": "2026-03-03T03:12:33.9777818Z", + "timestamp": "2026-03-03T03:44:22.466163074Z", "counts": { - "issues": 512, - "events": 666, + "issues": 524, + "events": 733, "comments": 12, - "dependencies": 705, - "labels": 833, + "dependencies": 742, + "labels": 872, "config": 14 } } \ No newline at end of file diff --git a/.beads/backup/dependencies.jsonl b/.beads/backup/dependencies.jsonl index 57b00c9..7153790 100644 --- a/.beads/backup/dependencies.jsonl +++ b/.beads/backup/dependencies.jsonl @@ -429,6 +429,7 @@ {"created_at":"2026-02-12T01:12:34Z","created_by":"zenchantlive","depends_on_id":"bb-ymg.2","issue_id":"bb-ymg.4","type":"blocks"} {"created_at":"2026-03-01T16:54:04Z","created_by":"ZenchantLive","depends_on_id":"beadboard-6fv","issue_id":"beadboard-03r","type":"relates-to"} {"created_at":"2026-03-02T15:16:11Z","created_by":"ZenchantLive","depends_on_id":"beadboard-05a.7","issue_id":"beadboard-05a","type":"blocks"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-9xb","issue_id":"beadboard-05a","type":"relates-to"} {"created_at":"2026-03-02T14:01:09Z","created_by":"ZenchantLive","depends_on_id":"beadboard-btt","issue_id":"beadboard-05a","type":"blocks"} {"created_at":"2026-03-02T14:01:05Z","created_by":"ZenchantLive","depends_on_id":"beadboard-c70","issue_id":"beadboard-05a","type":"relates-to"} {"created_at":"2026-03-02T15:15:24Z","created_by":"ZenchantLive","depends_on_id":"beadboard-05a","issue_id":"beadboard-05a.1","type":"parent-child"} @@ -498,6 +499,9 @@ {"created_at":"2026-03-02T15:06:57Z","created_by":"ZenchantLive","depends_on_id":"beadboard-ydu","issue_id":"beadboard-2fo","type":"blocks"} {"created_at":"2026-02-19T21:27:39Z","created_by":"zenchantlive","depends_on_id":"bb-ui2","issue_id":"beadboard-2on","type":"relates-to"} {"created_at":"2026-03-01T18:26:24Z","created_by":"zenchantlive","depends_on_id":"beadboard-6wv","issue_id":"beadboard-3de","type":"blocks"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cyk","issue_id":"beadboard-4k8","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-4k8","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x6f","issue_id":"beadboard-4k8","type":"relates-to"} {"created_at":"2026-03-01T18:31:50Z","created_by":"ZenchantLive","depends_on_id":"beadboard-6cc","issue_id":"beadboard-4vr","type":"blocks"} {"created_at":"2026-03-01T18:31:50Z","created_by":"ZenchantLive","depends_on_id":"beadboard-bgh","issue_id":"beadboard-4vr","type":"blocks"} {"created_at":"2026-02-28T16:59:16Z","created_by":"ZenchantLive","depends_on_id":"beadboard-550","issue_id":"beadboard-550.1","type":"parent-child"} @@ -511,6 +515,7 @@ {"created_at":"2026-03-01T20:47:44Z","created_by":"ZenchantLive","depends_on_id":"beadboard-6fv","issue_id":"beadboard-5kf.1","type":"relates-to"} {"created_at":"2026-03-01T20:47:44Z","created_by":"ZenchantLive","depends_on_id":"beadboard-duo","issue_id":"beadboard-5kf.1","type":"relates-to"} {"created_at":"2026-03-01T20:48:12Z","created_by":"ZenchantLive","depends_on_id":"beadboard-5kf","issue_id":"beadboard-5kf.2","type":"parent-child"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-9xb","issue_id":"beadboard-5r1","type":"relates-to"} {"created_at":"2026-03-02T13:29:55Z","created_by":"ZenchantLive","depends_on_id":"beadboard-at4","issue_id":"beadboard-5r1","type":"relates-to"} {"created_at":"2026-03-01T16:39:58Z","created_by":"ZenchantLive","depends_on_id":"beadboard-dvp","issue_id":"beadboard-5r1","type":"relates-to"} {"created_at":"2026-02-24T01:38:23Z","created_by":"zenchantlive","depends_on_id":"beadboard-ck0","issue_id":"beadboard-5sr","type":"blocks"} @@ -573,11 +578,15 @@ {"created_at":"2026-03-01T16:54:05Z","created_by":"ZenchantLive","depends_on_id":"beadboard-6fv","issue_id":"beadboard-8rg","type":"relates-to"} {"created_at":"2026-03-01T16:40:03Z","created_by":"ZenchantLive","depends_on_id":"beadboard-6fv","issue_id":"beadboard-8st","type":"relates-to"} {"created_at":"2026-03-01T16:40:04Z","created_by":"ZenchantLive","depends_on_id":"beadboard-fga","issue_id":"beadboard-8st","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-8st","type":"relates-to"} {"created_at":"2026-02-21T18:50:43Z","created_by":"zenchantlive","depends_on_id":"beadboard-8u3","issue_id":"beadboard-8u3.1","type":"parent-child"} {"created_at":"2026-03-01T18:26:23Z","created_by":"zenchantlive","depends_on_id":"beadboard-6wv","issue_id":"beadboard-8yd","type":"blocks"} {"created_at":"2026-03-01T18:28:52Z","created_by":"zenchantlive","depends_on_id":"beadboard-e6w","issue_id":"beadboard-8yd","type":"relates-to"} {"created_at":"2026-03-01T15:38:15Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cc8","issue_id":"beadboard-91y","type":"parent-child"} {"created_at":"2026-03-01T18:26:25Z","created_by":"zenchantlive","depends_on_id":"beadboard-6wv","issue_id":"beadboard-9bz","type":"blocks"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-05a","issue_id":"beadboard-9xb","type":"relates-to"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-5r1","issue_id":"beadboard-9xb","type":"relates-to"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-ojo","issue_id":"beadboard-9xb","type":"relates-to"} {"created_at":"2026-03-02T13:30:05Z","created_by":"ZenchantLive","depends_on_id":"beadboard-1bg","issue_id":"beadboard-at4","type":"relates-to"} {"created_at":"2026-03-02T13:29:55Z","created_by":"ZenchantLive","depends_on_id":"beadboard-5r1","issue_id":"beadboard-at4","type":"relates-to"} {"created_at":"2026-03-02T13:30:07Z","created_by":"ZenchantLive","depends_on_id":"beadboard-dc0","issue_id":"beadboard-at4","type":"relates-to"} @@ -600,12 +609,18 @@ {"created_at":"2026-03-02T15:06:41Z","created_by":"ZenchantLive","depends_on_id":"beadboard-nrb","issue_id":"beadboard-c70","type":"relates-to"} {"created_at":"2026-03-02T15:06:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-u4i","issue_id":"beadboard-c70","type":"relates-to"} {"created_at":"2026-03-02T15:06:37Z","created_by":"ZenchantLive","depends_on_id":"beadboard-ydu","issue_id":"beadboard-c70","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-cc8","type":"relates-to"} {"created_at":"2026-02-24T01:38:07Z","created_by":"zenchantlive","depends_on_id":"beadboard-uui","issue_id":"beadboard-ck0","type":"parent"} {"created_at":"2026-02-24T01:38:24Z","created_by":"zenchantlive","depends_on_id":"beadboard-5sr","issue_id":"beadboard-cm8","type":"blocks"} {"created_at":"2026-02-24T01:38:23Z","created_by":"zenchantlive","depends_on_id":"beadboard-d4n","issue_id":"beadboard-cm8","type":"blocks"} {"created_at":"2026-02-24T01:38:07Z","created_by":"zenchantlive","depends_on_id":"beadboard-uui","issue_id":"beadboard-cm8","type":"parent"} {"created_at":"2026-02-24T01:38:23Z","created_by":"zenchantlive","depends_on_id":"beadboard-12l","issue_id":"beadboard-cvo","type":"blocks"} {"created_at":"2026-02-24T01:38:07Z","created_by":"zenchantlive","depends_on_id":"beadboard-uui","issue_id":"beadboard-cvo","type":"parent"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-4k8","issue_id":"beadboard-cyk","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-fld","issue_id":"beadboard-cyk","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-cyk","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x1y","issue_id":"beadboard-cyk","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-xz5","issue_id":"beadboard-cyk","type":"relates-to"} {"created_at":"2026-02-28T14:39:57Z","created_by":"ZenchantLive","depends_on_id":"beadboard-8ij","issue_id":"beadboard-d2x","type":"blocks"} {"created_at":"2026-02-28T14:39:57Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l","issue_id":"beadboard-d2x","type":"blocks"} {"created_at":"2026-02-28T14:39:47Z","created_by":"ZenchantLive","depends_on_id":"beadboard-d2x","issue_id":"beadboard-d2x.1","type":"parent-child"} @@ -637,6 +652,7 @@ {"created_at":"2026-03-01T16:54:07Z","created_by":"ZenchantLive","depends_on_id":"beadboard-5vs","issue_id":"beadboard-fga","type":"relates-to"} {"created_at":"2026-03-01T16:40:04Z","created_by":"ZenchantLive","depends_on_id":"beadboard-8st","issue_id":"beadboard-fga","type":"relates-to"} {"created_at":"2026-03-01T21:40:55Z","created_by":"zenchantlive","depends_on_id":"beadboard-6iq","issue_id":"beadboard-fld","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cyk","issue_id":"beadboard-fld","type":"relates-to"} {"created_at":"2026-03-01T16:40:02Z","created_by":"ZenchantLive","depends_on_id":"beadboard-duo","issue_id":"beadboard-fld","type":"relates-to"} {"created_at":"2026-03-01T18:28:51Z","created_by":"zenchantlive","depends_on_id":"beadboard-e6w","issue_id":"beadboard-fld","type":"relates-to"} {"created_at":"2026-02-24T01:42:05Z","created_by":"zenchantlive","depends_on_id":"beadboard-gb0","issue_id":"beadboard-gb0.1","type":"parent-child"} @@ -667,8 +683,16 @@ {"created_at":"2026-03-01T22:50:15Z","created_by":"zenchantlive","depends_on_id":"beadboard-n1h","issue_id":"beadboard-n1h.2","type":"parent-child"} {"created_at":"2026-03-01T22:50:29Z","created_by":"zenchantlive","depends_on_id":"beadboard-n1h","issue_id":"beadboard-n1h.3","type":"parent-child"} {"created_at":"2026-03-01T16:39:57Z","created_by":"ZenchantLive","depends_on_id":"beadboard-116","issue_id":"beadboard-nq9","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x6f","issue_id":"beadboard-nq9","type":"relates-to"} {"created_at":"2026-03-02T15:06:41Z","created_by":"ZenchantLive","depends_on_id":"beadboard-c70","issue_id":"beadboard-nrb","type":"relates-to"} {"created_at":"2026-03-02T15:06:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-ydu","issue_id":"beadboard-nrb","type":"blocks"} +{"created_at":"2026-03-02T19:38:54Z","created_by":"ZenchantLive","depends_on_id":"beadboard-9xb","issue_id":"beadboard-ojo","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-4k8","issue_id":"beadboard-om4","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-8st","issue_id":"beadboard-om4","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cc8","issue_id":"beadboard-om4","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cyk","issue_id":"beadboard-om4","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x1y","issue_id":"beadboard-om4","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x6f","issue_id":"beadboard-om4","type":"relates-to"} {"created_at":"2026-03-01T16:54:00Z","created_by":"ZenchantLive","depends_on_id":"beadboard-60a","issue_id":"beadboard-r1i","type":"relates-to"} {"created_at":"2026-03-01T16:53:59Z","created_by":"ZenchantLive","depends_on_id":"beadboard-dvp","issue_id":"beadboard-r1i","type":"relates-to"} {"created_at":"2026-02-28T13:44:19Z","created_by":"ZenchantLive","depends_on_id":"beadboard-r1i","issue_id":"beadboard-r1i.1","type":"parent-child"} @@ -677,10 +701,18 @@ {"created_at":"2026-02-28T13:54:16Z","created_by":"ZenchantLive","depends_on_id":"beadboard-r1i.1","issue_id":"beadboard-r1i.2","type":"blocks"} {"created_at":"2026-02-28T13:54:08Z","created_by":"ZenchantLive","depends_on_id":"beadboard-r1i","issue_id":"beadboard-r1i.3","type":"parent-child"} {"created_at":"2026-02-28T13:54:14Z","created_by":"ZenchantLive","depends_on_id":"beadboard-r1i.1","issue_id":"beadboard-r1i.3","type":"blocks"} +{"created_at":"2026-03-02T19:36:09Z","created_by":"zenchantlive","depends_on_id":"beadboard-txj","issue_id":"beadboard-txj.1","type":"parent-child"} +{"created_at":"2026-03-02T19:36:41Z","created_by":"zenchantlive","depends_on_id":"beadboard-txj","issue_id":"beadboard-txj.2","type":"parent-child"} +{"created_at":"2026-03-02T19:37:57Z","created_by":"zenchantlive","depends_on_id":"beadboard-txj.1","issue_id":"beadboard-txj.2","type":"blocks"} +{"created_at":"2026-03-02T19:36:42Z","created_by":"zenchantlive","depends_on_id":"beadboard-txj","issue_id":"beadboard-txj.3","type":"parent-child"} +{"created_at":"2026-03-02T19:37:57Z","created_by":"zenchantlive","depends_on_id":"beadboard-txj.2","issue_id":"beadboard-txj.3","type":"blocks"} {"created_at":"2026-03-02T15:07:01Z","created_by":"ZenchantLive","depends_on_id":"beadboard-27u","issue_id":"beadboard-u4i","type":"blocks"} {"created_at":"2026-03-02T15:07:05Z","created_by":"ZenchantLive","depends_on_id":"beadboard-2fo","issue_id":"beadboard-u4i","type":"blocks"} {"created_at":"2026-03-02T15:06:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-c70","issue_id":"beadboard-u4i","type":"relates-to"} {"created_at":"2026-03-02T15:07:03Z","created_by":"ZenchantLive","depends_on_id":"beadboard-nrb","issue_id":"beadboard-u4i","type":"blocks"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cyk","issue_id":"beadboard-x1y","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-x1y","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x6f","issue_id":"beadboard-x1y","type":"relates-to"} {"created_at":"2026-02-28T14:34:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-0fi","issue_id":"beadboard-x3l","type":"blocks"} {"created_at":"2026-02-28T14:34:42Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l","issue_id":"beadboard-x3l.1","type":"parent-child"} {"created_at":"2026-02-28T14:34:42Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l","issue_id":"beadboard-x3l.2","type":"parent-child"} @@ -689,8 +721,13 @@ {"created_at":"2026-02-28T14:34:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l.1","issue_id":"beadboard-x3l.3","type":"blocks"} {"created_at":"2026-02-28T14:34:43Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l","issue_id":"beadboard-x3l.4","type":"parent-child"} {"created_at":"2026-02-28T14:34:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x3l.1","issue_id":"beadboard-x3l.4","type":"blocks"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-4k8","issue_id":"beadboard-x6f","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-nq9","issue_id":"beadboard-x6f","type":"relates-to"} +{"created_at":"2026-03-02T19:29:28Z","created_by":"ZenchantLive","depends_on_id":"beadboard-om4","issue_id":"beadboard-x6f","type":"relates-to"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-x1y","issue_id":"beadboard-x6f","type":"relates-to"} {"created_at":"2026-03-01T22:11:12Z","created_by":"ZenchantLive","depends_on_id":"beadboard-xte","issue_id":"beadboard-xte.1","type":"parent-child"} {"created_at":"2026-03-02T15:31:48Z","created_by":"ZenchantLive","depends_on_id":"beadboard-ay9","issue_id":"beadboard-xz5","type":"parent-child"} +{"created_at":"2026-03-02T19:29:39Z","created_by":"ZenchantLive","depends_on_id":"beadboard-cyk","issue_id":"beadboard-xz5","type":"relates-to"} {"created_at":"2026-03-01T18:26:24Z","created_by":"zenchantlive","depends_on_id":"beadboard-6wv","issue_id":"beadboard-y8k","type":"blocks"} {"created_at":"2026-03-01T18:28:26Z","created_by":"zenchantlive","depends_on_id":"beadboard-mdo","issue_id":"beadboard-y8k","type":"relates-to"} {"created_at":"2026-02-21T04:03:21Z","created_by":"zenchantlive","depends_on_id":"beadboard-3xc","issue_id":"beadboard-yad","type":"parent"} diff --git a/.beads/backup/events.jsonl b/.beads/backup/events.jsonl index d4b44cd..499b15f 100644 --- a/.beads/backup/events.jsonl +++ b/.beads/backup/events.jsonl @@ -664,3 +664,70 @@ {"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T16:04:32Z","event_type":"created","id":668,"issue_id":"beadboard-x1y","new_value":"","old_value":""} {"actor":"zenchantlive","comment":"Added label: bug","created_at":"2026-03-02T16:04:32Z","event_type":"label_added","id":669,"issue_id":"beadboard-x1y","new_value":null,"old_value":null} {"actor":"zenchantlive","comment":"Added label: frontend","created_at":"2026-03-02T16:04:32Z","event_type":"label_added","id":670,"issue_id":"beadboard-x1y","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:14:24Z","event_type":"created","id":671,"issue_id":"beadboard-pxu","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: gt:agent","created_at":"2026-03-02T19:14:24Z","event_type":"label_added","id":672,"issue_id":"beadboard-pxu","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: role:orchestrator","created_at":"2026-03-02T19:14:24Z","event_type":"label_added","id":673,"issue_id":"beadboard-pxu","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:14:28Z","event_type":"status_changed","id":674,"issue_id":"beadboard-pxu","new_value":"{\"assignee\":\"beadboard-pxu\",\"status\":\"in_progress\"}","old_value":"{\"id\":\"beadboard-pxu\",\"title\":\"Agent: codex-debug-orchestrator\",\"description\":\"Diagnose and fix frontend/Dolt data mismatch and stale sidebar state\",\"status\":\"open\",\"priority\":0,\"issue_type\":\"task\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:14:24Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:14:24Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:14:28Z","event_type":"status_changed","id":675,"issue_id":"beadboard-x1y","new_value":"{\"assignee\":\"beadboard-pxu\",\"status\":\"in_progress\"}","old_value":"{\"id\":\"beadboard-x1y\",\"title\":\"[BUG] Epics with no children hidden by hideClosed filter\",\"description\":\"## Context\\nEpics with zero child tasks are hidden in the left panel when hideClosed=true (the default).\\n\\n## Root Cause\\nLine 327 in left-panel.tsx filters out epics with no matched children, but since all epics have 0 children currently, they get hidden.\\n\\n## Notes\\nNEEDS DISCUSSION: Before implementing, discuss with user - the fix affects epic visibility logic.\",\"status\":\"open\",\"priority\":0,\"issue_type\":\"bug\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T00:04:32Z\",\"created_by\":\"zenchantlive\",\"updated_at\":\"2026-03-03T00:04:32Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:11Z","event_type":"updated","id":676,"issue_id":"beadboard-x1y","new_value":"{\"notes\":\"Root cause and fixes for Hide Closed epic leakage:\\\\n\\\\nRoot causes:\\\\n1) Left panel logic exempted selected epics from hide checks, so a selected closed epic (bb-u6f.7) remained visible.\\\\n2) Dependency graph epic chip strip was fed unfiltered epics in one path, so Hide Closed did not consistently apply in that surface.\\\\n3) Runtime data freshness was vulnerable to stale session state when SSE degraded; initial refresh hardening was added.\\\\n\\\\nFixes shipped:\\\\n- left-panel.tsx: Hide Closed now hides closed/tombstone epics even when selected.\\\\n- unified-shell.tsx: when hideClosed=true, selected closed epic is auto-cleared.\\\\n- dependency-graph-page.tsx: EpicChipStrip and selection logic now use hide-closed filtered selectableEpics.\\\\n- page.tsx + use-beads-subscription.ts: force-dynamic + initial silent refresh to reduce stale SSR/session reads.\\\\n\\\\nVerification evidence:\\\\n- node --import tsx --test tests/components/shared/left-panel-filtering.test.ts =\\u003e PASS\\\\n- node --import tsx --test tests/components/shared/unified-shell-hide-closed-contract.test.ts =\\u003e PASS\\\\n- node --import tsx --test tests/components/graph/dependency-graph-hide-closed-contract.test.ts =\\u003e PASS\\\\n- npm run typecheck =\\u003e PASS\\\\n- npm run lint =\\u003e PASS (warnings only)\\\\n- npm run test =\\u003e FAIL (pre-existing unrelated graphTab expectation in tests/hooks/url-state-integration.test.ts)\\\\n\\\\nMemory review trigger: create canonical memories for cross-surface filter invariants and selected-state invalidation under filters.\"}","old_value":"{\"id\":\"beadboard-x1y\",\"title\":\"[BUG] Epics with no children hidden by hideClosed filter\",\"description\":\"## Context\\nEpics with zero child tasks are hidden in the left panel when hideClosed=true (the default).\\n\\n## Root Cause\\nLine 327 in left-panel.tsx filters out epics with no matched children, but since all epics have 0 children currently, they get hidden.\\n\\n## Notes\\nNEEDS DISCUSSION: Before implementing, discuss with user - the fix affects epic visibility logic.\",\"status\":\"in_progress\",\"priority\":0,\"issue_type\":\"bug\",\"assignee\":\"beadboard-pxu\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T00:04:32Z\",\"created_by\":\"zenchantlive\",\"updated_at\":\"2026-03-03T03:14:30Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:11Z","event_type":"closed","id":677,"issue_id":"beadboard-x1y","new_value":"Fixed Hide Closed regression across left panel and graph epic chip surfaces; added selected-state invalidation and regression tests.","old_value":""} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:41Z","event_type":"created","id":678,"issue_id":"beadboard-4k8","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: incident","created_at":"2026-03-02T19:28:41Z","event_type":"label_added","id":679,"issue_id":"beadboard-4k8","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: p0","created_at":"2026-03-02T19:28:41Z","event_type":"label_added","id":680,"issue_id":"beadboard-4k8","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: frontend","created_at":"2026-03-02T19:28:41Z","event_type":"label_added","id":681,"issue_id":"beadboard-4k8","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: reliability","created_at":"2026-03-02T19:28:41Z","event_type":"label_added","id":682,"issue_id":"beadboard-4k8","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:52Z","event_type":"status_changed","id":683,"issue_id":"beadboard-4k8","new_value":"{\"assignee\":\"beadboard-pxu\",\"status\":\"in_progress\"}","old_value":"{\"id\":\"beadboard-4k8\",\"title\":\"P0 Incident: Hide Closed showed closed epic bb-u6f.7\",\"description\":\"Scope: Document root cause, remediation, and prevention controls for Hide Closed showing a closed epic in active UI.\\\\nOut of Scope: New feature work unrelated to filtering/state consistency.\\\\nSuccess Criteria: Clear incident narrative, evidence commands, and prevention checklist linked to canonical memories.\",\"status\":\"open\",\"priority\":0,\"issue_type\":\"task\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:28:41Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:28:41Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:52Z","event_type":"updated","id":684,"issue_id":"beadboard-4k8","new_value":"{\"notes\":\"Incident summary:\\\\n- User observed closed epic bb-u6f.7 still visible with Hide Closed enabled.\\\\n\\\\nRoot causes:\\\\n1) LeftPanel hide logic exempted selected entries; selected closed epic could persist.\\\\n2) Dependency graph epic chip surface used an unfiltered epic list in one path.\\\\n3) Stale-state risk increased under unstable SSE; no guaranteed initial client refresh in some flows.\\\\n\\\\nRemediations implemented:\\\\n- left-panel.tsx: closed/tombstone epic hidden regardless of selection when hideClosed=true.\\\\n- unified-shell.tsx: auto-clear selected epic if hideClosed=true and selected epic is closed/tombstone.\\\\n- dependency-graph-page.tsx: feed EpicChipStrip with hide-closed filtered selectableEpics and align selection/requested-epic checks.\\\\n- page.tsx + use-beads-subscription.ts: force-dynamic + initial silent refresh on mount.\\\\n\\\\nEvidence:\\\\n- bd show bb-u6f.7 =\\u003e closed epic\\\\n- direct SQL at 127.0.0.1:3307 =\\u003e bb-u6f.7 status=closed, issue_type=epic\\\\n- node --import tsx --test tests/components/shared/left-panel-filtering.test.ts =\\u003e PASS\\\\n- node --import tsx --test tests/components/shared/unified-shell-hide-closed-contract.test.ts =\\u003e PASS\\\\n- node --import tsx --test tests/components/graph/dependency-graph-hide-closed-contract.test.ts =\\u003e PASS\\\\n- npm run typecheck =\\u003e PASS\\\\n- npm run lint =\\u003e PASS (warnings only)\\\\n- npm run test =\\u003e FAIL (pre-existing unrelated graphTab expectation in tests/hooks/url-state-integration.test.ts)\\\\n\\\\nPrevention checklist:\\\\n- Enforce filter invariants across ALL surfaces consuming same concept (left panel, chip strip, selected state).\\\\n- Never preserve selected closed entities when hideClosed=true.\\\\n- In stale-state triage, validate bd parity, SQL parity, API payload parity, then UI selection state parity.\\\\n- Add contract tests for each surface and selected-state invalidation.\"}","old_value":"{\"id\":\"beadboard-4k8\",\"title\":\"P0 Incident: Hide Closed showed closed epic bb-u6f.7\",\"description\":\"Scope: Document root cause, remediation, and prevention controls for Hide Closed showing a closed epic in active UI.\\\\nOut of Scope: New feature work unrelated to filtering/state consistency.\\\\nSuccess Criteria: Clear incident narrative, evidence commands, and prevention checklist linked to canonical memories.\",\"status\":\"open\",\"priority\":0,\"issue_type\":\"task\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:28:41Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:28:41Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:28:57Z","event_type":"closed","id":685,"issue_id":"beadboard-4k8","new_value":"Documented root cause, fixes, evidence, and prevention controls for closed-epic visibility regression.","old_value":""} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:05Z","event_type":"created","id":686,"issue_id":"beadboard-cyk","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: mem-canonical","created_at":"2026-03-02T19:29:05Z","event_type":"label_added","id":687,"issue_id":"beadboard-cyk","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: mem-hard","created_at":"2026-03-02T19:29:05Z","event_type":"label_added","id":688,"issue_id":"beadboard-cyk","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory","created_at":"2026-03-02T19:29:05Z","event_type":"label_added","id":689,"issue_id":"beadboard-cyk","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory-ui","created_at":"2026-03-02T19:29:05Z","event_type":"label_added","id":690,"issue_id":"beadboard-cyk","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:10Z","event_type":"created","id":691,"issue_id":"beadboard-om4","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: mem-canonical","created_at":"2026-03-02T19:29:10Z","event_type":"label_added","id":692,"issue_id":"beadboard-om4","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: mem-hard","created_at":"2026-03-02T19:29:10Z","event_type":"label_added","id":693,"issue_id":"beadboard-om4","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory","created_at":"2026-03-02T19:29:10Z","event_type":"label_added","id":694,"issue_id":"beadboard-om4","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory-reliability","created_at":"2026-03-02T19:29:10Z","event_type":"label_added","id":695,"issue_id":"beadboard-om4","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:16Z","event_type":"created","id":696,"issue_id":"beadboard-x6f","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: mem-canonical","created_at":"2026-03-02T19:29:16Z","event_type":"label_added","id":697,"issue_id":"beadboard-x6f","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: mem-soft","created_at":"2026-03-02T19:29:16Z","event_type":"label_added","id":698,"issue_id":"beadboard-x6f","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory","created_at":"2026-03-02T19:29:16Z","event_type":"label_added","id":699,"issue_id":"beadboard-x6f","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory-workflow","created_at":"2026-03-02T19:29:16Z","event_type":"label_added","id":700,"issue_id":"beadboard-x6f","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:49Z","event_type":"updated","id":701,"issue_id":"beadboard-cyk","new_value":"{\"notes\":\"Canonicalized after hideClosed regression investigation. Provenance: beadboard-x1y, beadboard-4k8, beadboard-xz5. Linked to UI anchor beadboard-fld and reliability chain beadboard-om4.\"}","old_value":"{\"id\":\"beadboard-cyk\",\"title\":\"[MEMORY][UI][HARD] HideClosed invariants must include selected-state and all epic surfaces\",\"description\":\"Scope: Any Hide Closed / visibility filtering behavior for epics or tasks across left panel, graph chip bars, and selected state holders.\\\\nOut of Scope: Independent status badges that do not affect visibility.\\\\nRule: A visibility filter is not complete unless it is applied to (1) source lists for every surface, and (2) current selection state invalidation paths.\\\\nRationale: Partial filter application causes closed entities to persist in one panel while hidden in another.\\\\nFailure Mode: User sees closed items despite Hide Closed enabled, losing trust in state consistency.\",\"status\":\"open\",\"priority\":1,\"issue_type\":\"decision\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:29:05Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:29:05Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:49Z","event_type":"updated","id":702,"issue_id":"beadboard-om4","new_value":"{\"notes\":\"Canonicalized for stale-state triage discipline using parity sequence (bd-\\u003eSQL-\\u003eAPI-\\u003eUI-\\u003eSSE). Provenance: beadboard-x1y, beadboard-4k8, beadboard-cc8. Linked to reliability anchor beadboard-8st and workflow chain beadboard-x6f.\"}","old_value":"{\"id\":\"beadboard-om4\",\"title\":\"[MEMORY][RELIABILITY][HARD] For stale UI reports, verify bd-\\u003eSQL-\\u003eAPI-\\u003eUI parity in order\",\"description\":\"Scope: Realtime/stale-state incidents where UI contradicts expected issue state.\\\\nOut of Scope: Pure styling bugs with no state mismatch.\\\\nRule: Triage must confirm parity in this order: bd record, SQL row, API payload, UI render state, then SSE health.\\\\nRationale: Fixes made before parity checks target symptoms and miss the true mismatch layer.\\\\nFailure Mode: Repeated 'fixed but still visible' loops with no durable resolution.\",\"status\":\"open\",\"priority\":1,\"issue_type\":\"decision\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:29:10Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:29:10Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:49Z","event_type":"updated","id":703,"issue_id":"beadboard-x6f","new_value":"{\"notes\":\"Canonicalized from user-correction loop: do not mark user-visible bug resolved without explicit in-UI confirmation checkpoint. Provenance: beadboard-x1y, beadboard-4k8. Linked to workflow anchor beadboard-nq9.\"}","old_value":"{\"id\":\"beadboard-x6f\",\"title\":\"[MEMORY][WORKFLOW][SOFT] Persisting user-reported regressions require explicit in-UI confirmation checkpoint\",\"description\":\"Scope: Bugs reported by user as still reproducing after an attempted fix.\\\\nOut of Scope: Backend-only changes with no user-visible behavior.\\\\nRule: Add an explicit confirmation checkpoint against the user-observed surface before closing or announcing completion.\\\\nRationale: Green tests do not guarantee resolution in the user’s actual runtime context.\\\\nFailure Mode: Assistant repeatedly claims fixes while user still sees the bug.\",\"status\":\"open\",\"priority\":1,\"issue_type\":\"decision\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:29:17Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:29:17Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:56Z","event_type":"closed","id":704,"issue_id":"beadboard-cyk","new_value":"Ratified canonical UI memory for HideClosed invariants across source lists and selected-state invalidation.","old_value":""} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:56Z","event_type":"closed","id":705,"issue_id":"beadboard-om4","new_value":"Ratified canonical reliability memory for stale-state parity triage order.","old_value":""} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:29:56Z","event_type":"closed","id":706,"issue_id":"beadboard-x6f","new_value":"Ratified canonical workflow memory requiring explicit in-UI user confirmation for persistent regressions.","old_value":""} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:35:21Z","event_type":"created","id":707,"issue_id":"beadboard-txj","new_value":"","old_value":""} +{"actor":"zenchantlive","comment":"Added label: ui","created_at":"2026-03-02T19:35:21Z","event_type":"label_added","id":708,"issue_id":"beadboard-txj","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: graph","created_at":"2026-03-02T19:35:21Z","event_type":"label_added","id":709,"issue_id":"beadboard-txj","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: visualization","created_at":"2026-03-02T19:35:21Z","event_type":"label_added","id":710,"issue_id":"beadboard-txj","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:36:09Z","event_type":"created","id":711,"issue_id":"beadboard-txj.1","new_value":"","old_value":""} +{"actor":"zenchantlive","comment":"Added label: graph","created_at":"2026-03-02T19:36:09Z","event_type":"label_added","id":712,"issue_id":"beadboard-txj.1","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: algorithm","created_at":"2026-03-02T19:36:09Z","event_type":"label_added","id":713,"issue_id":"beadboard-txj.1","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: ui","created_at":"2026-03-02T19:36:09Z","event_type":"label_added","id":714,"issue_id":"beadboard-txj.1","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: visualization","created_at":"2026-03-02T19:36:09Z","event_type":"label_added","id":715,"issue_id":"beadboard-txj.1","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:36:41Z","event_type":"created","id":716,"issue_id":"beadboard-txj.2","new_value":"","old_value":""} +{"actor":"zenchantlive","comment":"Added label: ui","created_at":"2026-03-02T19:36:41Z","event_type":"label_added","id":717,"issue_id":"beadboard-txj.2","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: graph","created_at":"2026-03-02T19:36:41Z","event_type":"label_added","id":718,"issue_id":"beadboard-txj.2","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: visualization","created_at":"2026-03-02T19:36:41Z","event_type":"label_added","id":719,"issue_id":"beadboard-txj.2","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:36:42Z","event_type":"created","id":720,"issue_id":"beadboard-txj.3","new_value":"","old_value":""} +{"actor":"zenchantlive","comment":"Added label: ui","created_at":"2026-03-02T19:36:42Z","event_type":"label_added","id":721,"issue_id":"beadboard-txj.3","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: graph","created_at":"2026-03-02T19:36:42Z","event_type":"label_added","id":722,"issue_id":"beadboard-txj.3","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: visualization","created_at":"2026-03-02T19:36:42Z","event_type":"label_added","id":723,"issue_id":"beadboard-txj.3","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:37:23Z","event_type":"created","id":724,"issue_id":"beadboard-8bs","new_value":"","old_value":""} +{"actor":"zenchantlive","comment":"Added label: gt:agent","created_at":"2026-03-02T19:37:23Z","event_type":"label_added","id":725,"issue_id":"beadboard-8bs","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":"Added label: role:orchestrator","created_at":"2026-03-02T19:37:23Z","event_type":"label_added","id":726,"issue_id":"beadboard-8bs","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:37:36Z","event_type":"created","id":727,"issue_id":"beadboard-ojo","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: gt:agent","created_at":"2026-03-02T19:37:36Z","event_type":"label_added","id":728,"issue_id":"beadboard-ojo","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: role:orchestrator","created_at":"2026-03-02T19:37:36Z","event_type":"label_added","id":729,"issue_id":"beadboard-ojo","new_value":null,"old_value":null} +{"actor":"zenchantlive","comment":null,"created_at":"2026-03-02T19:37:58Z","event_type":"status_changed","id":730,"issue_id":"beadboard-txj.1","new_value":"{\"assignee\":\"beadboard-8bs\",\"status\":\"in_progress\"}","old_value":"{\"id\":\"beadboard-txj.1\",\"title\":\"Implement graph transitive reduction algorithm\",\"description\":\"Scope: Write a robust algorithm that processes DAG nodes to identify transitive (redundant) edges across paths.\\\\nOut of scope: UI rendering.\\\\nSuccess Criteria: Takes nodes and edges, returns map of edges indicating if they are transitive or direct.\",\"status\":\"open\",\"priority\":0,\"issue_type\":\"task\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:36:09Z\",\"created_by\":\"zenchantlive\",\"updated_at\":\"2026-03-03T03:36:09Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:38:49Z","event_type":"created","id":731,"issue_id":"beadboard-9xb","new_value":"","old_value":""} +{"actor":"ZenchantLive","comment":"Added label: mem-canonical","created_at":"2026-03-02T19:38:49Z","event_type":"label_added","id":732,"issue_id":"beadboard-9xb","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: mem-soft","created_at":"2026-03-02T19:38:49Z","event_type":"label_added","id":733,"issue_id":"beadboard-9xb","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory","created_at":"2026-03-02T19:38:49Z","event_type":"label_added","id":734,"issue_id":"beadboard-9xb","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":"Added label: memory-agent-ops","created_at":"2026-03-02T19:38:49Z","event_type":"label_added","id":735,"issue_id":"beadboard-9xb","new_value":null,"old_value":null} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:39:04Z","event_type":"updated","id":736,"issue_id":"beadboard-9xb","new_value":"{\"notes\":\"Created from live user correction on 2026-03-02: scope for this agent is beadboard-05a; beadboard-txj is assigned elsewhere. Applied immediately by redirecting NEXT_SESSION_PROMPT work back to 05a.\"}","old_value":"{\"id\":\"beadboard-9xb\",\"title\":\"[MEMORY][AGENT-OPS][SOFT] Respect user-assigned scope in multi-agent sessions\",\"description\":\"Scope: Sessions where multiple agents are active and the user clarifies ownership boundaries.\\\\nOut of Scope: Single-agent sessions with no explicit ownership split.\\\\nRule: If the user states a bead is owned by another agent, immediately stop work on that bead and continue only on the user-assigned scope.\\\\nRationale: Prevents duplicate/conflicting work and keeps coordination clean.\\\\nFailure Mode: Parallel agents overwrite each other or create handoff confusion.\",\"status\":\"open\",\"priority\":1,\"issue_type\":\"decision\",\"owner\":\"jordanlive121@gmail.com\",\"created_at\":\"2026-03-03T03:38:50Z\",\"created_by\":\"ZenchantLive\",\"updated_at\":\"2026-03-03T03:38:50Z\"}"} +{"actor":"ZenchantLive","comment":null,"created_at":"2026-03-02T19:39:04Z","event_type":"closed","id":737,"issue_id":"beadboard-9xb","new_value":"Ratified canonical memory from user correction to preserve multi-agent scope discipline.","old_value":""} diff --git a/.beads/backup/issues.jsonl b/.beads/backup/issues.jsonl index 5bdf111..b42d2db 100644 --- a/.beads/backup/issues.jsonl +++ b/.beads/backup/issues.jsonl @@ -355,6 +355,7 @@ {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"b7358e2500ddbd6ab2157d800925c3e62edee73814034f7c334eeebef9528256","created_at":"2026-02-21T04:00:36Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-3xc","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"open","target":"","timeout_ns":0,"title":"Swarm Test: Order Processing System","updated_at":"2026-02-21T04:00:36Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Old test bead","closed_at":"2026-03-02T06:35:13Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"e608f5c7f0baffc76ce0d2bfea7935212c4554e0304c6f260dd1ce27cf3651f7","created_at":"2026-02-21T20:31:04Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-43c","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Diff test issue","updated_at":"2026-03-02T06:35:13Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"Templates have color and icon fields, TemplateInspector has color palette, emoji selector, live preview, clone button, display components show template icons","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Templates now have full customization: color palette, icon/emoji selector, live preview, clone functionality. All verification gates pass.","closed_at":"2026-02-26T04:47:40Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"402c4e701dcafb01e60b8a2db10b4d1e8277ee49e3377e0d62c227aa44054247","created_at":"2026-02-26T04:24:13Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Add same customization features to templates as archetypes have","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-4i8","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Completed: added color and icon fields to SwarmTemplate, enhanced TemplateInspector with color palette (30 presets), emoji selector (40 emojis), live preview, clone functionality. Updated all display components.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Enhanced Template Customization","updated_at":"2026-02-26T04:47:40Z","waiters":"","wisp_type":"","work_type":"mutex"} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-pxu","await_id":"","await_type":"","close_reason":"Documented root cause, fixes, evidence, and prevention controls for closed-epic visibility regression.","closed_at":"2026-03-03T03:28:56Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"40d034d2ce8486c21814e877f8693f6d823b11d7c32a118cf8db45e658857fe5","created_at":"2026-03-03T03:28:41Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Document root cause, remediation, and prevention controls for Hide Closed showing a closed epic in active UI.\\nOut of Scope: New feature work unrelated to filtering/state consistency.\\nSuccess Criteria: Clear incident narrative, evidence commands, and prevention checklist linked to canonical memories.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-4k8","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Incident summary:\\n- User observed closed epic bb-u6f.7 still visible with Hide Closed enabled.\\n\\nRoot causes:\\n1) LeftPanel hide logic exempted selected entries; selected closed epic could persist.\\n2) Dependency graph epic chip surface used an unfiltered epic list in one path.\\n3) Stale-state risk increased under unstable SSE; no guaranteed initial client refresh in some flows.\\n\\nRemediations implemented:\\n- left-panel.tsx: closed/tombstone epic hidden regardless of selection when hideClosed=true.\\n- unified-shell.tsx: auto-clear selected epic if hideClosed=true and selected epic is closed/tombstone.\\n- dependency-graph-page.tsx: feed EpicChipStrip with hide-closed filtered selectableEpics and align selection/requested-epic checks.\\n- page.tsx + use-beads-subscription.ts: force-dynamic + initial silent refresh on mount.\\n\\nEvidence:\\n- bd show bb-u6f.7 =\u003e closed epic\\n- direct SQL at 127.0.0.1:3307 =\u003e bb-u6f.7 status=closed, issue_type=epic\\n- node --import tsx --test tests/components/shared/left-panel-filtering.test.ts =\u003e PASS\\n- node --import tsx --test tests/components/shared/unified-shell-hide-closed-contract.test.ts =\u003e PASS\\n- node --import tsx --test tests/components/graph/dependency-graph-hide-closed-contract.test.ts =\u003e PASS\\n- npm run typecheck =\u003e PASS\\n- npm run lint =\u003e PASS (warnings only)\\n- npm run test =\u003e FAIL (pre-existing unrelated graphTab expectation in tests/hooks/url-state-integration.test.ts)\\n\\nPrevention checklist:\\n- Enforce filter invariants across ALL surfaces consuming same concept (left panel, chip strip, selected state).\\n- Never preserve selected closed entities when hideClosed=true.\\n- In stale-state triage, validate bd parity, SQL parity, API payload parity, then UI selection state parity.\\n- Add contract tests for each surface and selected-state invalidation.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"P0 Incident: Hide Closed showed closed epic bb-u6f.7","updated_at":"2026-03-03T03:28:56Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Recreating as proper children of Phase 0 epic with correct naming","closed_at":"2026-02-28T21:02:57Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"8aac7647cec1a02916705314b4723ff7e1736530ff8002871de31974fb605c31","created_at":"2026-02-28T20:59:29Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"The TopBar blocked toggle already updates URL state via useUrlState, and SocialPage already accepts a blockedOnly prop, but UnifiedShell never passes it through. One-line fix.\n\nFile: src/components/shared/unified-shell.tsx\nLocation: \u003cSocialPage\u003e call inside renderMiddleContent() (~line 128)\n\nChange: blockedOnly is already available from useUrlState() at line 38. Add as prop:\n \u003cSocialPage\n issues={filteredIssues}\n selectedId={taskId ?? undefined}\n onSelect={handleCardSelect}\n projectScopeOptions={projectScopeOptions}\n blockedOnly={blockedOnly} // add this\n /\u003e\n\nAlso ensure blockedOnly is destructured from useUrlState() at line 38.\n\nAcceptance: Clicking 'Blocked Items' toggle in TopBar immediately filters the social feed to blocked cards only. Toggling off restores full list.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-4qa","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"P0.1: Wire blockedOnly to SocialPage","updated_at":"2026-02-28T21:02:57Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"Success Criteria: (1) Consolidated roadmap with v1/v2 scope; (2) Implementation bead breakdown with dependency order; (3) Verification strategy defined before coding.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"d23389de955b95452fb837c5ca204a32c97cb70c1df18de77e22defa2518826d","created_at":"2026-03-02T02:31:47Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope:\n- Synthesize outcomes from the Memory View and Dolt-history brainstorming epics into a prioritized roadmap.\n- Define v1/v2 cutlines, dependencies, and acceptance contracts for implementation beads.\n- Identify objective success metrics for the selected concept.\n\nOut of Scope:\n- Implementing features.\n- Re-litigating already accepted architectural constraints unless new evidence requires it.\n\nPrompt:\nConverge brainstorming outputs into one execution-ready plan with explicit milestone beads, dependency order, and measurable success criteria.\n","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-4vr","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"[epic][brainstorm] Memory + Dolt Synthesis to Implementation Roadmap","updated_at":"2026-03-02T02:31:47Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"When user selects a template for an epic, the templateId is persisted to the epic and the UI updates to show the assigned template.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Template assignment now persists to epic metadata via /api/beads/update. UI updates to show assigned template after selection.","closed_at":"2026-02-26T18:35:07Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"1d2cf4c11f769fc5c29ff2d678490181ebdbd4e6501dec802bf80b80301c8b05","created_at":"2026-02-26T18:14:41Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: Implement API call or state update to persist templateId to epic. Out of scope: AI auto-assignment.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-514","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Adding metadata support to update mutation. Will store templateId in epic's metadata field.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Persist Epic Template Assignment","updated_at":"2026-02-26T18:35:07Z","waiters":"","wisp_type":"","work_type":"mutex"} @@ -398,6 +399,7 @@ {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"Antigravity (Engineer)","await_id":"","await_type":"","close_reason":"","closed_at":"2026-02-21T19:44:59Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"cafbcb4f477e248fb44186a142ed39da50b1d814d55ac99051cfc9de504fd86d","created_at":"2026-02-21T18:54:19Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Title: Templates UI edit mode\n- Parent/Epic: beadboard-7jp (Swarm Archetypes \u0026 Templates CRUD)\n- Dependencies: beadboard-7jp.4 (Templates API routes must be complete)\n\nTASK CONTRACT\n- Goal: Enable editing and creation of templates in the TemplateInspector modal.\n- Success Criteria:\n - TemplateInspector form fields are editable (not readOnly)\n - Team composition editor: add/remove archetypes, edit counts\n - Save button is enabled and calls PUT /api/swarm/templates/[id]\n - Delete button added (hidden if isBuiltIn: true), calls DELETE with confirmation\n - Add Template button added to Templates tab header\n - Add mode: empty form, Save calls POST /api/swarm/templates\n - Validation: name required, at least one team member\n - Loading state on save, success/error toast on completion\n - Refresh template list after successful save/delete\n- Scope:\n - File: src/components/swarm/template-inspector.tsx\n - File: src/components/swarm/swarm-workspace.tsx (Add button)\n - File: src/hooks/use-templates.ts (refresh function if needed)\n- Out of Scope:\n - Archetype UI\n - Drag-drop functionality\n - Major visual redesign\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing modal layout and styling\n- Reuse archetype selector/dropdown components where possible\n- Keep changes targeted and minimal\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Manual verification: edit, create, delete flows work in browser","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-7jp.7","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Templates UI edit mode","updated_at":"2026-02-21T19:44:59Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"Nodes show archetype badge when assigned. Different visual states for: needs agent, pre-assigned, has active worker. Badge shows archetype icon/initial with color.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Nodes now show archetype badges when assigned via agent: label. Visual states implemented: assigned badge shows archetype name/color. Unassign works with optimistic UI updates. Acceptance criteria met: badges show archetype icon/initial with color, different states for pre-assigned (badge visible).","closed_at":"2026-02-24T07:54:03Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"076606484269f852757f0b9b1cf1f253e23e437cc43848edad5382a9e8273cae","created_at":"2026-02-24T04:15:00Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-7r7","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Fixed unassign bug - added optimistic UI updates to GraphNodeCard. Labels now update immediately when assign/unassign is clicked, with rollback on error. Uses localLabels state synced with data.labels via useEffect.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Add visual indicators for assigned archetypes on nodes","updated_at":"2026-02-24T07:54:03Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Closed","closed_at":"2026-02-23T01:06:06Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"592d98f1b52625ea862f2711ca27ed82a8ed8b438ccc1c470b4690be892ef2e4","created_at":"2026-02-21T20:29:17Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-8af","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Testing file system events","updated_at":"2026-02-23T01:06:06Z","waiters":"","wisp_type":"","work_type":"mutex"} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"68c46179402d938b7d71b312697248ba0882bcb8401bd73af303d280d59ffdf6","created_at":"2026-03-03T03:37:23Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Primary AI pair programmer handling the Graph Enhancement Epic.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-8bs","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Agent: Antigravity Graph Orchestrator","updated_at":"2026-03-03T03:37:23Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Session complete.","closed_at":"2026-03-02T21:56:39Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"c9670e54dd8c22d08ce0f28469b84cf0c0e66848e936061b53f8227840813bd0","created_at":"2026-03-02T21:15:03Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Session orchestrator preparing memory and execution context for beadboard-1bg","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-8hq","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Session orchestration complete: memory prep, epic beadboard-1bg execution, child beads claimed/closed, and NEXT_SESSION_PROMPT updated.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Agent: codex-orchestrator","updated_at":"2026-03-02T21:56:39Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"all steps complete","closed_at":"2026-03-02T01:25:18Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"1daaa8eb2e9bd594181336464685396e3481d6e4ebc54975c8738b0705cb6031","created_at":"2026-02-28T22:05:35Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: (auto)\n- Title: Phase 3: Coordination Layer Integration\n- Parent/Epic: none (phase epic)\n- Dependencies (must be done first): beadboard-r1i (Phase 1), beadboard-0fi (Phase 2)\n\nTASK CONTRACT\n- Goal: Make swarm management accessible from everywhere — social cards, left panel epic rows, and TopBar — without navigating to a dedicated page. Currently AssignmentPanel logic is only reachable via graph assign mode toggle.\n- Success Criteria:\n - Blocked/unassigned social cards show an inline Assign affordance\n - Each epic row in LeftPanel has a Launch Swarm action\n - LaunchSwarmDialog is accessible from TopBar globally\n - Launching a swarm navigates to ?swarm=X so the new swarm appears in the right panel immediately\n - npm run typecheck \u0026\u0026 npm run lint \u0026\u0026 npm run test all pass\n- Scope:\n - useArchetypePicker hook extracted from AssignmentPanel\n - SocialCard assign affordance\n - LeftPanel epic row Launch Swarm button\n - TopBar LaunchSwarmDialog integration\n- Out of Scope:\n - Graph swarm subgraph overlay (Phase 4 dependency)\n - Agent presence on cards (Phase 4)\n - Modifying swarm/mission API endpoints\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-8ij","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Phase 3: Coordination Layer Integration","updated_at":"2026-03-02T01:25:18Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"useArchetypePicker hook created and integrated into AssignmentPanel","closed_at":"2026-03-02T01:15:33Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"dbeef17e3f0802b12e32585eb382ec30141457a3df76518ef5fe5c655d206ec7","created_at":"2026-02-28T22:05:45Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-8ij.1\n- Title: Extract useArchetypePicker hook from AssignmentPanel\n- Parent/Epic: beadboard-8ij\n- Dependencies (must be done first): none (first in phase)\n\nTASK CONTRACT\n- Goal: Extract the archetype fetching and assignment logic from AssignmentPanel into a reusable useArchetypePicker hook so it can be used in SocialCard, LeftPanel, and TopBar without duplicating code.\n- Success Criteria:\n - New hook at src/hooks/use-archetype-picker.ts exports useArchetypePicker\n - Hook encapsulates: fetching archetypes from /api/archetypes, selected archetype state, and handleAssign(issueId) function that calls /api/mission/assign\n - AssignmentPanel refactored to use the new hook (no behaviour change, existing graph assign mode still works)\n - npm run typecheck passes\n- Scope:\n - src/hooks/use-archetype-picker.ts (new file)\n - src/components/graph/assignment-panel.tsx (refactor to use hook)\n - Read AssignmentPanel fully before extracting to understand current API calls and state\n- Out of Scope:\n - Changing AssignmentPanel UI\n - Using the hook in SocialCard or TopBar yet (beadboard-8ij.2, beadboard-8ij.3)\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-8ij.1","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Hook extracted with archetype selection state and assignment logic. AssignmentPanel refactored to use hook. Typecheck passes with 0 errors.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Extract useArchetypePicker hook from AssignmentPanel","updated_at":"2026-03-02T01:15:33Z","waiters":"","wisp_type":"","work_type":""} @@ -414,6 +416,7 @@ {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"5c8e7b5409f4360b4af2e905de3260e8021c632ca8ee033d4eaeba6d0e393703","created_at":"2026-03-01T23:38:09Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Root cause: src/lib/watcher.ts snapshot diff does not detect changes to the comments array on a BeadIssue. When 'bd comments add' writes to .beads/issues.jsonl, the file watcher fires but the diff logic finds no changed fields and skips broadcasting. Task: (1) Read src/lib/watcher.ts and locate the snapshot diff / ProjectEventCoalescer logic. (2) Check if comments are included in the snapshotted fields. (3) Add comment-count (or comment-list hash) to the diff so any comment addition triggers an SSE event. (4) Verify SSE fires in tests or manual test with 'bd comments add'. Key files: src/lib/watcher.ts, src/lib/parser.ts (BeadIssue shape), tests/lib/ for existing watcher tests.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-91y","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Investigate snapshot diff — add comment-count detection","updated_at":"2026-03-01T23:38:09Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Completed: Added minimize/restore flow for all feed panels. Commit a0787f8.","closed_at":"2026-03-02T02:26:55Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"df74347b9ed272d87b1712fcd1bd0faa3cb0b19c28a8553bf095358aeccd225e","created_at":"2026-03-02T02:26:10Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Added minimize button (ChevronLeft) to both global Activity Feed and Epic Command Feed in contextual-right-panel.tsx. Minimize restores last state (taskId or assignMode) via lastTaskId/lastAssignMode state tracking in unified-shell.tsx. When TelemetryStrip maximize is clicked, it clears non-telemetry state to show full feed. Scope: contextual-right-panel.tsx, unified-shell.tsx. Success Criteria: Minimize button on all feed panels, restore previous panel state, TelemetryStrip maximize works.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-9bz","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Add minimize/restore flow for activity feed panels","updated_at":"2026-03-02T02:26:55Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"Templates can be applied to epics. BeadIssue gets templateId field. Template picker applies template to selected epic. Assignment panel shows template roster when epic selected.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Implemented epic-level template assignment. BeadIssue now has templateId field. Assignment panel shows Epic Template section when epic selected, with team roster. Template picker applies template to epic. Fixed all test files with new field.","closed_at":"2026-02-26T18:11:04Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"be154ecd5cc535438c43a5ca89428bcafe9fb8c308a3d7023d891b8e53504ac8","created_at":"2026-02-26T17:57:14Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: Add templateId to BeadIssue type, update template picker to apply to epics, show template info in assignment panel. Out of scope: AI auto-assignment logic, multi-agent execution.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-9ce","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Added templateId to BeadIssue type. Updated assignment-panel with epic template section. Template picker now applies template to selected epic. All typecheck, lint, and tests pass.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Epic-Level Template Assignment","updated_at":"2026-02-26T18:11:04Z","waiters":"","wisp_type":"","work_type":"mutex"} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Ratified canonical memory from user correction to preserve multi-agent scope discipline.","closed_at":"2026-03-03T03:39:04Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"494a948a05bbffa055ea23bc070e68b75cde9ab625f4e88a2c2b1918fffa9025","created_at":"2026-03-03T03:38:50Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Sessions where multiple agents are active and the user clarifies ownership boundaries.\\nOut of Scope: Single-agent sessions with no explicit ownership split.\\nRule: If the user states a bead is owned by another agent, immediately stop work on that bead and continue only on the user-assigned scope.\\nRationale: Prevents duplicate/conflicting work and keeps coordination clean.\\nFailure Mode: Parallel agents overwrite each other or create handoff confusion.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-9xb","is_template":0,"issue_type":"decision","last_activity":null,"metadata":"{}","mol_type":"","notes":"Created from live user correction on 2026-03-02: scope for this agent is beadboard-05a; beadboard-txj is assigned elsewhere. Applied immediately by redirecting NEXT_SESSION_PROMPT work back to 05a.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[MEMORY][AGENT-OPS][SOFT] Respect user-assigned scope in multi-agent sessions","updated_at":"2026-03-03T03:39:04Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"When clicking Archetypes or Templates buttons, show a popup modal with list of existing items. User can select to use/edit or create new. Modal should have same styling as inspector modals.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Implemented popup modal pickers for Archetypes and Templates. Clicking the buttons now opens a modal with list of existing items, Select/Edit/Create options.","closed_at":"2026-02-26T17:47:58Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"e02327e0255e03eafc4ef4c3c4568a8f7282dd9340e74259ca40f743fb69e3dc","created_at":"2026-02-26T17:39:10Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-adr","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Created ArchetypePicker and TemplatePicker modal components. Updated assignment-panel.tsx to use picker modals instead of inline lists. Typecheck and lint pass.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Archetype/Template Picker Modal","updated_at":"2026-02-26T17:47:58Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"6-8 built-in templates for common scenarios, each with optimized team composition, icons, colors, descriptions explaining when to use","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Created 9 intelligent preset templates for common development workflows with optimized team compositions.","closed_at":"2026-02-26T05:19:28Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"700f2faa8ddc32644cf35a934f7ba48230e1f7252261aa8b13b51c0368b43a64","created_at":"2026-02-26T05:13:43Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Create intelligently constructed preset templates based on the 6 archetypes for common development workflows","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-agp","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Created 9 intelligent preset templates: Feature Development, Bug Fix Squad, Code Review, Greenfield Project, Release Team, Investigation Team, Refactoring Team, Full Development Squad, Standard Application. Each has optimized team composition, workflow formula, color, and icon.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Intelligent Preset Templates","updated_at":"2026-02-26T05:19:28Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Ratified from user correction: project scope is user-controlled in BeadBoard UI; agents operate within assigned repo context only.","closed_at":"2026-03-02T21:30:09Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"0c4bf40cc983e1922077da30d35d81106e8bd3ed2f7ec5c905d3e1e640024413","created_at":"2026-03-02T21:29:46Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Agent execution workflows in non-BeadBoard repos where BeadBoard is used as orchestration control plane.\\nOut of Scope: User-driven UI project switching behavior implementation details.\\nRule: Agents must not select or mutate project scope; they operate within the current repository context they are assigned. Project scope selection is exclusively a user action in the BeadBoard UI.\\nRationale: Prevents scope drift and accidental cross-project coordination errors; keeps orchestration authority with the user.\\nFailure Mode: If agents attempt to change scope, updates may appear in the wrong project context, breaking visibility and trust.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-at4","is_template":0,"issue_type":"decision","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[MEMORY][AGENT][HARD] Agents do not select project scope; user controls scope in BeadBoard UI","updated_at":"2026-03-02T21:30:09Z","waiters":"","wisp_type":"","work_type":""} @@ -434,6 +437,7 @@ {"acceptance_criteria":"UnifiedShell has assignMode and selectedAssignIssue state; SmartDag receives onAssignModeChange and onSelectedIssueChange callbacks; When view===graph \u0026\u0026 assignMode, right panel renders AssignmentPanel; Otherwise right panel renders ContextualRightPanel; Remove if (view === 'swarm') block and SwarmWorkspace import; npm run typecheck, lint, test all pass","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"a8729938cc2c763ba0878950a5ccf14deb1fa8aee16ec8d951678f37bb3d29c5","created_at":"2026-02-24T01:37:47Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-cm8","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"tombstone","target":"","timeout_ns":0,"title":"Wire assign mode into UnifiedShell","updated_at":"2026-02-24T01:40:31Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-rnk","await_id":"","await_type":"","close_reason":"Empty labels array now treated as 'clear all labels' — validator and arg builder both fixed. Regression tests added.","closed_at":"2026-03-02T03:50:19Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"52133771334d393c335b6cedd890c5e47850304d66a19bbb52e74a38b6361180","created_at":"2026-03-02T03:45:37Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"handleRemoveTemplateFromEpic in assignment-panel.tsx sends labels:[] when stripping the only template: label. asOptionalLabels([]) returns undefined, which trips the update validator: 'At least one update field is required.' Fix: asOptionalLabels should return [] (not undefined) for an explicit empty array, and the validator should accept [] as a valid labels value (meaning clear all labels).","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-cs1","is_template":0,"issue_type":"bug","last_activity":null,"metadata":"{}","mol_type":"","notes":"Fixed in mutations.ts: asOptionalLabels([]) now returns [] instead of undefined; validator uses === undefined instead of \\!; pushOptionalLabels passes --set-labels '' to clear all labels. 2 new regression tests added. Typecheck clean, lint clean, 30/32 tests pass (2 pre-existing).","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Fix: removing last template label fails with empty labels array","updated_at":"2026-03-02T03:50:19Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"/graph page either redirects to /?view=graph OR renders SmartDag in standalone layout; No DependencyGraphPage duplication; npm run typecheck, lint, test all pass","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"b85654dbaf093546b77a7e4c318dbf6a1815c3226f8a7fb2e0e9246e27e58404","created_at":"2026-02-24T01:37:47Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-cvo","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":3,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"tombstone","target":"","timeout_ns":0,"title":"Update standalone /graph page","updated_at":"2026-02-24T01:40:31Z","waiters":"","wisp_type":"","work_type":"mutex"} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Ratified canonical UI memory for HideClosed invariants across source lists and selected-state invalidation.","closed_at":"2026-03-03T03:29:55Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"0b1cc3d8c982f8fa901ea8bd604b3c0c9aa45dcf4e901dc0e9c8e3c95e6496d6","created_at":"2026-03-03T03:29:05Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Any Hide Closed / visibility filtering behavior for epics or tasks across left panel, graph chip bars, and selected state holders.\\nOut of Scope: Independent status badges that do not affect visibility.\\nRule: A visibility filter is not complete unless it is applied to (1) source lists for every surface, and (2) current selection state invalidation paths.\\nRationale: Partial filter application causes closed entities to persist in one panel while hidden in another.\\nFailure Mode: User sees closed items despite Hide Closed enabled, losing trust in state consistency.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-cyk","is_template":0,"issue_type":"decision","last_activity":null,"metadata":"{}","mol_type":"","notes":"Canonicalized after hideClosed regression investigation. Provenance: beadboard-x1y, beadboard-4k8, beadboard-xz5. Linked to UI anchor beadboard-fld and reliability chain beadboard-om4.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[MEMORY][UI][HARD] HideClosed invariants must include selected-state and all epic surfaces","updated_at":"2026-03-03T03:29:55Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"all steps complete","closed_at":"2026-03-02T05:23:03Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"2e8944f16a861b696a7cfc212786c28b5adb840f6fbcb8c749e7f65f7a1ee2bb","created_at":"2026-02-28T22:35:01Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: (auto)\n- Title: Phase 5: Blocked Triage Modal\n- Parent/Epic: none (phase epic)\n- Dependencies (must be done first): beadboard-8ij (Phase 3 — useArchetypePicker hook), beadboard-x3l (Phase 4 — livenessMap in shell)\n\nTASK CONTRACT\n- Goal: Replace the TopBar blocked-items panel toggle with a purpose-built BlockedTriageModal that shows all blocked tasks with their blocker chain context and an inline archetype picker for immediate assignment without leaving the modal.\n- Success Criteria:\n - TopBar blocked button opens BlockedTriageModal (not a panel toggle)\n - Modal lists all blocked tasks with blocker chain context (buildBlockedByTree already exists)\n - Each blocked task has an inline ArchetypePicker to assign an agent immediately\n - Assigning an agent dismisses the picker for that task but keeps the modal open\n - npm run typecheck \u0026\u0026 npm run lint \u0026\u0026 npm run test all pass\n- Scope:\n - New BlockedTriageModal component\n - TopBar blocked button rerouted to open modal\n - useArchetypePicker hook reused from beadboard-8ij.1\n- Out of Scope:\n - Redesigning blockedOnly URL filter (already works from Phase 0)\n - Changing how blockers are computed\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-d2x","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Phase 5: Blocked Triage Modal","updated_at":"2026-03-02T05:23:03Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-zqt","await_id":"","await_type":"","close_reason":"BlockedTriageModal created with inline archetype picker, blocker chain display, uses deriveBlockedIds for accurate blocked computation","closed_at":"2026-03-02T05:23:10Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"6b010a323057be0a0775a6ffad94245171691c21cf59b0e0721c753032087b1b","created_at":"2026-02-28T22:39:47Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-d2x.1\n- Title: Build BlockedTriageModal with inline ArchetypePicker\n- Parent/Epic: beadboard-d2x\n- Dependencies (must be done first): beadboard-8ij.1 (useArchetypePicker hook)\n\nTASK CONTRACT\n- Goal: Build a modal component that lists all blocked tasks with their full blocker chain context and allows the operator to assign an archetype agent to each blocked task inline without dismissing the modal.\n- Success Criteria:\n - BlockedTriageModal renders a list of all issues where status === 'blocked'\n - Each row shows: task title, task ID, blocker chain (use buildBlockedByTree from src/lib if it exists, or derive from issue.dependencies)\n - Each row has an inline ArchetypePicker (useArchetypePicker hook from beadboard-8ij.1) that assigns and then collapses without closing the modal\n - Modal is scrollable if blocked list is long\n - Modal closes via Escape key or close button\n - npm run typecheck passes\n- Scope:\n - src/components/shared/blocked-triage-modal.tsx (new file)\n - Use shadcn Dialog primitive (already in components/ui/) for the modal shell\n - Use useArchetypePicker hook for each row's assignment action\n - Search src/lib/ for buildBlockedByTree or equivalent before writing blocker-chain logic from scratch\n- Out of Scope:\n - Wiring modal open/close to TopBar (beadboard-d2x.2)\n - Changing how issues are marked blocked\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-d2x.1","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"BlockedTriageModal created at src/components/shared/blocked-triage-modal.tsx. Uses deriveBlockedIds (exported in Task 1) and buildBlockedByTree for blocker chain. Inline archetype picker per row. 12 tests pass. Typecheck passes (pre-existing error in unrelated file). Lint passes.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Build BlockedTriageModal with inline ArchetypePicker","updated_at":"2026-03-02T05:23:10Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-zqt","await_id":"","await_type":"","close_reason":"TopBar blocked button now opens BlockedTriageModal instead of toggling URL","closed_at":"2026-03-02T05:23:02Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"93c0c0ce899172851d9d6422d3a21859f3df78de06e8c56c6326fe3d28441e81","created_at":"2026-02-28T22:39:47Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-d2x.2\n- Title: Reroute TopBar blocked button to open BlockedTriageModal\n- Parent/Epic: beadboard-d2x\n- Dependencies (must be done first): beadboard-d2x.1\n\nTASK CONTRACT\n- Goal: The TopBar 'Blocked Items' button currently toggles a URL param (blockedOnly). Replace this with a modal open trigger that opens BlockedTriageModal, keeping the blockedOnly filter wired from Phase 0 for the social feed but making the primary triage action the modal.\n- Success Criteria:\n - Clicking 'Blocked Items' in TopBar opens BlockedTriageModal\n - BlockedTriageModal receives issues and projectRoot from UnifiedShell\n - Existing blockedOnly URL toggle in TopBar is either removed or made secondary (decide when reading the component — do not break Phase 0 work)\n - npm run typecheck passes\n- Scope:\n - src/components/shared/top-bar.tsx — change blocked button handler\n - src/components/shared/unified-shell.tsx — add modal open state, pass to TopBar and BlockedTriageModal\n- Out of Scope:\n - Changing BlockedTriageModal internals (beadboard-d2x.1)\n - Phase 0 blockedOnly social feed filter\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-d2x.2","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"TopBar blocked button now opens BlockedTriageModal. UnifiedShell manages modal state. Typecheck passes (pre-existing errors), lint 0 errors, tests pass (2 pre-existing failures).","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Reroute TopBar blocked button to open BlockedTriageModal","updated_at":"2026-03-02T05:23:02Z","waiters":"","wisp_type":"","work_type":""} @@ -478,6 +482,9 @@ {"acceptance_criteria":"Canonical workflow memories are related to this anchor via bd dep relate.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"5da123dbdad6d8b1b981104fad944679e17fff64a82cbdeabe118169df3ed468","created_at":"2026-03-02T00:39:16Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Domain anchor for execution process constraints, verification gates, and delivery discipline.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-nq9","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"[MEMORY-ANCHOR] Workflow Protocol","updated_at":"2026-03-02T00:39:16Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"1ddf4ff3c245d72268df92729cede5e8f5b7a1e3da5922055bc3fb45f4c3c82d","created_at":"2026-03-02T23:06:18Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\\n- Parent: beadboard-c70 / beadboard-05a\\n\\nTASK CONTRACT\\n- Goal: Implement Linux/mac installer wrapper using canonical manifest and register bb/beadboard commands.\\n- Success Criteria:\\n - curl/bash compatible install.sh\\n - bb and beadboard commands available globally\\n- Scope: POSIX install path + PATH guidance\\n- Out of Scope: Windows-specific behavior\\n\\nVERIFICATION REQUIREMENTS\\n- npm run typecheck\\n- npm run lint\\n- npm run test","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-nrb","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Superseded by hierarchical execution tree under beadboard-05a.x","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"deferred","target":"","timeout_ns":0,"title":"Linux/mac wrapper: install.sh + global command shims","updated_at":"2026-03-02T23:16:16Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":"2026-02-27T01:33:44Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"78b8b49cd1224c2a66dd49a452abbe6f6fce3e8fd4347cc8c84e2322c5226003","created_at":"2026-02-21T20:52:19Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-o6s","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":3,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"Test Bead 2 - SSE Check","updated_at":"2026-02-27T01:33:44Z","waiters":"","wisp_type":"","work_type":"mutex"} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"5c1d64a23de79e709f69cbce27460445eff2223e1e6817cc38941fa0dfe4b0cd","created_at":"2026-03-03T03:37:36Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Session orchestrator agent handling greeting triage and session handoff updates","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-ojo","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Agent: codex-orchestrator","updated_at":"2026-03-03T03:37:36Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Ratified canonical reliability memory for stale-state parity triage order.","closed_at":"2026-03-03T03:29:55Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f5f44ccf4fa76a522e3ee8946c9fe363ff597dd61131dd05b9f1eab7eb6e6a39","created_at":"2026-03-03T03:29:10Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Realtime/stale-state incidents where UI contradicts expected issue state.\\nOut of Scope: Pure styling bugs with no state mismatch.\\nRule: Triage must confirm parity in this order: bd record, SQL row, API payload, UI render state, then SSE health.\\nRationale: Fixes made before parity checks target symptoms and miss the true mismatch layer.\\nFailure Mode: Repeated 'fixed but still visible' loops with no durable resolution.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-om4","is_template":0,"issue_type":"decision","last_activity":null,"metadata":"{}","mol_type":"","notes":"Canonicalized for stale-state triage discipline using parity sequence (bd-\u003eSQL-\u003eAPI-\u003eUI-\u003eSSE). Provenance: beadboard-x1y, beadboard-4k8, beadboard-cc8. Linked to reliability anchor beadboard-8st and workflow chain beadboard-x6f.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[MEMORY][RELIABILITY][HARD] For stale UI reports, verify bd-\u003eSQL-\u003eAPI-\u003eUI parity in order","updated_at":"2026-03-03T03:29:55Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-pxu","await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"7665d61d48ba8daa56041efde6ee829795af377795c97b4349df5a8a57423349","created_at":"2026-03-03T03:14:24Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Diagnose and fix frontend/Dolt data mismatch and stale sidebar state","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-pxu","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"in_progress","target":"","timeout_ns":0,"title":"Agent: codex-debug-orchestrator","updated_at":"2026-03-03T03:14:30Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Closed","closed_at":"2026-03-01T22:24:56Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"4f88d13043a1b0f19dfd4804d0b7b181b0317e0a2826b62354e2d45acb3b1a39","created_at":"2026-03-01T22:24:50Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"# Dolt Database Organization \u0026 PATH Troubleshooting\r\n\r\nOrganized scattered CLI `.txt` help texts into `beadboard/help/cli/` and added explicit workflow guides in `beadboard/help/workflows` for checking recently closed beads (`bd query`) and using the new `bd vc` dolt database features.\r\n\r\n**Issues Encountered \u0026 Resolved:**\r\n1. User accidentally ran `dolt init` in root rather than running commands in the actual DB directory (`.beads/dolt/beadboard/`). The empty root DB was pushed to DoltHub.\r\n2. We navigated correctly to `.beads/dolt/beadboard/` and ran `dolt push -f origin main` to forcefully overwrite the empty database on DoltHub with the actual issue history.\r\n3. The installed `bd` binary (`0.49.6`) was out of date. User ran the remote update script to `0.57.0`.\r\n4. The updated `bd` directory (`C:\\Users\\Zenchant\\AppData\\Local\\Programs\\bd`) was not on the system `PATH`. We programmatically updated the `$env:Path` in the registry and the active session.\r\n5. `bd 0.57.0` does not bundle the `dolt` binary anymore. The `bd ready` command was throwing a \"Dolt server unreachable... dolt is not installed\" error.\r\n6. We resolved this by downloading the official Dolt windows release archive, extracting `dolt.exe`, and placing it alongside `bd.exe` in the `bd` data directory. The `bd ready` command now successfully auto-starts the Dolt server.\r\n","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-qq2","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Dolt Migration and PATH Fixes","updated_at":"2026-03-01T22:24:56Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"6e21afe3b13a81e4b2fdcb00f41075db6302943631719fc545780ccfd4c19879","created_at":"2026-02-28T01:27:38Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-qxa","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"open","target":"","timeout_ns":0,"title":"test","updated_at":"2026-02-28T01:27:38Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"All Phase 1 children complete: ContextualRightPanel now branches on epicId, taskId, swarmId, with ActivityPanel fallback. URL context contract fully wired.","closed_at":"2026-02-28T22:57:11Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"3381cb41d2092a0a02a9fa46b21193aa6e439f14a948595273cb7efb5829e4f4","created_at":"2026-02-28T21:44:10Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Make the right panel adapt to full URL context, not just epicId. Current ContextualRightPanel only branches on epicId — all other selections (task, agent, swarm) fall through to the global ActivityPanel feed.\n\nRef: docs/plans/2026-02-28-ux-redesign-synthesis-prd.md §8 Phase 1\n\nURL context contract:\n No selection → ActivityPanel (global feed) ✓ done in Phase 0\n ?epic=X → SwarmCommandFeed for that epic ✓ already works\n ?task=X → Task thread + agent assignment controls\n ?agent=X → Agent liveness details + missions + current task\n ?swarm=X → MissionInspector (swarm topology + agent roster)\n\nAcceptance: Selecting a task shows task thread in right panel. Selecting a swarm shows swarm inspector. No selection shows global activity feed.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-r1i","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Phase 1: Contextual Right Panel","updated_at":"2026-02-28T22:57:11Z","waiters":"","wisp_type":"","work_type":""} @@ -487,15 +494,20 @@ {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Session ended","closed_at":"2026-03-02T06:35:25Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f3fd2e66f7e34039954ee1a1697e3af1d6a040797dc882261600a87e477a772f","created_at":"2026-03-02T03:38:27Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Main Claude Code session acting as orchestrator for Phase 4 (beadboard-x3l) and related epics. Responsible for planning, dispatching parallel agents, and integration verification.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-rnk","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Agent: claude-orchestrator","updated_at":"2026-03-02T06:35:25Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Recreating as proper children of Phase 0 epic with correct naming","closed_at":"2026-02-28T21:02:57Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"d17805f0481b485f2e4b35b96ad1ad0633bc21989a9db4622fb7270e3945aefd","created_at":"2026-02-28T20:59:48Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"The views array in LeftPanel and the tabs array in MobileNav both only have Social and Graph. Activity is a valid view but unreachable from navigation.\n\nFile 1: src/components/shared/left-panel.tsx\nLocation: views array (~line 188)\nChange:\n const views: Array\u003c{ id: ViewType; label: string }\u003e = [\n { id: 'social', label: 'Social' },\n { id: 'graph', label: 'Graph' },\n { id: 'activity', label: 'Activity' }, // add this\n ];\n\nFile 2: src/components/shared/mobile-nav.tsx\nLocation: tabs array (~line 6)\nChange: Add Activity tab and replace Unicode glyphs with Lucide icons:\n import { LayoutList, Share2, Activity } from 'lucide-react';\n const tabs = [\n { id: 'social', label: 'Social', icon: \u003cLayoutList className='h-5 w-5' /\u003e },\n { id: 'graph', label: 'Graph', icon: \u003cShare2 className='h-5 w-5' /\u003e },\n { id: 'activity', label: 'Activity', icon: \u003cActivity className='h-5 w-5' /\u003e },\n ];\nAlso add aria-label={tab.label} to each tab button, and update render to use {tab.icon} JSX (not string).\n\nCheck mobile-nav.tsx current icon rendering before changing - confirm the tab type and render pattern.\n\nAcceptance: Left panel and mobile nav both show three tabs (Social, Graph, Activity). Mobile nav icons are Lucide SVGs with aria-labels.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-t83","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"P0.3: Add Activity tab to LeftPanel and MobileNav","updated_at":"2026-02-28T21:02:57Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Fixed: filtered memory-anchor and brainstorm epics, added hideClosed check for epic status","closed_at":"2026-03-02T07:10:54Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"7d6965a299fa1a0f55665eb1203e1a1385b3f1b453676d145b50722be65c8c85","created_at":"2026-03-02T07:05:48Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"## Context\nEpics with zero child tasks are hidden in the left panel when hideClosed=true (the default).\n\n## Root Cause\nLine 327 in left-panel.tsx:\n\n\nThis hides ANY epic with matchedChildren=0 when filters are active. Since hideClosed defaults to true, this hides ALL epics that have no children (which is ALL epics currently since none have parent-child deps).\n\n## Fix\nChange condition to only hide if the epic HAS children but they're all filtered out:\n","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-tmj","is_template":0,"issue_type":"bug","last_activity":null,"metadata":"{}","mol_type":"","notes":"Fixed two issues in left-panel.tsx:\n1. Line 73: Filter out memory-anchor and brainstorm epics from epic list\n2. Line 327: Added check to hide closed/tombstone epics when hideClosed=true\n\nBefore: ALL epics were hidden because:\n- hideClosed defaults to true\n- No code checked epic status, only matchedChildren\n- All 0-child epics were hidden\n\nAfter:\n- Memory anchors (memory-anchor label) filtered out\n- Brainstorm epics (brainstorm label) filtered out \n- Closed/tombstone epics hidden when hideClosed=true\n- Epics with children only hidden when all children filtered\n\nVerification: npm run typecheck PASS, npm run lint PASS (warnings only), npm run test PASS (2 pre-existing failures)","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[BUG] Epics with no children hidden by hideClosed filter","updated_at":"2026-03-02T07:10:54Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"377b5d4104ed31da8b821ae918d2d8ad5683c0a0328cf5b3e4a5f8f0488fa778","created_at":"2026-03-03T03:35:22Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: Improve the Dependency Graph and Workflow Graph views to clearly indicate critical paths, differentiate between direct and indirect (transitive) blocks, and use status colors effectively. Out of scope: Other graph layouts. Success Criteria: Edges correctly reflect their dependency types visually.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-txj","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Epic: Enhanced Graph Edge Visualization","updated_at":"2026-03-03T03:35:22Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-8bs","await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"a563eaa2c8d8a9c0a243bb4c01a4cce5a8f7115faa877fb20eab12e2c7d041d2","created_at":"2026-03-03T03:36:09Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: Write a robust algorithm that processes DAG nodes to identify transitive (redundant) edges across paths.\\nOut of scope: UI rendering.\\nSuccess Criteria: Takes nodes and edges, returns map of edges indicating if they are transitive or direct.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-txj.1","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"in_progress","target":"","timeout_ns":0,"title":"Implement graph transitive reduction algorithm","updated_at":"2026-03-03T03:37:58Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"cc808e100e7509c2123748fe9dc1d30000e7bc86393c218de0b2101533a03553","created_at":"2026-03-03T03:36:41Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: Update ReactFlow Edge generation in workflow-graph.tsx, dependency-graph-page.tsx, and specialized-agent-dag.tsx.\\nOut of scope: Algorithm calculation.\\nSuccess Criteria: Critical/in-progress edges glow bright amber. Standard direct edges are blue/slate. Transitive edges are dimmed/dashed dark gray.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-txj.2","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Apply Status Colors and Transitive Context to Graph Edges","updated_at":"2026-03-03T03:36:41Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"aef161a5808c27085a8c50f34a4c620aab93c63c3a10b38ab193f3b6db9dcd92","created_at":"2026-03-03T03:36:42Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"Scope: When a node is clicked, highlight inbound/outbound blockers clearly, fading out the rest of the graph.\\nSuccess Criteria: The critical chain of a selected task is visually obvious.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-txj.3","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"Implement Graph Focus (Selection) Interactivity","updated_at":"2026-03-03T03:36:42Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"4dcd31b65efe95769e88dce31f997399a2273058aa1354b9c991484eb54aaac9","created_at":"2026-03-02T23:06:25Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\\n- Parent: beadboard-c70 / beadboard-05a\\n\\nTASK CONTRACT\\n- Goal: Add installer and launcher smoke tests for Windows/Linux/mac and wire CI matrix.\\n- Success Criteria:\\n - install smoke tests per OS\\n - reinstall/idempotency + failure-mode checks\\n - CI matrix jobs for installer smoke\\n- Scope: tests and workflow config\\n- Out of Scope: enterprise installer signing pipeline\\n\\nVERIFICATION REQUIREMENTS\\n- npm run typecheck\\n- npm run lint\\n- npm run test","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-u4i","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Superseded by hierarchical execution tree under beadboard-05a.x","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"deferred","target":"","timeout_ns":0,"title":"Installer test matrix + CI smoke coverage","updated_at":"2026-03-02T23:16:16Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"3763e0c47b3c3d6a4bd7e3ac46608778454e56437df140bdd9d09185198cd7d0","created_at":"2026-02-24T01:36:39Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-uui","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"## Goal\nMerge the duplicate graph implementations (?view=graph, ?view=swarm, and /graph page) into one enhanced graph view with two modes:\n- Analysis mode (default): Full dependency DAG with progressive disclosure\n- Assign mode (toggled): DAG highlights ready nodes, right panel shows assignment controls\n\n## Problem\nBeadBoard has two views (`?view=graph` and `?view=swarm`) that both render the same `WorkflowGraph` DAG component, creating duplication. The standalone `/graph` page (`DependencyGraphPage`) has rich dependency analysis features (hop depth, focus workspace, cycle detection, flow strip) that are stranded -- the shell's `?view=graph` is a bare 49-line wrapper (`SmartDag`) with none of them.\n\n## Success Criteria\n- ?view=graph shows enhanced DAG with all dependency analysis features\n- 'Assign' toggle enables task assignment workflow\n- ?view=swarm deprecated (falls back to default view)\n- Archetypes/Templates accessible from assign mode right panel\n- All implementation steps completed\n- npm run typecheck, lint, test all pass\n\n## Scope\n- SmartDag rewrite with progressive disclosure + tabs + assign mode\n- AssignmentPanel component for assign mode\n- useGraphAnalysis hook extraction\n- Swarm view removal from navigation\n- Delete deprecated swarm files\n\n## Out of Scope\n- Backend API changes (use existing /api/swarm/prep)\n- New archetypes/templates features\n- Mobile-specific layouts\n\n## Reference\nPRD: docs/prd/unified-graph-view.md","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"tombstone","target":"","timeout_ns":0,"title":"Unify Graph + Swarm into Single Enhanced Graph View","updated_at":"2026-02-24T01:40:52Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Cleaning up test bead","closed_at":"2026-02-21T21:16:00Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f09f1a0a8263bb776250a97189934101bb7629cc7ef72bab18cf0b8ce5bfbeef","created_at":"2026-02-21T20:59:15Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-uuo","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"SSE Test Bead","updated_at":"2026-02-21T21:16:00Z","waiters":"","wisp_type":"","work_type":"mutex"} -{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"","closed_at":null,"closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f5ec7d3256c5b4e25619cfb8a4343cd917ee591889a5d2b5433210ae83d2da8e","created_at":"2026-03-03T00:04:32Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"## Context\nEpics with zero child tasks are hidden in the left panel when hideClosed=true (the default).\n\n## Root Cause\nLine 327 in left-panel.tsx filters out epics with no matched children, but since all epics have 0 children currently, they get hidden.\n\n## Notes\nNEEDS DISCUSSION: Before implementing, discuss with user - the fix affects epic visibility logic.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x1y","is_template":0,"issue_type":"bug","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"open","target":"","timeout_ns":0,"title":"[BUG] Epics with no children hidden by hideClosed filter","updated_at":"2026-03-03T00:04:32Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-pxu","await_id":"","await_type":"","close_reason":"Fixed Hide Closed regression across left panel and graph epic chip surfaces; added selected-state invalidation and regression tests.","closed_at":"2026-03-03T03:28:11Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"f5ec7d3256c5b4e25619cfb8a4343cd917ee591889a5d2b5433210ae83d2da8e","created_at":"2026-03-03T00:04:32Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"## Context\nEpics with zero child tasks are hidden in the left panel when hideClosed=true (the default).\n\n## Root Cause\nLine 327 in left-panel.tsx filters out epics with no matched children, but since all epics have 0 children currently, they get hidden.\n\n## Notes\nNEEDS DISCUSSION: Before implementing, discuss with user - the fix affects epic visibility logic.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x1y","is_template":0,"issue_type":"bug","last_activity":null,"metadata":"{}","mol_type":"","notes":"Root cause and fixes for Hide Closed epic leakage:\\n\\nRoot causes:\\n1) Left panel logic exempted selected epics from hide checks, so a selected closed epic (bb-u6f.7) remained visible.\\n2) Dependency graph epic chip strip was fed unfiltered epics in one path, so Hide Closed did not consistently apply in that surface.\\n3) Runtime data freshness was vulnerable to stale session state when SSE degraded; initial refresh hardening was added.\\n\\nFixes shipped:\\n- left-panel.tsx: Hide Closed now hides closed/tombstone epics even when selected.\\n- unified-shell.tsx: when hideClosed=true, selected closed epic is auto-cleared.\\n- dependency-graph-page.tsx: EpicChipStrip and selection logic now use hide-closed filtered selectableEpics.\\n- page.tsx + use-beads-subscription.ts: force-dynamic + initial silent refresh to reduce stale SSR/session reads.\\n\\nVerification evidence:\\n- node --import tsx --test tests/components/shared/left-panel-filtering.test.ts =\u003e PASS\\n- node --import tsx --test tests/components/shared/unified-shell-hide-closed-contract.test.ts =\u003e PASS\\n- node --import tsx --test tests/components/graph/dependency-graph-hide-closed-contract.test.ts =\u003e PASS\\n- npm run typecheck =\u003e PASS\\n- npm run lint =\u003e PASS (warnings only)\\n- npm run test =\u003e FAIL (pre-existing unrelated graphTab expectation in tests/hooks/url-state-integration.test.ts)\\n\\nMemory review trigger: create canonical memories for cross-surface filter invariants and selected-state invalidation under filters.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[BUG] Epics with no children hidden by hideClosed filter","updated_at":"2026-03-03T03:28:11Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-rnk","await_id":"","await_type":"","close_reason":"Phase 4 Agent Presence complete. livenessMap lifted to UnifiedShell; agent avatars on SocialCard + graph nodes with liveness animation; LeftPanel footer shows live workspace stats. Typecheck clean, lint clean, 29/31 tests pass (2 pre-existing url-state failures).","closed_at":"2026-03-02T03:44:45Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"ed3b011f4a9bc3317203143aef02596ffb9c244366af3425122340b0fab4a7f0","created_at":"2026-02-28T22:29:51Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: (auto)\n- Title: Phase 4: Agent Presence\n- Parent/Epic: none (phase epic)\n- Dependencies (must be done first): beadboard-0fi (Phase 2 — actor identity in shell)\n\nTASK CONTRACT\n- Goal: Move livenessMap from the deprecated SessionsHeader up to UnifiedShell and surface live agent state on both Social cards and Graph nodes, so an operator can see which agents are active and what they are working on within 5 seconds of opening the app.\n- Success Criteria:\n - useSessionFeed called in UnifiedShell, livenessMap available at shell level\n - SocialCard shows agent avatar and liveness dot for the assigned agent\n - Graph nodes show agent avatar with pulse animation for stuck agents\n - LeftPanel footer replaced with live workspace stats (N agents active, M tasks in motion)\n - npm run typecheck \u0026\u0026 npm run lint \u0026\u0026 npm run test all pass\n- Scope:\n - UnifiedShell livenessMap lift (src/hooks/use-session-feed.ts already exists)\n - SocialCard agent presence UI\n - SmartDag/graph node agent presence UI\n - LeftPanel footer stats\n- Out of Scope:\n - Creating new API endpoints (liveness data already flows via SSE)\n - Agent detail right panel (covered in Phase 1)\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x3l","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"Orchestrator agent beadboard-rnk claimed this epic. x3l.1 closed, x3l.2/3/4 dispatched as parallel sub-agents.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Phase 4: Agent Presence","updated_at":"2026-03-02T03:44:45Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"useSessionFeed lifted to UnifiedShell; livenessMap+agentStats wired to SmartDag, SocialPage, LeftPanel props. Typecheck clean, tests 131/133 (2 pre-existing).","closed_at":"2026-03-02T03:33:45Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"283080de34f820239e92ca035c82d095dd40b22268d06b688e027340a23c73db","created_at":"2026-02-28T22:34:43Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-x3l.1\n- Title: Move useSessionFeed/livenessMap up to UnifiedShell\n- Parent/Epic: beadboard-x3l\n- Dependencies (must be done first): none (first in phase)\n\nTASK CONTRACT\n- Goal: useSessionFeed is currently only called in sessions-page.tsx (deprecated route). Call it in UnifiedShell and make livenessMap available as a prop to SocialCard and SmartDag.\n- Success Criteria:\n - useSessionFeed(projectRoot) called in UnifiedShell\n - livenessMap: Record\u003cstring, string\u003e available in UnifiedShell scope\n - livenessMap passed down to SocialPage and SmartDag as a prop (even if they don't use it yet — that is beadboard-x3l.2 and beadboard-x3l.3)\n - No duplicate SSE connections opened (verify useSessionFeed does not re-subscribe on re-render)\n - npm run typecheck passes\n- Scope:\n - src/components/shared/unified-shell.tsx — add useSessionFeed call\n - src/hooks/use-session-feed.ts — read to understand return shape before using\n - src/components/social/social-page.tsx — add livenessMap prop (pass through to cards later)\n - src/components/graph/smart-dag.tsx — add livenessMap prop (use in x3l.3)\n- Out of Scope:\n - Rendering agent avatars yet (beadboard-x3l.2, x3l.3)\n - Removing useSessionFeed from sessions-page.tsx (leave it, legacy route)\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x3l.1","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"DONE: Added useSessionFeed to UnifiedShell, livenessMap wired to SmartDag/SocialPage/LeftPanel. Typecheck clean. 131/133 tests pass (2 pre-existing failures in url-state-integration unrelated to this change).","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Move useSessionFeed/livenessMap up to UnifiedShell","updated_at":"2026-03-02T03:33:45Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"AgentAvatar rendered in SocialCard header when assignee in livenessMap. mapLiveness helper exported. SocialPage passes livenessMap to cards. 9 new tests in social-card-liveness.test.ts. Typecheck clean, no regressions.","closed_at":"2026-03-02T03:42:14Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"dbc5f5a54d52d9ca58c73cadc7587919775f3e00320de80bc19ef50c37e7f02c","created_at":"2026-02-28T22:34:43Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-x3l.2\n- Title: Render agent avatar and liveness dot on SocialCard\n- Parent/Epic: beadboard-x3l\n- Dependencies (must be done first): beadboard-x3l.1\n\nTASK CONTRACT\n- Goal: Each SocialCard for an assigned task should show the assigned agent's avatar and a liveness dot (active/stale/stuck) using livenessMap from the shell.\n- Success Criteria:\n - SocialCard receives livenessMap: Record\u003cstring, string\u003e prop\n - If issue.assignee exists and is in livenessMap, renders AgentAvatar component with liveness indicator\n - Liveness states: 'active' (green dot), 'stale' (amber dot), 'stuck' (red pulse)\n - Cards without an assignee show no avatar — no empty avatar placeholder\n - npm run typecheck passes\n- Scope:\n - src/components/social/social-card.tsx — add livenessMap prop and avatar render\n - src/components/social/social-page.tsx — thread livenessMap through to each SocialCard\n - Check if AgentAvatar component exists (grep src/ for AgentAvatar) and use it; if not, render a simple initials circle\n- Out of Scope:\n - Graph node agent presence (beadboard-x3l.3)\n - Inline assign affordance (Phase 3, beadboard-8ij.2)\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x3l.2","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Render agent avatar and liveness dot on SocialCard","updated_at":"2026-03-02T03:42:14Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"AgentAvatar overlay added to GraphNodeCard (bottom-right, sm size) with liveness→status mapping. WorkflowGraph and SmartDag wired. 10 new tests in graph-node-liveness.test.ts. Typecheck clean, no regressions.","closed_at":"2026-03-02T03:40:24Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"fac32fa6621d7e7c923dc4d894046adade762c4dd1924e7b697dea7dcbc410cb","created_at":"2026-02-28T22:34:43Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-x3l.3\n- Title: Render agent avatar on graph nodes with stuck-agent pulse\n- Parent/Epic: beadboard-x3l\n- Dependencies (must be done first): beadboard-x3l.1\n\nTASK CONTRACT\n- Goal: Active graph nodes should show the assigned agent's avatar. Nodes whose agent is in a 'stuck' liveness state should display a pulsing warning treatment so the operator can spot problems at a glance in the DAG view.\n- Success Criteria:\n - Graph node card renders a small agent avatar when issue.assignee is present in livenessMap\n - Stuck agents (livenessMap value === 'stuck') show a CSS pulse/ring animation on the node border\n - Non-assigned nodes are visually unchanged\n - npm run typecheck passes\n- Scope:\n - src/components/graph/smart-dag.tsx or the node card component it renders — add livenessMap prop and avatar/pulse render\n - Read SmartDag to find where individual node UI is rendered before editing\n- Out of Scope:\n - SocialCard presence (beadboard-x3l.2)\n - Graph layout or DAG structure changes\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x3l.3","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Render agent avatar on graph nodes with stuck-agent pulse","updated_at":"2026-03-02T03:40:24Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"LeftPanel footer replaced with WorkspaceStatsFooter showing live agent count + in-motion tasks from livenessMap/agentStats. Hardcoded Alex Chen removed. Typecheck clean, 10/10 left-panel tests pass.","closed_at":"2026-03-02T03:38:44Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"24edd6f97db15701b4c156021112e907eda6bb9b8370a7c0b24efb571f351a50","created_at":"2026-02-28T22:34:43Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"TASK CONTEXT\n- Bead ID: beadboard-x3l.4\n- Title: Replace LeftPanel footer with live workspace stats\n- Parent/Epic: beadboard-x3l\n- Dependencies (must be done first): beadboard-x3l.1\n\nTASK CONTRACT\n- Goal: The LeftPanel footer currently shows a hardcoded identity string. Replace it with live stats: number of active agents and number of tasks currently in motion, derived from livenessMap and the live issues array.\n- Success Criteria:\n - Footer shows 'N agents active, M tasks in motion' with real counts\n - Counts update reactively when SSE pushes changes\n - No hardcoded identity text remains in LeftPanel footer\n - npm run typecheck passes\n- Scope:\n - src/components/shared/left-panel.tsx — update footer section\n - LeftPanel already receives issues prop — use it for task count\n - livenessMap passed from UnifiedShell (add to LeftPanelProps if not present)\n- Out of Scope:\n - TopBar identity input (beadboard-0fi.1)\n - Changing LeftPanel navigation or epic tree\n\nIMPLEMENTATION CONSTRAINTS\n- Preserve existing backend/API contracts unless explicitly stated otherwise.\n- Reuse shared components and logic; avoid one-off forks.\n- Keep changes targeted and minimal for this bead.\n\nVERIFICATION REQUIREMENTS\n- Required commands:\n - npm run typecheck\n - npm run lint\n - npm run test\n- Report any remaining risks and follow-up beads explicitly.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x3l.4","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":2,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Replace LeftPanel footer with live workspace stats","updated_at":"2026-03-02T03:38:44Z","waiters":"","wisp_type":"","work_type":""} +{"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Ratified canonical workflow memory requiring explicit in-UI user confirmation for persistent regressions.","closed_at":"2026-03-03T03:29:55Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"70200b7495ee80abd1c5d696cbc393c7b0ec2b972bd0cb638d5e7141b8279cea","created_at":"2026-03-03T03:29:17Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Bugs reported by user as still reproducing after an attempted fix.\\nOut of Scope: Backend-only changes with no user-visible behavior.\\nRule: Add an explicit confirmation checkpoint against the user-observed surface before closing or announcing completion.\\nRationale: Green tests do not guarantee resolution in the user’s actual runtime context.\\nFailure Mode: Assistant repeatedly claims fixes while user still sees the bug.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-x6f","is_template":0,"issue_type":"decision","last_activity":null,"metadata":"{}","mol_type":"","notes":"Canonicalized from user-correction loop: do not mark user-visible bug resolved without explicit in-UI confirmation checkpoint. Provenance: beadboard-x1y, beadboard-4k8. Linked to workflow anchor beadboard-nq9.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"[MEMORY][WORKFLOW][SOFT] Persisting user-reported regressions require explicit in-UI confirmation checkpoint","updated_at":"2026-03-03T03:29:55Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"all steps complete","closed_at":"2026-03-02T06:11:41Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"6cd918a6dbca1854922993c92bc5f72d714552caf1c37c060a05be31ce8f69b1","created_at":"2026-02-23T04:45:06Z","created_by":"zenchantlive","crystallizes":0,"defer_until":null,"description":"","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-xte","is_template":0,"issue_type":"epic","last_activity":null,"metadata":"{}","mol_type":"","notes":"Progress: Added child task for Fit to Screen control implementation in graph canvas.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":0,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":".","source_system":"","spec_id":null,"status":"closed","target":"","timeout_ns":0,"title":"DAG Views UX Overhaul (Macro/Micro Contexts)","updated_at":"2026-03-02T06:11:41Z","waiters":"","wisp_type":"","work_type":"mutex"} {"acceptance_criteria":"Graph view shows a Fit to screen control; clicking it re-fits the DAG within viewport; typecheck and lint pass.","actor":"","agent_state":"","assignee":null,"await_id":"","await_type":"","close_reason":"Added visible Fit to screen control in DAG graph and wired it to ReactFlow fitView for user-triggered viewport re-fit.","closed_at":"2026-03-02T06:11:40Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"a260ec34da308a65893cfa1b44a72656c23f8feedbd6372342f02a612d6c6614","created_at":"2026-03-02T06:11:12Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Add a visible Fit to Screen button in the DAG graph view that re-runs ReactFlow fitView after users pan/zoom. Out of scope: layout density controls or node size sliders.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-xte.1","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Implemented in src/components/shared/workflow-graph.tsx: added Fit to screen button in top-right control area; wired to handleFitToScreen() using reactflow fitView().\nVerification: npm run typecheck =\u003e PASS. npm run lint =\u003e PASS (19 existing warnings, 0 errors). Additional regression check: node --import tsx --test tests/api/bead-comments-item-route.test.ts =\u003e PASS (9 tests). Memory review: no new reusable memory.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Add Fit to Screen control to DAG graph canvas","updated_at":"2026-03-02T06:11:40Z","waiters":"","wisp_type":"","work_type":""} {"acceptance_criteria":"","actor":"","agent_state":"","assignee":"beadboard-5jf","await_id":"","await_type":"","close_reason":"Implemented recursive epic descendant inclusion and optional hierarchy (parent/subtask) edges in DAG with tests and verification evidence recorded.","closed_at":"2026-03-02T23:37:01Z","closed_by_session":"","compacted_at":null,"compacted_at_commit":null,"compaction_level":0,"content_hash":"e8d775e3d38b1c1e5da124d83f4c85fc8b31b3dbd4834aa02c592be7c0746c2d","created_at":"2026-03-02T23:31:37Z","created_by":"ZenchantLive","crystallizes":0,"defer_until":null,"description":"Scope: Update graph issue selection for epic context to include all descendants, not only direct children; add hierarchy edge toggle for parent/subtask links in DAG.\\nOut of Scope: social view behavior changes and non-DAG cards.\\nSuccess Criteria: Nested subtasks appear in DAG; parent/subtask links are optional via toggle; tests cover new behavior.","design":"","due_at":null,"ephemeral":0,"estimated_minutes":null,"event_kind":"","external_ref":null,"hook_bead":"","id":"beadboard-xz5","is_template":0,"issue_type":"task","last_activity":null,"metadata":"{}","mol_type":"","notes":"Implemented DAG subtask visibility and hierarchy links.\\n\\nChanges:\\n- Added src/lib/epic-graph.ts with collectEpicDescendantIds() and buildWorkflowEdges().\\n- Updated src/components/graph/smart-dag.tsx to include recursive epic descendants (not just direct children).\\n- Updated src/components/shared/workflow-graph.tsx to support hierarchy edge toggle (default on) and render SUBTASK edges alongside BLOCKS edges.\\n- Added tests/lib/epic-graph.test.ts and registered it in package.json test script.\\n\\nTDD evidence:\\n1) node --import tsx --test tests/lib/epic-graph.test.ts\\n - initial run failed (MODULE_NOT_FOUND: ../../src/lib/epic-graph)\\n2) node --import tsx --test tests/lib/epic-graph.test.ts\\n - pass: 2 tests, 0 failed\\n\\nVerification gates:\\n- npm run typecheck: PASS\\n- npm run lint: PASS (warnings only, 0 errors)\\n- npm run test: FAIL (pre-existing/unrelated failures in tests/hooks/url-state-integration.test.ts)\\n - /?view=graph - graph view default expected flow got overview\\n - /?view=graph\u0026graphTab=invalid expected flow got overview\\n\\nMemory review: no new reusable memory.","original_size":null,"owner":"jordanlive121@gmail.com","payload":"","pinned":0,"priority":1,"quality_score":null,"rig":"","role_bead":"","role_type":"","sender":"","source_repo":"","source_system":"","spec_id":"","status":"closed","target":"","timeout_ns":0,"title":"Implement epic descendant inclusion + hierarchy edge toggle in DAG","updated_at":"2026-03-02T23:37:01Z","waiters":"","wisp_type":"","work_type":""} diff --git a/.beads/backup/labels.jsonl b/.beads/backup/labels.jsonl index 3b1e918..b6ecc73 100644 --- a/.beads/backup/labels.jsonl +++ b/.beads/backup/labels.jsonl @@ -671,6 +671,10 @@ {"issue_id":"beadboard-2fo","label":"runtime"} {"issue_id":"beadboard-2qy","label":"gt:agent"} {"issue_id":"beadboard-2qy","label":"role:ui"} +{"issue_id":"beadboard-4k8","label":"frontend"} +{"issue_id":"beadboard-4k8","label":"incident"} +{"issue_id":"beadboard-4k8","label":"p0"} +{"issue_id":"beadboard-4k8","label":"reliability"} {"issue_id":"beadboard-4vr","label":"brainstorm"} {"issue_id":"beadboard-4vr","label":"dolt"} {"issue_id":"beadboard-4vr","label":"memory"} @@ -703,11 +707,17 @@ {"issue_id":"beadboard-76p","label":"memory-anchor"} {"issue_id":"beadboard-76p","label":"memory-arch"} {"issue_id":"beadboard-7r7","label":"agent:coder"} +{"issue_id":"beadboard-8bs","label":"gt:agent"} +{"issue_id":"beadboard-8bs","label":"role:orchestrator"} {"issue_id":"beadboard-8hq","label":"gt:agent"} {"issue_id":"beadboard-8hq","label":"role:orchestrator"} {"issue_id":"beadboard-8st","label":"memory"} {"issue_id":"beadboard-8st","label":"memory-anchor"} {"issue_id":"beadboard-8st","label":"memory-reliability"} +{"issue_id":"beadboard-9xb","label":"mem-canonical"} +{"issue_id":"beadboard-9xb","label":"mem-soft"} +{"issue_id":"beadboard-9xb","label":"memory"} +{"issue_id":"beadboard-9xb","label":"memory-agent-ops"} {"issue_id":"beadboard-at4","label":"mem-canonical"} {"issue_id":"beadboard-at4","label":"mem-hard"} {"issue_id":"beadboard-at4","label":"memory"} @@ -742,6 +752,10 @@ {"issue_id":"beadboard-c70","label":"documentation"} {"issue_id":"beadboard-c70","label":"installation"} {"issue_id":"beadboard-c70","label":"skills"} +{"issue_id":"beadboard-cyk","label":"mem-canonical"} +{"issue_id":"beadboard-cyk","label":"mem-hard"} +{"issue_id":"beadboard-cyk","label":"memory"} +{"issue_id":"beadboard-cyk","label":"memory-ui"} {"issue_id":"beadboard-d2x","label":"--json"} {"issue_id":"beadboard-dc0","label":"mem-canonical"} {"issue_id":"beadboard-dc0","label":"mem-soft"} @@ -807,16 +821,41 @@ {"issue_id":"beadboard-nrb","label":"installation"} {"issue_id":"beadboard-nrb","label":"linux"} {"issue_id":"beadboard-nrb","label":"macos"} +{"issue_id":"beadboard-ojo","label":"gt:agent"} +{"issue_id":"beadboard-ojo","label":"role:orchestrator"} +{"issue_id":"beadboard-om4","label":"mem-canonical"} +{"issue_id":"beadboard-om4","label":"mem-hard"} +{"issue_id":"beadboard-om4","label":"memory"} +{"issue_id":"beadboard-om4","label":"memory-reliability"} +{"issue_id":"beadboard-pxu","label":"gt:agent"} +{"issue_id":"beadboard-pxu","label":"role:orchestrator"} {"issue_id":"beadboard-rnk","label":"gt:agent"} {"issue_id":"beadboard-rnk","label":"role:orchestrator"} {"issue_id":"beadboard-tmj","label":"bug"} {"issue_id":"beadboard-tmj","label":"frontend"} +{"issue_id":"beadboard-txj","label":"graph"} +{"issue_id":"beadboard-txj","label":"ui"} +{"issue_id":"beadboard-txj","label":"visualization"} +{"issue_id":"beadboard-txj.1","label":"algorithm"} +{"issue_id":"beadboard-txj.1","label":"graph"} +{"issue_id":"beadboard-txj.1","label":"ui"} +{"issue_id":"beadboard-txj.1","label":"visualization"} +{"issue_id":"beadboard-txj.2","label":"graph"} +{"issue_id":"beadboard-txj.2","label":"ui"} +{"issue_id":"beadboard-txj.2","label":"visualization"} +{"issue_id":"beadboard-txj.3","label":"graph"} +{"issue_id":"beadboard-txj.3","label":"ui"} +{"issue_id":"beadboard-txj.3","label":"visualization"} {"issue_id":"beadboard-u4i","label":"ci"} {"issue_id":"beadboard-u4i","label":"installation"} {"issue_id":"beadboard-u4i","label":"tests"} {"issue_id":"beadboard-x1y","label":"bug"} {"issue_id":"beadboard-x1y","label":"frontend"} {"issue_id":"beadboard-x3l","label":"template:release"} +{"issue_id":"beadboard-x6f","label":"mem-canonical"} +{"issue_id":"beadboard-x6f","label":"mem-soft"} +{"issue_id":"beadboard-x6f","label":"memory"} +{"issue_id":"beadboard-x6f","label":"memory-workflow"} {"issue_id":"beadboard-xz5","label":"graph"} {"issue_id":"beadboard-xz5","label":"ui"} {"issue_id":"beadboard-yad","label":"agent:coder"} diff --git a/docs/adr/2026-03-03-global-installer-contract-and-manifest.md b/docs/adr/2026-03-03-global-installer-contract-and-manifest.md new file mode 100644 index 0000000..393cdec --- /dev/null +++ b/docs/adr/2026-03-03-global-installer-contract-and-manifest.md @@ -0,0 +1,89 @@ +# ADR: Global Installer Contract and Canonical Manifest (`installer.v1`) + +- Date: 2026-03-03 +- Status: Accepted +- Scope: `beadboard-05a.1.1` + `beadboard-05a.1.2` + +## Context + +The `beadboard-05a` epic requires one installer contract shared by all platform wrappers and launcher behavior. +Without a canonical schema, wrappers can drift and the driver skill can emit inconsistent remediation guidance. + +Constraints: + +- `bd` remains source of truth for work state. +- Driver skill must remain detect/remediate only, with no install side effects. +- Windows and POSIX wrappers must map to one shared semantic model. + +## Decision + +Adopt `installer.v1` as the canonical manifest contract and validate it centrally in code. + +Contract requirements: + +1. **Versioned schema** +- `version` must be exactly `installer.v1`. + +2. **Distribution contract** +- `distribution.packageName` declares the global package identity. +- `distribution.shimNames` declares required command shims (`bb`, `beadboard`). + +3. **Wrapper contract** +- `wrappers.windows.script` and `wrappers.posix.script` are required and explicit. + +4. **Runtime command contract** +- `runtime.start`, `runtime.open`, and `runtime.status` are required. + +5. **Driver boundary contract** +- `driver.remediationMode` must be `detect_only`. +- `driver.installSideEffects` must be `false`. + +## Implementation + +Added canonical validator and type contract: + +- `src/lib/install-manifest.ts` +- `tests/lib/install-manifest.test.ts` + +Exported artifacts: + +- `INSTALLER_SCHEMA_VERSION = "installer.v1"` +- `validateInstallerManifest(input)` +- `canonicalInstallerManifest` for shared reference in downstream wrapper and launcher tasks + +## Verification Evidence + +TDD red: + +- `node --import tsx --test tests/lib/install-manifest.test.ts` + failed with `Cannot find module '../../src/lib/install-manifest'` + +TDD green: + +- `node --import tsx --test tests/lib/install-manifest.test.ts` + passed (`4/4`) + +Suite registration: + +- `package.json` test script now explicitly includes `tests/lib/install-manifest.test.ts` + +## Consequences + +Positive: + +- Platform wrappers now have one schema target. +- Launcher semantics are pre-declared before wrapper implementation. +- Driver detection-only boundary is encoded in validator rules. + +Tradeoff: + +- Wrapper and CI tasks (`05a.2+`) must now conform to `installer.v1`; they cannot introduce ad hoc fields. + +## Runtime Manager Alignment + +This ADR is paired with `docs/adr/2026-03-03-runtime-manager-global-install.md`. + +- Canonical runtime home is `~/.beadboard/runtime/`. +- Global install (`npm i -g beadboard`) is the primary operator path. +- Wrappers remain supported as fallback bootstraps. +- Legacy repo-bound shim migration is mandatory for backward compatibility. diff --git a/docs/adr/2026-03-03-runtime-manager-global-install.md b/docs/adr/2026-03-03-runtime-manager-global-install.md new file mode 100644 index 0000000..064b4de --- /dev/null +++ b/docs/adr/2026-03-03-runtime-manager-global-install.md @@ -0,0 +1,49 @@ +# ADR: Runtime Manager for Global Install + +- Date: 2026-03-03 +- Status: Accepted +- Scope: Global installer runtime execution model + +## Context + +The installer currently supports wrappers and launcher behavior, but runtime location and shim targets must be stable across updates and usable from any working directory. + +## Decision + +Adopt a runtime-manager layout rooted at `~/.beadboard/runtime/` with stable command shims in `~/.beadboard/bin`. + +Primary install flow is npm global: + +- `npm i -g beadboard` + +Fallback install flow remains script bootstrap wrappers when npm-global is unavailable. + +All shims resolve a runtime target from runtime metadata first, then execute launcher logic from the selected runtime root. + +## Runtime Layout + +- Runtime root: `~/.beadboard/runtime/` +- Stable metadata: `~/.beadboard/runtime/current.json` +- Stable shim directory: `~/.beadboard/bin` +- Required shims: `bb`, `beadboard` + +## Update / Uninstall Model + +- Update writes a new versioned runtime directory and atomically switches `current.json`. +- Uninstall removes runtime directories and shims after explicit confirmation. +- Failed updates do not replace active metadata; previous runtime remains executable. + +## Compatibility and Migration + +Legacy repo-bound shim migration is required: + +- Detect legacy shims that hardcode repository-relative launcher paths. +- Rewrite shims to runtime-managed targets atomically. +- Preserve user-facing command names and shell compatibility. + +## Failure Modes and Rollback + +- Missing runtime metadata: launcher reports actionable remediation and install mode. +- Corrupt runtime target: launcher falls back to previous known-good metadata when present. +- Partial install: installer leaves active runtime unchanged and exits non-zero. + diff --git a/tests/docs/runtime-manager-adr-contract.test.ts b/tests/docs/runtime-manager-adr-contract.test.ts new file mode 100644 index 0000000..a502638 --- /dev/null +++ b/tests/docs/runtime-manager-adr-contract.test.ts @@ -0,0 +1,11 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs/promises'; +import path from 'node:path'; + +test('runtime manager ADR exists and declares runtime home strategy', async () => { + const raw = await fs.readFile(path.resolve('docs/adr/2026-03-03-runtime-manager-global-install.md'), 'utf8'); + assert.match(raw, /~\/\.beadboard\/runtime/i); + assert.match(raw, /npm i -g beadboard/i); + assert.match(raw, /legacy repo-bound shim migration/i); +});