# PR3.5 Recon — What PR3 actually left behind (hooks + primitives)
> Audit, not trust. Every row below was verified against source on branch
> `feature/warm-hive-pr3` @ `dac7b696`. Where the handoff was imprecise it is
> called out. Repo root: `D:/Projects/waggle-os`.
---
## TL;DR — claimed primitives: exist vs must-build
**The three "Memory-Trust primitives" the handoff named — `ConfidenceBadge`,
`EvidenceChip`, `DetailDrawer` — ALL EXIST and are already in production use.**
The handoff's only error was the *location*: they are NOT in `os/warm/`, they live
in `components/ui/` and predate PR3 (created in the earlier UX-refactor arc, commit
`afe96355` "Phase 2B-FE.1 — Memory Center DS foundation"). PR3 added the warm
provenance layer (`ProvenanceLine`, `ActivityStream`) on top.
So PR3.5 **reuses**, does not build-from-scratch, the trust primitives. What is
genuinely **missing / static** is the *wiring*: the Workspace "What Waggle knows"
fact rows and the Chat activity step rows are visual-only (no `onClick`, no
provenance plumbed), and the chat `StepContentBlock` type has no `source` field —
that is the real PR3.5 work (the "frame.source 1-field server projection" keystone).
---
## TRUTH TABLE — claim → real state → file:line
| # | Handoff claim | Real state | Evidence (file:line) |
|---|---|---|---|
| 1 | "ConfidenceBadge / EvidenceChip / DetailDrawer primitives **ready** [implied: in `warm/`]" | **TRUE but mislocated.** All three exist in `components/ui/`, NOT `os/warm/`. Pre-date PR3 (commit `afe96355`). Already consumed by Memory Center. Do NOT rebuild. | `apps/web/src/components/ui/confidence-badge.tsx:22` (export `ConfidenceBadge`) `apps/web/src/components/ui/evidence-chip.tsx:16` (export `EvidenceChip`) `apps/web/src/components/ui/detail-drawer.tsx:22` (export `DetailDrawer`) Bonus: `apps/web/src/components/ui/evidence-panel.tsx` (`EvidencePanel`) also exists |
| 1b | (warm/ dir listing) | The PR3 `warm/` set is 14 atoms; the trust primitives are NOT among them. warm/ has the provenance *renderer* (`ProvenanceLine`) + the chat *container* (`ActivityStream`). | `apps/web/src/components/os/warm/index.ts:7-20` |
| 2a | "clickable fact rows" (Workspace "What Waggle knows", PR3 Phase C2) | **FALSE — STATIC.** The `
` rows render `HexCheckTile + text + when`. No `onClick`, no anchor, no role=button, no cursor affordance. Pure display. | `apps/web/src/components/os/apps/WorkspaceDesktopApp.tsx:160-168` (the `facts.map` `
` has no handler). Header comment at `:146-149` explicitly flags `frame.source` is not yet projected onto these rows ("the PR3.5 keystone"). |
| 2b | "clickable step rows" (Chat activity steps) | **FALSE — STATIC.** `ActivityStream` renders each step as a `
` (`DotLive + text + optional ProvenanceLine`). The step `
` itself has no `onClick`. Provenance is only rendered `if (s.provenance)` — and the Chat caller never supplies it. | `apps/web/src/components/os/warm/ActivityStream.tsx:62-74` (step `
` static; provenance gated on `s.provenance`) `apps/web/src/components/os/apps/chat-blocks/BlockRenderer.tsx:30-33` (maps only `tone`+`text` — **omits `provenance` entirely**) |
| 2c | (why chat steps can't show provenance yet) | **Root blocker.** `StepContentBlock` has no `source`/`provenance` field. So even if BlockRenderer wanted to pass provenance, the data isn't on the block. Same shape as the Workspace keystone — both need `frame.source` server projection. | `apps/web/src/lib/types.ts:474-479` (`StepContentBlock` = `{type,blockId,description,status}` — no source) |
| 3 | "intact J08 banner" | **TRUE.** Renders on Home Cockpit; gated `needsReviewCount > 0`; `role="alert"`; deep-links to Memory Center via `waggle:open-app` with `filter:'unreviewed'`. Wiring intact end-to-end (route re-stash in `MemoryRoute.tsx`, consumed by `MemoryCenterTab`). | Render: `apps/web/src/components/os/apps/HomeCockpit.tsx:496-515` Handler `openMemoryReview`: `:477-481` Count source: `briefing.needsReviewCount` (`lib/types.ts:303`) Consumer: `MemoryCenterTab.tsx:84` |
| 4 | "ProvenanceLine.tsx" | **EXISTS** (PR3 Phase 0, commit `0b15b91f`). Thin recolor of `EvidenceChip` to the intel/violet semantic. Full API below. | `apps/web/src/components/os/warm/ProvenanceLine.tsx:19` |
| 5 | "warm/index.ts + tones.ts" | **EXIST.** Full exports + tone vocab below. | `apps/web/src/components/os/warm/index.ts`, `tones.ts` |
---
## ProvenanceLine — full API (verified, `ProvenanceLine.tsx:4-32`)
```ts
interface ProvenanceLineProps {
source: string; // REQUIRED. e.g. "web · mem0.ai" or "Claude Code"
when?: string; // optional relative time, e.g. "2h ago"
onClick?: () => void; // PR3.5 trace hook — makes the pill clickable into memory detail
className?: string;
}
export function ProvenanceLine({ source, when, onClick, className }): JSX.Element
```
**Render:** builds `label = \`⬡ ${source}${when ? \` · ${when}\` : ''}\``, then
delegates to ``. The chip is
recolored via `font-mono text-[var(--intel)] border-[var(--intel-wash)] bg-transparent`.
- **Clickable behavior:** when `onClick` is supplied, `EvidenceChip` renders a real
`