# Hypothesis 01 - Review queue (`hypothesis-01`) - SignalOS page block

> Fully reusable list-based workflow block composed from Page Header, Filter Toolbar, Record List. Supports generic filtering, search, selection, and custom rendering. Domain-agnostic and configurable via props.

- **Version:** 0.5.5
- **Kind:** block (group: hypothesis) · **Category:** pages
- **Install:** `npx shadcn@4.1.2 add @signalos/hypothesis-01`
- **Registry dependencies (pulled automatically):** @signalos/tokens, @signalos/utils, @signalos/page-header, @signalos/view-controler, @signalos/button, @signalos/expandable-list, @signalos/skeleton, @signalos/progress, @signalos/card, @signalos/badge, @signalos/data-primitives, @signalos/activity-timeline, @signalos/circular-progress, @signalos/dialog, @signalos/textarea, @signalos/input, @signalos/label, @signalos/tooltip, @signalos/command, @signalos/popover, @signalos/select, @signalos/switch, @signalos/scroll-area, @signalos/dropdown-menu, @signalos/table
- **npm dependencies:** lucide-react@^1.7.0, react-markdown@^9.0.3, echarts@^6.1.0, echarts-for-react@^3.0.7
- **Files installed:** `src/components/blocks/hypothesis-01/Hypothesis01.tsx`, `src/components/blocks/hypothesis-01/Hypothesis01.types.ts`, `src/components/blocks/hypothesis-01/Hypothesis01.constants.ts`, `src/components/blocks/hypothesis-01/Hypothesis01.utils.ts`, `src/components/blocks/hypothesis-01/components/HypothesisCard.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailDialog.tsx`, `src/components/blocks/hypothesis-01/components/DecisionActionDialog.tsx`, `src/components/blocks/hypothesis-01/components/SignalDetailMiniDialog.tsx`, `src/components/blocks/hypothesis-01/components/SignalEvidenceCard.tsx`, `src/components/blocks/hypothesis-01/components/DecisionLogEvidenceBar.tsx`, `src/components/blocks/hypothesis-01/components/CollaboratorsPanel.tsx`, `src/components/blocks/hypothesis-01/components/ShareSlotDialog.tsx`, `src/components/blocks/hypothesis-01/components/ShareRequestsPanel.tsx`, `src/components/blocks/hypothesis-01/components/EscalationRequestsPanel.tsx`, `src/components/blocks/hypothesis-01/components/SwapSlotPickerDialog.tsx`, `src/components/blocks/hypothesis-01/components/InboxDialog.tsx`, `src/components/blocks/hypothesis-01/components/RequestQueuePanel.tsx`, `src/components/blocks/hypothesis-01/components/SectionHeading.tsx`, `src/components/blocks/hypothesis-01/components/chat-recall.types.ts`, `src/components/blocks/hypothesis-01/components/SlotDetailExportHeader.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailExportPanels.tsx`, `src/components/blocks/hypothesis-01/components/chat/HypothesisChat.tsx`, `src/components/blocks/hypothesis-01/components/chat/HypothesisChat.constants.ts`, `src/components/blocks/hypothesis-01/components/chat/ChatInput.tsx`, `src/components/blocks/hypothesis-01/components/chat/ChatMessageBubble.tsx`, `src/components/blocks/hypothesis-01/components/chat/ChatSuggestions.tsx`, `src/components/blocks/hypothesis-01/components/chat/ChatSuggestions.utils.ts`, `src/components/blocks/hypothesis-01/components/chat/ChatThinkingTrace.tsx`, `src/components/blocks/hypothesis-01/components/chat/ChatVisualization.tsx`, `src/components/blocks/hypothesis-01/components/recall/index.ts`, `src/components/blocks/hypothesis-01/components/recall/RecallPanel.tsx`, `src/components/blocks/hypothesis-01/components/recall/RecallSection.tsx`, `src/components/blocks/hypothesis-01/components/recall/RecallDialog.tsx`, `src/components/blocks/hypothesis-01/components/recall/RecallExportPanels.tsx`, `src/components/blocks/hypothesis-01/components/recall/RecallSummaryChip.tsx`, `src/components/blocks/hypothesis-01/components/recall/PrecedentCard.tsx`, `src/components/blocks/hypothesis-01/components/recall/PrecedentDetail.tsx`, `src/components/blocks/hypothesis-01/components/recall/OpenDecisionCard.tsx`, `src/components/blocks/hypothesis-01/components/recall/FeatureMeter.tsx`, `src/components/blocks/hypothesis-01/components/recall/recall-utils.ts`, `src/components/blocks/hypothesis-01/components/SlotDetailEvidence.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailFeedback.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailHeader.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailOverview.tsx`, `src/components/blocks/hypothesis-01/components/SlotDetailSidebar.tsx`, `src/components/blocks/hypothesis-01/components/EquilibriumSidebar.tsx`

## Access

This is a private registry: pulling source requires a `SIGNALOS_REGISTRY_TOKEN`
(GitHub fine-grained PAT with read access to the signal-widgets repo) and an
`@signalos` entry in components.json `"registries"`. Previews and this document are public.

## Usage

```tsx
// after: npx shadcn@4.1.2 add @signalos/hypothesis-01
// mount the pulled page in a route, e.g. src/app/hypothesis/page.tsx
import Hypothesis01 from "@/components/blocks/hypothesis-01/Hypothesis01"

export default function Page() {
  return <Hypothesis01 />
}
```

## Props

### `SeverityLevel`

```ts
export type SeverityLevel = "info" | "low" | "medium" | "high" | "critical"
```

### `EquilibriumEqState`

```ts
export type EquilibriumEqState =
  "CRITICAL" | "INTERVENTION" | "DRIFTING" | "STABLE"
```

### `MetricDeviation`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `current` | `number \| null` | yes | - | Current observed value, or null if unavailable. |
| `baseline` | `number \| null` | yes | - | Baseline value used for deviation calculation. |
| `deviation` | `number` | yes | - | Fractional deviation from baseline (e.g. 0.12 = 12% above). |
| `unit` | `string` | yes | - | Unit of measure: "percent", "ratio", or a custom label. |
| `direction` | `string` | yes | - | Whether up movement is desirable for this metric. |
| `status` | `string` | yes | - | Derived status bucket for the metric. |

### `EquilibriumEntry`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `equilibrium_id` | `string` | yes | - |  |
| `domain` | `string` | yes | - |  |
| `state` | `EquilibriumEqState` | yes | - |  |
| `balance_score` | `number` | yes | - | 0–1 composite balance score. |
| `previous_score` | `number \| null` | yes | - |  |
| `previous_state` | `EquilibriumEqState \| null` | yes | - |  |
| `drift_velocity` | `number` | yes | - | Rate of change per hour (positive = improving). |
| `metric_deviations` | `Record<string, MetricDeviation>` | yes | - |  |
| `computed_at` | `string` | yes | - |  |
| `updated_at` | `string` | yes | - |  |

### `EligiblePipeline`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `pipeline_id` | `string` | yes | - |  |
| `pipeline_name` | `string` | yes | - |  |

### `EquilibriumSidebarProps`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `entries` | `EquilibriumEntry[] \| undefined` | no | - | Equilibrium entries to display. |
| `isLoading` | `boolean \| undefined` | no | - | Shows skeleton cards while data loads. |
| `pipelines` | `EligiblePipeline[] \| undefined` | no | - | Pipeline filter options; omit to hide the picker. |
| `selectedPipelineId` | `string \| null \| undefined` | no | - | Currently selected pipeline id, or null for all. |
| `onSelectPipeline` | `((pipelineId: string \| null) => void) \| undefined` | no | - | Fired when the user changes the pipeline filter. |
| `className` | `string \| undefined` | no | - |  |
| `data-testid` | `string \| undefined` | no | - | Test identifier rendered as `data-testid` on the root element. |

### `EquilibriumDetailSheetProps`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `entry` | `EquilibriumEntry \| null \| undefined` | no | - |  |
| `open` | `boolean \| undefined` | no | - |  |
| `onOpenChange` | `((open: boolean) => void) \| undefined` | no | - |  |

### `DetailRecordStatus`

```ts
export type DetailRecordStatus =
  "FORMING" | "SUFFICIENT" | "ROUTED" | "DECIDED" | "EXPIRED"
```

### `SignalRecordStatus`

```ts
export type SignalRecordStatus = "active" | "decayed"
```

### `SlotStatus`

```ts
export type SlotStatus = "ACTIVE" | "IN_PROGRESS" | "EXPIRED" | "ESCALATED"
```

### `DecisionAction`

```ts
export type DecisionAction =
  "resolve" | "dismissed" | "escalate" | "schedule" | string
```

### `DecisionActionType`

```ts
export type DecisionActionType = "resolve" | "dismissed" | "escalate"
```

### `DecisionFormValues`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `rationale` | `string` | yes | - |  |
| `expected_outcome` | `string \| undefined` | no | - |  |
| `expected_outcome_by` | `string \| undefined` | no | - |  |
| `dismiss_reason` | `string \| undefined` | no | - |  |
| `resolution` | `string \| undefined` | no | - |  |
| `reason` | `string \| null \| undefined` | no | - |  |

### `ContributingSignal`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `role` | `string` | yes | - |  |
| `cluster` | `string` | yes | - |  |
| `deviation` | `number` | yes | - |  |
| `metric_id` | `string` | yes | - |  |
| `signal_id` | `string` | yes | - |  |
| `confidence` | `number` | yes | - |  |

### `SignalSummary`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `label` | `string \| undefined` | no | - |  |
| `cagg` | `number \| undefined` | no | - |  |
| `sufficiency` | `number \| undefined` | no | - |  |
| `signal_count` | `number \| undefined` | no | - |  |
| `severity` | `SeverityLevel \| undefined` | no | - |  |
| `domain` | `string \| undefined` | no | - |  |
| `cluster` | `string \| undefined` | no | - |  |
| `equilibrium_state` | `string \| undefined` | no | - |  |
| `contributing_signals` | `ContributingSignal[] \| undefined` | no | - |  |

### `WorkItem`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `executive_id` | `string` | yes | - |  |
| `hypothesis_id` | `string` | yes | - |  |
| `priority_rank` | `number` | yes | - |  |
| `priority_score` | `number` | yes | - |  |
| `signal_summary` | `SignalSummary` | yes | - |  |
| `escalation_deadline` | `string \| null` | yes | - |  |
| `escalated_from` | `string \| null` | yes | - |  |
| `status` | `SlotStatus` | yes | - |  |
| `closed_reason` | `string \| null` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `updated_at` | `string` | yes | - |  |
| `decayed_at` | `string \| null` | yes | - |  |
| `act_by_deadline` | `string \| null` | yes | - |  |
| `severity` | `SeverityLevel \| null` | yes | - |  |
| `confidence_initial` | `number \| null` | yes | - |  |
| `confidence_current` | `number \| null` | yes | - |  |
| `swap_out_slot_id` | `string \| null \| undefined` | no | - |  |

### `WorkItemListResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `slots` | `WorkItem[]` | yes | - |  |

### `WorkItemListFilters`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `executive_id` | `string \| undefined` | no | - |  |
| `slot_status` | `SlotStatus[] \| undefined` | no | - |  |
| `limit` | `number \| undefined` | no | - |  |

### `EvidenceItem`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `type` | `string \| undefined` | no | - |  |
| `role` | `string \| undefined` | no | - |  |
| `deviation` | `number \| undefined` | no | - |  |
| `metric_id` | `string \| undefined` | no | - |  |

### `DetailRecord`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `label` | `string` | yes | - |  |
| `description` | `string` | yes | - |  |
| `domain` | `string` | yes | - |  |
| `cluster` | `string` | yes | - |  |
| `signal_ids` | `string[]` | yes | - |  |
| `cagg` | `number` | yes | - |  |
| `sufficiency_score` | `number` | yes | - |  |
| `evidence` | `EvidenceItem[]` | yes | - |  |
| `routed` | `boolean` | yes | - |  |
| `routed_to` | `string \| null` | yes | - |  |
| `status` | `DetailRecordStatus` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `updated_at` | `string` | yes | - |  |
| `confidence_initial` | `number` | yes | - |  |
| `decay_lambda` | `number` | yes | - |  |
| `severity` | `SeverityLevel` | yes | - |  |
| `target_roles` | `string[]` | yes | - |  |
| `suggested_actions` | `string[]` | yes | - |  |
| `tags` | `string[]` | yes | - |  |
| `decayed_at` | `string \| null` | yes | - |  |
| `expire_reason` | `string \| null` | yes | - |  |
| `confidence_current` | `number` | yes | - |  |
| `refined_by_llm` | `boolean \| undefined` | no | - |  |
| `refinement_confidence` | `number \| null \| undefined` | no | - |  |
| `refinement_reasoning` | `string \| null \| undefined` | no | - |  |
| `refinement_dropped_signal_ids` | `string[] \| null \| undefined` | no | - |  |
| `refinement_dropped_reasoning` | `Record<string, unknown> \| null \| undefined` | no | - |  |
| `refinement_model` | `string \| null \| undefined` | no | - |  |
| `act_by_deadline` | `string \| null \| undefined` | no | - |  |
| `act_by_source` | `string \| null \| undefined` | no | - |  |
| `act_by_reason` | `string \| null \| undefined` | no | - |  |
| `act_by_confidence` | `number \| null \| undefined` | no | - |  |

### `DetailRecordListResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `hypotheses` | `DetailRecord[]` | yes | - |  |

### `DetailRecordListFilters`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `hyp_status` | `DetailRecordStatus \| undefined` | no | - |  |
| `domain` | `string \| undefined` | no | - |  |
| `cluster` | `string \| undefined` | no | - |  |
| `severity` | `SeverityLevel \| undefined` | no | - |  |
| `limit` | `number \| undefined` | no | - |  |
| `offset` | `number \| undefined` | no | - |  |

### `SignalRecord`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `signal_id` | `string` | yes | - |  |
| `domain` | `string` | yes | - |  |
| `cluster` | `string` | yes | - |  |
| `metric_id` | `string` | yes | - |  |
| `signal_type` | `string` | yes | - |  |
| `crlb_score` | `number` | yes | - |  |
| `initial_crlb_score` | `number` | yes | - |  |
| `reinforcement_term` | `number` | yes | - |  |
| `decay_lambda` | `number` | yes | - |  |
| `deviation_std` | `number` | yes | - |  |
| `source_connector_id` | `string \| null` | yes | - |  |
| `source_connector_type` | `string \| null` | yes | - |  |
| `severity` | `SeverityLevel` | yes | - |  |
| `payload` | `Record<string, unknown>` | yes | - |  |
| `observation_ids` | `string[]` | yes | - |  |
| `baseline_id` | `string \| null` | yes | - |  |
| `dimension_key` | `Record<string, unknown>` | yes | - |  |
| `target_roles` | `string[]` | yes | - |  |
| `tags` | `string[]` | yes | - |  |
| `embedding` | `number[] \| null` | yes | - |  |
| `fired_at` | `string` | yes | - |  |
| `expires_at` | `string \| null` | yes | - |  |
| `status` | `SignalRecordStatus` | yes | - |  |
| `confidence_current` | `number` | yes | - |  |

### `SignalRecordListResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `signals` | `SignalRecord[]` | yes | - |  |

### `Baseline`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `metric_id` | `string` | yes | - |  |
| `mean` | `number` | yes | - |  |
| `stddev` | `number` | yes | - |  |
| `window` | `string` | yes | - |  |
| `sample_count` | `number` | yes | - |  |
| `computed_at` | `string` | yes | - |  |

### `MetricObservation`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `metric_id` | `string` | yes | - |  |
| `value` | `number` | yes | - |  |
| `observed_at` | `string` | yes | - |  |
| `dimension_key` | `Record<string, unknown>` | yes | - |  |
| `source_connector_id` | `string \| null` | yes | - |  |

### `MetricObservationsResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `observations` | `MetricObservation[]` | yes | - |  |

### `TransferOfferStatus`

```ts
export type TransferOfferStatus =
  "PENDING" | "ACCEPTED" | "DECLINED" | "EXPIRED" | "CANCELED" | "WITHDRAWN"
```

### `TransferOffer`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `slot_id` | `string` | yes | - |  |
| `from_user_id` | `string` | yes | - |  |
| `to_user_id` | `string` | yes | - |  |
| `reason` | `string \| null` | yes | - |  |
| `status` | `TransferOfferStatus` | yes | - |  |
| `swap_out_slot_id` | `string \| null` | yes | - |  |
| `expires_at` | `string` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `responded_at` | `string \| null` | yes | - |  |

### `TransferResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `offer` | `TransferOffer` | yes | - |  |
| `slot` | `WorkItem` | yes | - |  |
| `immediate` | `boolean` | yes | - |  |

### `TransferListItem`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `offer` | `TransferOffer` | yes | - |  |
| `slot` | `WorkItem` | yes | - |  |

### `TransferListPendingResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `incoming` | `TransferListItem[]` | yes | - |  |
| `outgoing` | `TransferListItem[]` | yes | - |  |

### `ShareStatus`

```ts
export type ShareStatus =
  "PENDING" | "ACCEPTED" | "DECLINED" | "EXPIRED" | "REVOKED" | "CANCELED"
```

### `ShareDirection`

```ts
export type ShareDirection = "both" | "incoming" | "outgoing"
```

### `Share`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `slot_id` | `string` | yes | - |  |
| `owner_id` | `string` | yes | - |  |
| `collaborator_id` | `string` | yes | - |  |
| `message` | `string \| null` | yes | - |  |
| `status` | `ShareStatus` | yes | - |  |
| `expires_at` | `string \| null` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `responded_at` | `string \| null` | yes | - |  |

### `ShareResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `share` | `Share` | yes | - |  |
| `slot` | `WorkItem` | yes | - |  |

### `ShareWithSlot`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `share` | `Share` | yes | - |  |
| `slot` | `WorkItem` | yes | - |  |

### `SharePendingResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `incoming` | `ShareWithSlot[]` | yes | - |  |
| `outgoing` | `ShareWithSlot[]` | yes | - |  |

### `SharedWithMeResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `shares` | `ShareWithSlot[]` | yes | - |  |

### `Collaborator`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `share_id` | `string` | yes | - |  |
| `collaborator_id` | `string` | yes | - |  |
| `message` | `string \| null` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `responded_at` | `string \| null` | yes | - |  |

### `CollaboratorsResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `collaborators` | `Collaborator[]` | yes | - |  |
| `pending_invites` | `Collaborator[]` | yes | - |  |

### `ShareInvitePayload`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `collaborator_id` | `string` | yes | - |  |
| `message` | `string \| null \| undefined` | no | - |  |

### `DecisionRequest`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `hypothesis_id` | `string` | yes | - |  |
| `user_id` | `string` | yes | - |  |
| `role` | `string` | yes | - |  |
| `action` | `string` | yes | - |  |
| `rationale` | `string` | yes | - |  |
| `expected_outcome` | `string \| null \| undefined` | no | - |  |
| `expected_outcome_by` | `string \| null \| undefined` | no | - |  |
| `dismiss_reason` | `string \| null \| undefined` | no | - |  |
| `resolution` | `string \| null \| undefined` | no | - |  |
| `confidence_at_decision` | `number \| null \| undefined` | no | - |  |
| `priority_score_at_decision` | `number \| null \| undefined` | no | - |  |

### `DecisionRecord`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `hypothesis_id` | `string` | yes | - |  |
| `user_id` | `string` | yes | - |  |
| `role` | `string` | yes | - |  |
| `action` | `string` | yes | - |  |
| `rationale` | `string` | yes | - |  |
| `expected_outcome` | `string \| null` | yes | - |  |
| `expected_outcome_by` | `string \| null` | yes | - |  |
| `dismiss_reason` | `string \| null` | yes | - |  |
| `resolution` | `string \| null` | yes | - |  |
| `confidence_at_decision` | `number \| null` | yes | - |  |
| `priority_score_at_decision` | `number \| null` | yes | - |  |
| `created_at` | `string` | yes | - |  |

### `DecisionLogEventType`

```ts
export type DecisionLogEventType =
  | "hypothesis.created"
  | "hypothesis.routed"
  | "hypothesis.expired"
  | "signal.fired"
  | "decision.created"
  | "feedback.submitted"
  | string
```

### `DecisionLogSortBy`

```ts
export type DecisionLogSortBy =
  "newest" | "urgency" | "deadline" | "confidence" | "severity"
```

### `DecisionLogSortOrder`

```ts
export type DecisionLogSortOrder = "asc" | "desc"
```

### `DecisionLogEvent`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `event_type` | `string` | yes | - |  |
| `occurred_at` | `string` | yes | - |  |
| `actor_id` | `string \| null` | yes | - |  |
| `summary` | `string` | yes | - |  |
| `payload` | `Record<string, unknown>` | yes | - |  |

### `DecisionLogGroup`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `hypothesis` | `DetailRecord` | yes | - |  |
| `events` | `DecisionLogEvent[]` | yes | - |  |

### `DecisionLogSummary`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total_hypotheses` | `number` | yes | - |  |
| `needs_routing` | `number` | yes | - |  |
| `high_severity` | `number` | yes | - |  |
| `deadline_within_24h` | `number` | yes | - |  |

### `DecisionLogResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number \| undefined` | no | - |  |
| `entries` | `DecisionLogGroup[]` | yes | - |  |
| `summary` | `DecisionLogSummary \| undefined` | no | - |  |

### `DecisionLogFilters`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `executive_id` | `string \| undefined` | no | - |  |
| `user_id` | `string \| undefined` | no | - |  |
| `hypothesis_id` | `string \| undefined` | no | - |  |
| `event_type` | `string \| undefined` | no | - |  |
| `since` | `string \| undefined` | no | - |  |
| `until` | `string \| undefined` | no | - |  |
| `severity` | `("low" \| "medium" \| "high")[] \| undefined` | no | - |  |
| `status` | `("FORMING" \| "SUFFICIENT" \| "ROUTED" \| "DECIDED" \| "EXPIRED" \| "PENDING")[] \| undefined` | no | - |  |
| `routed` | `boolean \| undefined` | no | - |  |
| `needs_routing` | `boolean \| undefined` | no | - |  |
| `deadline_within_hours` | `number \| undefined` | no | - |  |
| `min_confidence` | `number \| undefined` | no | - |  |
| `max_confidence` | `number \| undefined` | no | - |  |
| `q` | `string \| undefined` | no | - |  |
| `sort_by` | `DecisionLogSortBy \| undefined` | no | - |  |
| `sort_order` | `DecisionLogSortOrder \| undefined` | no | - |  |
| `limit` | `number \| undefined` | no | - |  |
| `offset` | `number \| undefined` | no | - |  |
| `include_counts` | `boolean \| undefined` | no | - |  |

### `FeedbackVote`

```ts
export type FeedbackVote = "agree" | "disagree" | "neutral"
```

### `FeedbackEntry`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `hypothesis_id` | `string` | yes | - |  |
| `user_id` | `string` | yes | - |  |
| `feedback_text` | `string` | yes | - |  |
| `vote` | `FeedbackVote` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `updated_at` | `string` | yes | - |  |

### `FeedbackEntryResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number` | yes | - |  |
| `feedback` | `FeedbackEntry[]` | yes | - |  |

### `FeedbackEntryCreate`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `feedback_text` | `string` | yes | - |  |
| `vote` | `FeedbackVote` | yes | - |  |

### `DecayTick`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `hypothesis_id` | `string` | yes | - |  |
| `current_c` | `number` | yes | - |  |
| `ttl_hours` | `number` | yes | - |  |

### `Decision`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `hypothesis_id` | `string` | yes | - |  |
| `action` | `string` | yes | - |  |
| `rationale` | `string` | yes | - |  |
| `resolution` | `string \| null` | yes | - |  |
| `expected_outcome` | `string` | yes | - |  |
| `expected_outcome_by` | `string` | yes | - |  |
| `decided_at` | `string` | yes | - |  |
| `confidence_at_decision` | `number` | yes | - |  |
| `priority_score_at_decision` | `number` | yes | - |  |
| `role` | `string \| null` | yes | - |  |
| `user_id` | `string` | yes | - |  |
| `dismiss_reason` | `string \| null` | yes | - |  |

### `DecisionReponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `total` | `number \| null \| undefined` | no | - |  |
| `decisions` | `Decision[] \| null` | yes | - |  |

### `SimilarDecision`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `hypothesis_id` | `string \| null \| undefined` | no | - |  |
| `hypothesis_label` | `string \| null \| undefined` | no | - |  |
| `action` | `string \| null \| undefined` | no | - |  |
| `status` | `string \| null \| undefined` | no | - |  |
| `rationale` | `string \| null \| undefined` | no | - |  |
| `resolution` | `string \| null \| undefined` | no | - |  |
| `decided_at` | `string \| null \| undefined` | no | - |  |
| `vec_similarity` | `number` | yes | - |  |

### `SimilarDecisionsResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `decision_id` | `string` | yes | - |  |
| `total` | `number` | yes | - |  |
| `results` | `SimilarDecision[]` | yes | - |  |

### `DecisionSearchMode`

```ts
export type DecisionSearchMode = "hybrid" | "vector" | "keyword"
```

### `DecisionSearchRequest`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `query` | `string` | yes | - |  |
| `mode` | `DecisionSearchMode \| undefined` | no | - |  |
| `limit` | `number \| undefined` | no | - |  |
| `user_id` | `string \| undefined` | no | - |  |
| `role` | `string \| undefined` | no | - |  |
| `action` | `string \| undefined` | no | - |  |
| `status` | `string \| undefined` | no | - |  |
| `hypothesis_id` | `string \| undefined` | no | - |  |
| `since` | `string \| undefined` | no | - |  |
| `until` | `string \| undefined` | no | - |  |

### `DecisionSearchResult`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `hypothesis_id` | `string \| null \| undefined` | no | - |  |
| `hypothesis_label` | `string \| null \| undefined` | no | - |  |
| `user_id` | `string \| null \| undefined` | no | - |  |
| `role` | `string \| null \| undefined` | no | - |  |
| `action` | `string \| null \| undefined` | no | - |  |
| `status` | `string \| null \| undefined` | no | - |  |
| `rationale` | `string \| null \| undefined` | no | - |  |
| `expected_outcome` | `string \| null \| undefined` | no | - |  |
| `resolution` | `string \| null \| undefined` | no | - |  |
| `dismiss_reason` | `string \| null \| undefined` | no | - |  |
| `confidence_at_decision` | `number \| null \| undefined` | no | - |  |
| `priority_score_at_decision` | `number \| null \| undefined` | no | - |  |
| `decided_at` | `string \| null \| undefined` | no | - |  |
| `score` | `number \| null \| undefined` | no | - |  |
| `vec_similarity` | `number \| null \| undefined` | no | - |  |
| `keyword_rank` | `number \| null \| undefined` | no | - |  |

### `DecisionSearchResponse`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `query` | `string` | yes | - |  |
| `mode` | `DecisionSearchMode` | yes | - |  |
| `total` | `number` | yes | - |  |
| `results` | `DecisionSearchResult[]` | yes | - |  |

### `UserSearchResult`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `full_name` | `string` | yes | - |  |
| `email` | `string` | yes | - |  |

### `AttentionSlot`

| Prop | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `id` | `string` | yes | - |  |
| `executive_id` | `string` | yes | - |  |
| `hypothesis_id` | `string` | yes | - |  |
| `priority_rank` | `number` | yes | - |  |
| `priority_score` | `number` | yes | - |  |
| `signal_summary` | `SignalSummary` | yes | - |  |
| `escalation_deadline` | `string \| null` | yes | - |  |
| `escalated_from` | `string \| null` | yes | - |  |
| `status` | `SlotStatus` | yes | - |  |
| `closed_reason` | `string \| null` | yes | - |  |
| `created_at` | `string` | yes | - |  |
| `updated_at` | `string` | yes | - |  |
| `decayed_at` | `string \| null` | yes | - |  |
| `act_by_deadline` | `string \| null` | yes | - |  |
| `severity` | `SeverityLevel \| null` | yes | - |  |
| `confidence_initial` | `number \| null` | yes | - |  |
| `confidence_current` | `number \| null` | yes | - |  |
| `swap_out_slot_id` | `string \| null \| undefined` | no | - |  |

## Changelog

# hypothesis-01
## 0.5.5

- Remove Redux/Next.js/domain-type violations from the `chat/` and `recall/` subcomponents: delete `recall/HypothesisDetailDialog.tsx` (dispatched Redux actions, imported `next/dynamic` and an app-only component path), replace all `@/types/entities/*` and `@/lib/date-format` imports with local structural types (`components/chat-recall.types.ts`) and existing `Hypothesis01.utils` helpers.
- `RecallPanel`/`RecallSection` are now fully controlled: `result`, `isLoading`, `error`, `onRetry`, `mode`, `onModeChange`, `highConfidenceOnly`, `onHighConfidenceOnlyChange`, `onViewHypothesis` all come in as props instead of an internal `useRecall` (Redux) hook.
- `HypothesisChat` takes `suggestions`, `emptySuggestionCount`, `followUpSuggestionCount`, and `isDarkMode` as props (with defaults) instead of importing `@/constants/hypothesis-chat.constants` and detecting theme via `next-themes`.
- `SlotDetailDialog`'s `recallSlot?: ReactNode` escape hatch is replaced with a fully-typed `recall?: Omit<RecallPanelProps, "hypothesisId" | "enabled">`, rendering the registry's own `RecallSection` instead of an opaque host-supplied node. `Hypothesis01` is updated to match: it now accepts and forwards this `recall` prop instead of the stale `recallSlot`.
- `SlotDetailDialog` no longer calls the nonexistent `@/hooks/use-export-html` / `@/hooks/use-hypothesis-detail-csv-export` (a Redux/domain-type violation and a build-breaking phantom import). Export is now fully host-owned via `onExportCsv?: () => void`, `onExportHtml?: () => void`, and `isExporting?: boolean`, matching `institutional-memory-01`'s `DecisionLogDetailDialog` convention. `Hypothesis01`'s `onPrepareDetailExport` is replaced with `onExportCsv`/`onExportHtml`/`isExporting`, scoped to the selected slot's hypothesis id.
- Fix a JSX indentation bug in `SlotDetailHeader`'s title span.
- Fix a duplicate `RequestQueuePanel.tsx` entry in `registry-item.json`'s `files[]`; register `chat/`, `recall/`, `chat-recall.types.ts`, `SlotDetailExportHeader.tsx`, and `SlotDetailExportPanels.tsx`.
- Add `react-markdown`, `echarts`, `echarts-for-react` to `dependencies`; add `@signalos/switch`, `@signalos/scroll-area`, `@signalos/dropdown-menu`, `@signalos/table` to `registryDependencies`.

## 0.4.5

- Move `stateConfig`, `stateBadgeVariant`, and `metricStatusColor` constants to `Hypothesis01.constants.ts`; expand `Hypothesis01.types.ts` with `EquilibriumSidebarProps`, `EquilibriumDetailSheetProps`, and related types.
- Slim down `EquilibriumSidebar` by extracting shared type definitions into the types file.

## 0.4.4

- format code
## 0.4.3
- Add `EquilibriumSidebar` component with entry cards, pipeline filter, and metric-deviation detail dialog
- Add `EquilibriumEntry`, `MetricDeviation`, `EligiblePipeline`, and `EquilibriumEqState` types to `Hypothesis01.types.ts`
- Wire equilibrium sidebar into `Hypothesis01`: the Equilibrium button toggles a collapsible side panel; new props `equilibriumOpen`, `onEquilibriumOpenChange`, `equilibriumEntries`, `equilibriumLoading`, `equilibriumPipelines`, `equilibriumSelectedPipelineId`, `onEquilibriumSelectPipeline`
- Add `@signalos/select` to `registryDependencies`

## 0.3.1
## 0.3.0
- Add grid view support — renders card grid when view is set to "grid"
- Conditionally render inbox icon only when inbox items exist
- Replace cross-block import (`formatRelativeTime` from `institutional-memory-01`) with local `formatRelative` util
- Replace raw color scales with semantic tokens (`bg-bg-error`, `text-text-error`, etc.)
- Remove dead internal `useState` from `AttentionSlotCard` list variant
- Fix `KVRow` highlight color to use semantic `text-text-error`

## 0.2.1
## 0.2.0
- Refactored all components to be fully props-driven and presentation-only
- Removed Redux dependencies from CollaboratorsPanel and ShareSlotDialog
- Removed external imports from ShareRequestsPanel (now self-contained)
- Deduplicated types file, added missing interfaces (SignalSummary, HypothesisEvidenceItem, UserSearchResult)
- Renamed componetns/ to components/ (typo fix)
- Added ScrollArea imports to SlotDetailDialog and SignalDetailMiniDialog
- Fixed slot:any type in HypothesisCard to use AttentionSlot
- Added missing formatShortDateTime import in HypothesisCard
- Registered all shipped component files in registry-item.json

## 0.1.1
