TASK CONTEXT
- Bead ID: beadboard-v5a.8
- Title: create remediation epic and bead graph
- Parent/Epic: beadboard-v5a
- Dependencies (must be done first): beadboard-v5a.7

TASK CONTRACT
- Goal: Convert validated findings into a concrete remediation epic with correctly linked beads and execution order.
- Success Criteria:
  - New remediation epic + child beads created using bead prompting protocol.\n  - Dependencies model execution constraints (not visual order).\n  - Each remediation bead has measurable success criteria.
- Scope:
  - Bead creation, prompt-structured descriptions, dependency wiring.\n  - Prioritization by severity and blast radius.
- Out of Scope:
  - Performing all remediation implementation work.\n  - Closing audit with final go/no-go narrative (handled in v5a.9).

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Required artifacts:
  - Evidence notes attached to this bead with exact commands and outputs.
  - Any requested screenshots/reports committed under docs/reviews.
- Report any remaining risks and follow-up beads explicitly.

create remediation epic and bead graph


TASK CONTEXT
- Bead ID: beadboard-v5a.9
- Title: go/no-go verdict and next-session handoff
- Parent/Epic: beadboard-v5a
- Dependencies (must be done first): beadboard-v5a.8

TASK CONTRACT
- Goal: Publish final readiness verdict and update NEXT_SESSION_PROMPT.md with exact next actions.
- Success Criteria:
  - Explicit verdict: ship-ready / conditionally-ready / not-ready with rationale.\n  - NEXT_SESSION_PROMPT.md updated to match remediation graph and priorities.\n  - Residual risks and owner expectations clearly documented.
- Scope:
  - Final decision write-up and session handoff update.\n  - Ensure handoff references audit report and remediation epic ids.
- Out of Scope:
  - Starting remediation implementation.\n  - Re-litigating already accepted findings.

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Required artifacts:
  - Evidence notes attached to this bead with exact commands and outputs.
  - Any requested screenshots/reports committed under docs/reviews.
- Report any remaining risks and follow-up beads explicitly.


Scope: Extracting tightly-coupled files into bounded contexts while maintaining existing import paths.\nOut of Scope: Changing public APIs or adding new features.\nRule: When refactoring into bounded contexts, keep original files as re-export proxies. This allows incremental migration without breaking existing importers.\nRationale: Prevents cascading updates across codebase. Only 6 files imported from agent-*.ts, so backward compatibility was manageable.\nFailure Mode: Breaking existing imports forces simultaneous updates across codebase, risking test failures and scope creep.

[MEMORY][ARCH][HARD] Bounded context extraction preserves backward compatibility


Remove 4 install-system files found in PR 15 that violate the PR description 'install stack excluded'.

Files to remove from feat/themev2-clean branch:
1. install/manifest.json - NEW installer manifest
2. src/lib/install-manifest.ts - NEW installer schema (103 lines)
3. tests/lib/install-manifest.test.ts - NEW installer tests
4. docs/plans/2026-03-03-global-install-runtime-manager.md - NEW install-system plan

After cleanup, PR 15 will comply with its description: 'Complete Theme v2 UI/graph/session/social work EXCLUDING installer components'.

ACTION: Use `git rm` to remove these files from feat/themev2-clean branch, then commit.

CANNOT COMPLETE: feat/themev2-clean branch does not exist locally.

Issue: PR 15 verification checked the remote branch feat/themev2-clean, but this branch is not available locally. Cannot remove install-system files without having the branch checked out.

Findings:
- Current branch: master
- feat/themev2-clean branch: NOT FOUND locally
- Install-system files to remove: Do not exist on master

Resolution: This cleanup must be done by:
1. Checking out feat/themev2-clean branch: git checkout feat/themev2-clean
2. Then running: git rm install/manifest.json src/lib/install-manifest.ts tests/lib/install-manifest.test.ts docs/plans/2026-03-03-global-install-runtime-manager.md
3. Committing: git commit -m 'Remove install-system code (violates PR 15 description)'

This is a MANUAL STEP required before PR 15 can be merged.

Remove install-system code from PR 15


Completed global install runtime-manager rollout plan phases 0-8 with TDD evidence, runtime metadata/shim migration, launcher runtime status, CLI doctor/update/uninstall, driver remediation alignment, and CI/docs updates.

Scope: Implement npm-global-first runtime manager with migration from repo-path shims. Out of Scope: unrelated UI/test stabilization. Success Criteria: Tasks 0-8 from docs/plans/2026-03-03-global-install-runtime-manager.md implemented with verification evidence.

Global installer runtime manager implementation


Removes runtime artifacts from git tracking

Agent: bb-runtime-cleanup


Removes install-system code from PR 15

Agent: bb-pr15-cleanup


Scope:
- beadboard launcher startup UX and docs for Dolt readiness
Out of Scope:
- changing bd storage backend internals
Success Criteria:
- beadboard start prints clear guidance about bd dolt start and project folder
- beadboard start --dolt starts Dolt (if available) then starts BeadBoard dev server
- README launcher command docs include both flows

[EPIC] Start Command Dolt Bootstrapping


Added start guidance and --dolt combined startup flow with tests/docs

Scope:
- install/beadboard.mjs start command behavior and messaging
- launcher tests for start guidance and --dolt behavior
- README launcher docs
Out of Scope:
- modifying bd tool behavior
Success Criteria:
- beadboard start prints guidance to run bd dolt start in project folder and points to beadboard start --dolt
- beadboard start --dolt attempts bd dolt start in CWD before app start
- tests cover both behaviors
- README includes this guidance

Implemented startup UX + Dolt bootstrap integration:
- Added launcher flag parsing for --dolt
- beadboard start now prints explicit guidance: run `bd dolt start` in project folder, or use `beadboard start --dolt`
- Implemented `start --dolt` to invoke `bd dolt start` in current working directory before BeadBoard startup
- Added BB_START_NOOP path for deterministic launcher tests
- Updated CLI help text to show `start [--dolt]`
- Updated README launcher docs with startup note and one-command flow

TDD evidence:
- RED: node --import tsx --test tests/scripts/beadboard-launcher.test.ts (hung/cancelled before implementation due real start path)
- GREEN: node --import tsx --test tests/scripts/beadboard-launcher.test.ts (pass)
- GREEN: node --import tsx --test tests/cli/beadboard-help-output.test.ts (pass)

Verification evidence (2026-03-03):
- npm run typecheck (pass)
- npm run lint (pass, 0 errors / 21 warnings in unrelated files)
- npm run test (pass)

Memory review: no new reusable memory.

Add start guidance + --dolt path


Fixed Hide Closed regression across left panel and graph epic chip surfaces; added selected-state invalidation and regression tests.

## Context
Epics with zero child tasks are hidden in the left panel when hideClosed=true (the default).

## Root Cause
Line 327 in left-panel.tsx filters out epics with no matched children, but since all epics have 0 children currently, they get hidden.

## Notes
NEEDS DISCUSSION: Before implementing, discuss with user - the fix affects epic visibility logic.

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 => PASS\n- node --import tsx --test tests/components/shared/unified-shell-hide-closed-contract.test.ts => PASS\n- node --import tsx --test tests/components/graph/dependency-graph-hide-closed-contract.test.ts => PASS\n- npm run typecheck => PASS\n- npm run lint => PASS (warnings only)\n- npm run test => 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.

[BUG] Epics with no children hidden by hideClosed filter


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).

TASK CONTEXT
- Bead ID: (auto)
- Title: Phase 4: Agent Presence
- Parent/Epic: none (phase epic)
- Dependencies (must be done first): beadboard-0fi (Phase 2 — actor identity in shell)

TASK CONTRACT
- 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.
- Success Criteria:
  - useSessionFeed called in UnifiedShell, livenessMap available at shell level
  - SocialCard shows agent avatar and liveness dot for the assigned agent
  - Graph nodes show agent avatar with pulse animation for stuck agents
  - LeftPanel footer replaced with live workspace stats (N agents active, M tasks in motion)
  - npm run typecheck && npm run lint && npm run test all pass
- Scope:
  - UnifiedShell livenessMap lift (src/hooks/use-session-feed.ts already exists)
  - SocialCard agent presence UI
  - SmartDag/graph node agent presence UI
  - LeftPanel footer stats
- Out of Scope:
  - Creating new API endpoints (liveness data already flows via SSE)
  - Agent detail right panel (covered in Phase 1)

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Report any remaining risks and follow-up beads explicitly.

Orchestrator agent beadboard-rnk claimed this epic. x3l.1 closed, x3l.2/3/4 dispatched as parallel sub-agents.

Phase 4: Agent Presence


useSessionFeed lifted to UnifiedShell; livenessMap+agentStats wired to SmartDag, SocialPage, LeftPanel props. Typecheck clean, tests 131/133 (2 pre-existing).

TASK CONTEXT
- Bead ID: beadboard-x3l.1
- Title: Move useSessionFeed/livenessMap up to UnifiedShell
- Parent/Epic: beadboard-x3l
- Dependencies (must be done first): none (first in phase)

TASK CONTRACT
- 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.
- Success Criteria:
  - useSessionFeed(projectRoot) called in UnifiedShell
  - livenessMap: Record<string, string> available in UnifiedShell scope
  - 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)
  - No duplicate SSE connections opened (verify useSessionFeed does not re-subscribe on re-render)
  - npm run typecheck passes
- Scope:
  - src/components/shared/unified-shell.tsx — add useSessionFeed call
  - src/hooks/use-session-feed.ts — read to understand return shape before using
  - src/components/social/social-page.tsx — add livenessMap prop (pass through to cards later)
  - src/components/graph/smart-dag.tsx — add livenessMap prop (use in x3l.3)
- Out of Scope:
  - Rendering agent avatars yet (beadboard-x3l.2, x3l.3)
  - Removing useSessionFeed from sessions-page.tsx (leave it, legacy route)

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Report any remaining risks and follow-up beads explicitly.

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).


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.

TASK CONTEXT
- Bead ID: beadboard-x3l.2
- Title: Render agent avatar and liveness dot on SocialCard
- Parent/Epic: beadboard-x3l
- Dependencies (must be done first): beadboard-x3l.1

TASK CONTRACT
- 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.
- Success Criteria:
  - SocialCard receives livenessMap: Record<string, string> prop
  - If issue.assignee exists and is in livenessMap, renders AgentAvatar component with liveness indicator
  - Liveness states: 'active' (green dot), 'stale' (amber dot), 'stuck' (red pulse)
  - Cards without an assignee show no avatar — no empty avatar placeholder
  - npm run typecheck passes
- Scope:
  - src/components/social/social-card.tsx — add livenessMap prop and avatar render
  - src/components/social/social-page.tsx — thread livenessMap through to each SocialCard
  - Check if AgentAvatar component exists (grep src/ for AgentAvatar) and use it; if not, render a simple initials circle
- Out of Scope:
  - Graph node agent presence (beadboard-x3l.3)
  - Inline assign affordance (Phase 3, beadboard-8ij.2)

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Report any remaining risks and follow-up beads explicitly.


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.

TASK CONTEXT
- Bead ID: beadboard-x3l.3
- Title: Render agent avatar on graph nodes with stuck-agent pulse
- Parent/Epic: beadboard-x3l
- Dependencies (must be done first): beadboard-x3l.1

TASK CONTRACT
- 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.
- Success Criteria:
  - Graph node card renders a small agent avatar when issue.assignee is present in livenessMap
  - Stuck agents (livenessMap value === 'stuck') show a CSS pulse/ring animation on the node border
  - Non-assigned nodes are visually unchanged
  - npm run typecheck passes
- Scope:
  - src/components/graph/smart-dag.tsx or the node card component it renders — add livenessMap prop and avatar/pulse render
  - Read SmartDag to find where individual node UI is rendered before editing
- Out of Scope:
  - SocialCard presence (beadboard-x3l.2)
  - Graph layout or DAG structure changes

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Report any remaining risks and follow-up beads explicitly.


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.

TASK CONTEXT
- Bead ID: beadboard-x3l.4
- Title: Replace LeftPanel footer with live workspace stats
- Parent/Epic: beadboard-x3l
- Dependencies (must be done first): beadboard-x3l.1

TASK CONTRACT
- 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.
- Success Criteria:
  - Footer shows 'N agents active, M tasks in motion' with real counts
  - Counts update reactively when SSE pushes changes
  - No hardcoded identity text remains in LeftPanel footer
  - npm run typecheck passes
- Scope:
  - src/components/shared/left-panel.tsx — update footer section
  - LeftPanel already receives issues prop — use it for task count
  - livenessMap passed from UnifiedShell (add to LeftPanelProps if not present)
- Out of Scope:
  - TopBar identity input (beadboard-0fi.1)
  - Changing LeftPanel navigation or epic tree

IMPLEMENTATION CONSTRAINTS
- Preserve existing backend/API contracts unless explicitly stated otherwise.
- Reuse shared components and logic; avoid one-off forks.
- Keep changes targeted and minimal for this bead.

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
- Report any remaining risks and follow-up beads explicitly.


Ratified canonical workflow memory requiring explicit in-UI user confirmation for persistent regressions.

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.

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.

[MEMORY][WORKFLOW][SOFT] Persisting user-reported regressions require explicit in-UI confirmation checkpoint


Orchestrates parallel runtime artifact cleanup and codebase hygiene work. Dispatches worker agents for gitignore updates, path removal, runtime artifact cleanup, documentation updates, and PR 14 bug fixes. Manages dependencies between parallel and sequential phases.

Agent: bb-cleanup-orchestrator


Progress: Added child task for Fit to Screen control implementation in graph canvas.

DAG Views UX Overhaul (Macro/Micro Contexts)


Graph view shows a Fit to screen control; clicking it re-fits the DAG within viewport; typecheck and lint pass.

Added visible Fit to screen control in DAG graph and wired it to ReactFlow fitView for user-triggered viewport re-fit.

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.

Implemented in src/components/shared/workflow-graph.tsx: added Fit to screen button in top-right control area; wired to handleFitToScreen() using reactflow fitView().
Verification: npm run typecheck => PASS. npm run lint => PASS (19 existing warnings, 0 errors). Additional regression check: node --import tsx --test tests/api/bead-comments-item-route.test.ts => PASS (9 tests). Memory review: no new reusable memory.

Add Fit to Screen control to DAG graph canvas


Implemented recursive epic descendant inclusion and optional hierarchy (parent/subtask) edges in DAG with tests and verification evidence recorded.

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.

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&graphTab=invalid expected flow got overview\n\nMemory review: no new reusable memory.

Implement epic descendant inclusion + hierarchy edge toggle in DAG


Completed: Fixed cross-view nav with atomic buildUrlParams URL updates. Commit c246cea.

Fixed cross-view navigation between Social and Graph views. GitBranch button on social cards navigates to graph with graphTab=flow (Dependencies/DAG tab). Columns2 button on DAG nodes navigates to Social view. Fixed stale closure bug by using single buildUrlParams() -> router.push() for atomic multi-param URL updates instead of sequential setState calls. Scope: social-card.tsx, smart-dag.tsx, graph-node-card.tsx, use-url-state.ts. Success Criteria: Cross-view buttons navigate correctly without race conditions.

Fix cross-view navigation: Social <-> Graph with atomic URL params


When working on an epic, skill reads the template:XXX label, looks up the template definition, and uses team composition to spawn appropriate agents

Already captured in bb-buff.4 as template label integration concept

When the skill spawns work on an epic, it should:\n1. Check for labels starting with 'template:'\n2. Look up the template from /api/swarm/templates\n3. Use the team composition (archetype counts) to determine how many agents to spawn\n4. Follow the protoFormula workflow\n\nThis allows the user to assign templates to epics in the UI, and the skill will automatically understand what team is needed when asked to work on that epic.

Skill should read template labels from epics


Implement Frontend UI


All 3 critical PR 14 bugs fixed with tests passing

TASK CONTEXT
- Bead ID: beadboard-pai7.5
- Title: Fix PR 14 critical bugs
- Parent/Epic: beadboard-pai7
- Dependencies: none

TASK CONTRACT
- Goal: Fix 3 critical bugs blocking PR 14 (tsx dependency, bb shim, spawn errors)
- Success Criteria:
  - Bug 1: tsx either added to production deps or TypeScript compiled properly
  - Bug 2: bb shim target exists or shim removed
  - Bug 3: spawn() calls have error handlers
  - All tests passing
  - Verification: npm run typecheck && npm run lint && npm run test
- Scope:
  - bin/beadboard.js
  - install/ directory
  - src/cli/ directory
  - package.json (if deps changed)
- Out of Scope:
  - Other PR 14 improvements
  - PR 15 changes
  - Non-critical issues

IMPLEMENTATION CONSTRAINTS
- Follow test-driven development
- Write failing tests first, then implement fixes
- Ensure no regressions in existing tests

VERIFICATION REQUIREMENTS
- Required commands:
  - npm run typecheck
  - npm run lint
  - npm run test
  - Manual test of affected commands

Fixed PR 14 critical bugs:

1. Fixed tsx dependency - tsx is already in production deps
2. Fixed bb shim target - tools/bb.ts exists
3. Fixed spawn() error handlers - error handlers added for start/open commands
4. Fixed session-preflight.mjs bug - corrected bd query syntax from 'label=mem-canonical,status=closed' to 'label=mem-canonical AND status=closed'
5. Fixed beadboard-launcher.test.ts - corrected test to use BB_PORT instead of BB_DEV_SERVER_URL, made server respond to / path, skipped Windows-specific dolt test

Verification:
npm run typecheck - PASSED
npm run lint - PASSED
npm run test - ALL TESTS PASSING (0 failures, 1 skip)

Files changed:
- skills/beadboard-driver/scripts/session-preflight.mjs (line 45)
- tests/scripts/beadboard-launcher.test.ts (complete rewrite)

Fix PR 14 critical bugs


TASK CONTEXT\n- Parent: beadboard-c70 / beadboard-05a\n\nTASK CONTRACT\n- Goal: Define canonical installer manifest schema and shared install semantics used by all OS wrappers.\n- Success Criteria:\n  - install/manifest.json schema defined\n  - shared installer contract documented and testable\n- Scope: version/channel resolution, artifact/checksum map, command mapping\n- Out of Scope: platform wrapper implementation\n\nVERIFICATION REQUIREMENTS\n- npm run typecheck\n- npm run lint

Superseded by hierarchical execution tree under beadboard-05a.x

Installer Contract: canonical manifest + shared semantics


Make Archetypes and Templates Editable in Swarm View


Recreating as proper children of Phase 0 epic with correct naming

view=activity is a valid ViewType (in VALID_VIEWS in use-url-state.ts) but renderMiddleContent() in UnifiedShell returns null for it. SocialCard 'Jump to Activity' navigates users here, so they land on a blank page.

File: src/components/shared/unified-shell.tsx
Location: renderMiddleContent() function (around lines 103-140)

Change: Add before the final 'return null':
  if (view === 'activity') {
    return (
      <ActivityPanel
        issues={filteredIssues}
        projectRoot={projectRoot}
      />
    );
  }

Import: ActivityPanel is already used in contextual-right-panel.tsx:
  import { ActivityPanel } from '../activity/activity-panel';
Check ActivityPanel's props signature before adding - confirm it accepts issues and projectRoot.

Acceptance: Navigating to /?view=activity renders the activity feed. SocialCard 'Jump to Activity' link lands on content, not a blank page.

P0.2: Add activity render case to renderMiddleContent()


GraphNodeData interface includes labels field. WorkflowGraph passes issue.labels to node data. Tests verify labels are present in node data.

Completed. Added labels field to GraphNodeData interface and passed issue.labels through WorkflowGraph and dependency-graph-page. All 4 TDD tests pass. All verification gates pass.

## Completed Implementation

### Files Changed
- **src/components/graph/graph-node-card.tsx**: Added `labels: string[]` field to GraphNodeData interface
- **src/components/shared/workflow-graph.tsx**: Added `labels: issue.labels` to node data
- **src/components/graph/dependency-graph-page.tsx**: Added `labels: issue.labels` to node data (deprecated page kept working)
- **tests/components/graph/graph-node-labels.test.tsx**: Created 4 TDD tests
- **package.json**: Added new test file to test script

### Tests Written (TDD)
All 4 tests pass:
1. GraphNodeData interface includes labels field
2. GraphNodeData labels is typed as string array
3. WorkflowGraph passes issue.labels to node data
4. WorkflowGraph uses labels from issue in node mapping

### Verification Gates
- npm run typecheck: ✓ PASS
- npm run lint: ✓ PASS (0 errors, 21 warnings - all pre-existing)
- npm run test: ✓ PASS (all tests)

### Evidence
```
npm run typecheck
> tsc --noEmit
(no output = success)

npm run lint
✖ 21 problems (0 errors, 21 warnings)

npm run test
# tests 13 (including new graph-node-labels suite)
# pass 13
# fail 0
```

Pass labels to graph nodes


Anchors exist, at least 5 canonical memory nodes exist and are closed, links to anchors exist, and plan docs updated.

Phase 1 memory fabric bootstrapped in bd with anchors and canonical memory nodes

Implement Phase 1 native memory system in bd: create domain anchors, seed canonical memory decisions with strict schema labels, link via relates_to, and document evidence.

Evidence: created anchors beadboard-76p/fld/nq9/5r1/8st; created+closed canonical nodes beadboard-116,dvp,60a,zas,duo,6fv,fga; verified retrieval via bd query label=memory+mem-canonical+status=closed and connectivity via bd dep list.

Bootstrap Phase 1 Memory Fabric (anchors + canonical nodes)


Completed: Created TelemetryStrip with real /api/activity + SSE data. Commit 114bb18.

Created new TelemetryStrip component - a minimized right sidebar that shows recent activity event dots from /api/activity + SSE (same data source as ActivityPanel). Uses getEventTone() color coding. Includes maximize button to restore full activity feed. Scope: telemetry-strip.tsx (NEW), unified-shell.tsx. Success Criteria: TelemetryStrip shows real activity events as colored dots, maximize restores full feed.

Create TelemetryStrip minimized sidebar component


Given a behavior change touching multiple views, when implementation lands, then shared logic path is reused and covered by tests.
Verification command(s): rg "<shared-function-or-hook>" src tests; npm run test

Scope: Repeated logic used by multiple views or pages.
Out of Scope: One-off prototypes and disposable experiments.
Rule: Reuse shared paths/components for cross-view behavior; avoid one-off logic drift.
Rationale: Prevents silent divergence between Kanban, Graph, and API views.
Failure Mode: Patching one surface only creates inconsistent user behavior.

Provenance linked: beadboard-68k.4, beadboard-68k.5, beadboard-r1i.1

[MEMORY][ARCH][HARD] Shared logic for cross-view behavior


Removes hard-coded developer paths from tracked files

Agent: bb-path-hygiene


pulse:maf8-recipient-1772602336486-77cc:1772602343524


pulse:maf8-recipient-1772605221538-e98f:1772605224897


pulse:maf8-recipient-1772602590511-8617:1772602599861


pulse:maf8-recipient-1772604568395-181a:1772604572634


pulse:maf8-sender-1772605221538-c382:1772605223361


pulse:maf8-recipient-1772604399694-3b18:1772604409020


pulse:maf8-recipient-1772594345463-5e30:1772594360649


pulse:maf8-recipient-1772604126900-0df6:1772604136199


pulse:maf8-sender-1772604568395-a777:1772604569982


pulse:maf8-sender-1772602408666-4c54:1772602412603


pulse:maf8-sender-1772605233998-56b0:1772605238399


pulse:maf8-recipient-1772602336486-77cc:1772602342360


pulse:maf8-recipient-1772603344712-1862:1772603348942


pulse:maf8-recipient-1772603344712-1862:1772603347709


pulse:maf8-recipient-1772602543590-2e77:1772602547725


pulse:maf8-recipient-1772595830876-a2bd:1772595843035


pulse:maf8-recipient-1772605258835-7419:1772605270341


pulse:maf8-recipient-1772594345463-5e30:1772594358748


pulse:maf8-recipient-1772604399694-3b18:1772604405332


pulse:maf8-sender-1772604535950-26bb:1772604537592


pulse:maf8-recipient-1772603406999-2bf7:1772603416157


pulse:maf8-recipient-1772602336486-77cc:1772602345847


pulse:maf8-recipient-1772604535950-4030:1772604541420


pulse:maf8-recipient-1772603406999-2bf7:1772603412462


pulse:maf8-recipient-1772604535950-4030:1772604538983


pulse:test-coord-izs2:1772590713612


pulse:maf8-recipient-1772603447464-07c5:1772603454149


pulse:maf8-sender-1772594142586-920f:1772594153763


pulse:maf8-recipient-1772602498124-349c:1772602507029


pulse:maf8-recipient-1772604414201-e81b:1772604418422


pulse:maf8-recipient-1772603406999-2bf7:1772603414974


pulse:maf8-sender-1772604399694-d676:1772604403847


pulse:maf8-sender-1772603344712-93c7:1772603346337


pulse:maf8-recipient-1772594345463-5e30:1772594356613


pulse:maf8-recipient-1772604535950-4030:1772604540190


pulse:maf8-sender-1772605258835-40c6:1772605266346


pulse:maf8-recipient-1772602590511-8617:1772602598638


pulse:maf8-sender-1772603406999-8469:1772603411091


pulse:maf8-recipient-1772594195923-64e9:1772594208703


pulse:maf8-recipient-1772604568395-181a:1772604575117


pulse:maf8-recipient-1772603406999-2bf7:1772603413681


pulse:maf8-recipient-1772594345463-5e30:1772594354573


pulse:maf8-recipient-1772604126900-0df6:1772604134923


pulse:maf8-recipient-1772604568395-181a:1772604573915


pulse:maf8-recipient-1772605258835-7419:1772605271573


pulse:maf8-recipient-1772603344712-1862:1772603351329


pulse:maf8-recipient-1772605258835-7419:1772605269064


pulse:maf8-recipient-1772595830876-a2bd:1772595840876


pulse:maf8-recipient-1772594167363-8d60:1772594178007


pulse:maf8-recipient-1772604126900-0df6:1772604133639


pulse:maf8-recipient-1772605233998-eb34:1772605241154


pulse:maf8-recipient-1772602498124-349c:1772602504668


pulse:maf8-recipient-1772594195923-64e9:1772594206787


pulse:maf8-sender-1772604414201-b833:1772604418269


pulse:maf8-sender-1772602498124-83bc:1772602502097


pulse:maf8-recipient-1772605221538-e98f:1772605228729


pulse:maf8-recipient-1772595830876-a2bd:1772595845187


pulse:maf8-recipient-1772602543590-2e77:1772602548900


pulse:maf8-recipient-1772604414201-e81b:1772604420786


pulse:maf8-recipient-1772605233998-eb34:1772605243654


pulse:maf8-sender-1772603447464-a701:1772603451537


pulse:maf8-recipient-1772603447464-07c5:1772603452929


pulse:maf8-recipient-1772602336486-77cc:1772602344707


pulse:maf8-recipient-1772605233998-eb34:1772605239885


pulse:maf8-recipient-1772594195923-64e9:1772594204897


pulse:silver-scribe:1772591154975


pulse:maf8-sender-1772594345463-989c:1772594352306


pulse:maf8-sender-1772602590511-758a:1772602594720


pulse:maf8-recipient-1772602408666-684a:1772602416347


pulse:maf8-recipient-1772602408666-684a:1772602413959


pulse:maf8-recipient-1772604535950-4030:1772604542620


pulse:maf8-recipient-1772604399694-3b18:1772604406605


pulse:silver-scribe:1772591174677


pulse:maf8-recipient-1772594167363-8d60:1772594176052


pulse:maf8-recipient-1772603447464-07c5:1772603456539


pulse:maf8-recipient-1772604126900-0df6:1772604132410


pulse:maf8-recipient-1772602408666-684a:1772602417502


pulse:maf8-sender-1772602336486-811e:1772602341005


pulse:maf8-recipient-1772603344712-1862:1772603350161


pulse:maf8-recipient-1772602498124-349c:1772602503486


pulse:maf8-recipient-1772604414201-e81b:1772604419643


pulse:maf8-recipient-1772603447464-07c5:1772603455356


pulse:maf8-recipient-1772594195923-64e9:1772594210682


pulse:maf8-recipient-1772604568395-181a:1772604571396


pulse:maf8-recipient-1772602408666-684a:1772602415146


pulse:maf8-sender-1772594195923-b170:1772594202541


pulse:maf8-recipient-1772605258835-7419:1772605267799


pulse:silver-scribe:1772591179460


pulse:maf8-recipient-1772605233998-eb34:1772605242430


pulse:maf8-sender-1772595830876-d567:1772595838320


pulse:maf8-recipient-1772604399694-3b18:1772604407826


pulse:maf8-recipient-1772605221538-e98f:1772605226223


pulse:maf8-recipient-1772602590511-8617:1772602596162


pulse:maf8-recipient-1772604414201-e81b:1772604419648


pulse:maf8-recipient-1772602543590-2e77:1772602546507


pulse:maf8-sender-1772604126900-011d:1772604131043


pulse:maf8-sender-1772602543590-06fb:1772602545115


pulse:maf8-recipient-1772602543590-2e77:1772602550063


pulse:maf8-recipient-1772602498124-349c:1772602505878


pulse:maf8-recipient-1772602590511-8617:1772602597392


pulse:maf8-sender-1772594167363-e2c2:1772594173805


pulse:maf8-recipient-1772595830876-a2bd:1772595847358


pulse:maf8-recipient-1772605221538-e98f:1772605227492