Hypothesis 01 - Review queue

v0.5.5

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.

View as Markdown

Preview

Open full page ↗

Install & usage

npx shadcn@4.1.2 add @signalos/hypothesis-01

Pulls the page source plus its widget dependencies (@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) into your app - you own the copy. Requires access.

usage
// 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

MetricDeviation

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

EquilibriumEntry

PropTypeDefaultDescription
id*string-
equilibrium_id*string-
domain*string-
state*EquilibriumEqState-
balance_score*number-0–1 composite balance score.
previous_score*number | null-
previous_state*EquilibriumEqState | null-
drift_velocity*number-Rate of change per hour (positive = improving).
metric_deviations*Record<string, MetricDeviation>-
computed_at*string-
updated_at*string-

EligiblePipeline

PropTypeDefaultDescription
pipeline_id*string-
pipeline_name*string-

EquilibriumSidebarProps

PropTypeDefaultDescription
entriesEquilibriumEntry[] | undefined-Equilibrium entries to display.
isLoadingboolean | undefined-Shows skeleton cards while data loads.
pipelinesEligiblePipeline[] | undefined-Pipeline filter options; omit to hide the picker.
selectedPipelineIdstring | null | undefined-Currently selected pipeline id, or null for all.
onSelectPipeline((pipelineId: string | null) => void) | undefined-Fired when the user changes the pipeline filter.
classNamestring | undefined-
data-testidstring | undefined-Test identifier rendered as `data-testid` on the root element.

EquilibriumDetailSheetProps

PropTypeDefaultDescription
entryEquilibriumEntry | null | undefined-
openboolean | undefined-
onOpenChange((open: boolean) => void) | undefined-

DecisionFormValues

PropTypeDefaultDescription
rationale*string-
expected_outcomestring | undefined-
expected_outcome_bystring | undefined-
dismiss_reasonstring | undefined-
resolutionstring | undefined-
reasonstring | null | undefined-

ContributingSignal

PropTypeDefaultDescription
role*string-
cluster*string-
deviation*number-
metric_id*string-
signal_id*string-
confidence*number-

SignalSummary

PropTypeDefaultDescription
labelstring | undefined-
caggnumber | undefined-
sufficiencynumber | undefined-
signal_countnumber | undefined-
severitySeverityLevel | undefined-
domainstring | undefined-
clusterstring | undefined-
equilibrium_statestring | undefined-
contributing_signalsContributingSignal[] | undefined-

WorkItem

PropTypeDefaultDescription
id*string-
executive_id*string-
hypothesis_id*string-
priority_rank*number-
priority_score*number-
signal_summary*SignalSummary-
escalation_deadline*string | null-
escalated_from*string | null-
status*SlotStatus-
closed_reason*string | null-
created_at*string-
updated_at*string-
decayed_at*string | null-
act_by_deadline*string | null-
severity*SeverityLevel | null-
confidence_initial*number | null-
confidence_current*number | null-
swap_out_slot_idstring | null | undefined-

WorkItemListResponse

PropTypeDefaultDescription
total*number-
slots*WorkItem[]-

WorkItemListFilters

PropTypeDefaultDescription
executive_idstring | undefined-
slot_statusSlotStatus[] | undefined-
limitnumber | undefined-

EvidenceItem

PropTypeDefaultDescription
typestring | undefined-
rolestring | undefined-
deviationnumber | undefined-
metric_idstring | undefined-

DetailRecord

PropTypeDefaultDescription
id*string-
label*string-
description*string-
domain*string-
cluster*string-
signal_ids*string[]-
cagg*number-
sufficiency_score*number-
evidence*EvidenceItem[]-
routed*boolean-
routed_to*string | null-
status*DetailRecordStatus-
created_at*string-
updated_at*string-
confidence_initial*number-
decay_lambda*number-
severity*SeverityLevel-
target_roles*string[]-
suggested_actions*string[]-
tags*string[]-
decayed_at*string | null-
expire_reason*string | null-
confidence_current*number-
refined_by_llmboolean | undefined-
refinement_confidencenumber | null | undefined-
refinement_reasoningstring | null | undefined-
refinement_dropped_signal_idsstring[] | null | undefined-
refinement_dropped_reasoningRecord<string, unknown> | null | undefined-
refinement_modelstring | null | undefined-
act_by_deadlinestring | null | undefined-
act_by_sourcestring | null | undefined-
act_by_reasonstring | null | undefined-
act_by_confidencenumber | null | undefined-

DetailRecordListResponse

PropTypeDefaultDescription
total*number-
hypotheses*DetailRecord[]-

DetailRecordListFilters

PropTypeDefaultDescription
hyp_statusDetailRecordStatus | undefined-
domainstring | undefined-
clusterstring | undefined-
severitySeverityLevel | undefined-
limitnumber | undefined-
offsetnumber | undefined-

SignalRecord

PropTypeDefaultDescription
id*string-
signal_id*string-
domain*string-
cluster*string-
metric_id*string-
signal_type*string-
crlb_score*number-
initial_crlb_score*number-
reinforcement_term*number-
decay_lambda*number-
deviation_std*number-
source_connector_id*string | null-
source_connector_type*string | null-
severity*SeverityLevel-
payload*Record<string, unknown>-
observation_ids*string[]-
baseline_id*string | null-
dimension_key*Record<string, unknown>-
target_roles*string[]-
tags*string[]-
embedding*number[] | null-
fired_at*string-
expires_at*string | null-
status*SignalRecordStatus-
confidence_current*number-

SignalRecordListResponse

PropTypeDefaultDescription
total*number-
signals*SignalRecord[]-

Baseline

PropTypeDefaultDescription
id*string-
metric_id*string-
mean*number-
stddev*number-
window*string-
sample_count*number-
computed_at*string-

MetricObservation

PropTypeDefaultDescription
id*string-
metric_id*string-
value*number-
observed_at*string-
dimension_key*Record<string, unknown>-
source_connector_id*string | null-

MetricObservationsResponse

PropTypeDefaultDescription
total*number-
observations*MetricObservation[]-

TransferOffer

PropTypeDefaultDescription
id*string-
slot_id*string-
from_user_id*string-
to_user_id*string-
reason*string | null-
status*TransferOfferStatus-
swap_out_slot_id*string | null-
expires_at*string-
created_at*string-
responded_at*string | null-

TransferResponse

PropTypeDefaultDescription
offer*TransferOffer-
slot*WorkItem-
immediate*boolean-

TransferListItem

PropTypeDefaultDescription
offer*TransferOffer-
slot*WorkItem-

TransferListPendingResponse

PropTypeDefaultDescription
incoming*TransferListItem[]-
outgoing*TransferListItem[]-

Share

PropTypeDefaultDescription
id*string-
slot_id*string-
owner_id*string-
collaborator_id*string-
message*string | null-
status*ShareStatus-
expires_at*string | null-
created_at*string-
responded_at*string | null-

ShareResponse

PropTypeDefaultDescription
share*Share-
slot*WorkItem-

ShareWithSlot

PropTypeDefaultDescription
share*Share-
slot*WorkItem-

SharePendingResponse

PropTypeDefaultDescription
incoming*ShareWithSlot[]-
outgoing*ShareWithSlot[]-

SharedWithMeResponse

PropTypeDefaultDescription
total*number-
shares*ShareWithSlot[]-

Collaborator

PropTypeDefaultDescription
share_id*string-
collaborator_id*string-
message*string | null-
created_at*string-
responded_at*string | null-

CollaboratorsResponse

PropTypeDefaultDescription
collaborators*Collaborator[]-
pending_invites*Collaborator[]-

ShareInvitePayload

PropTypeDefaultDescription
collaborator_id*string-
messagestring | null | undefined-

DecisionRequest

PropTypeDefaultDescription
hypothesis_id*string-
user_id*string-
role*string-
action*string-
rationale*string-
expected_outcomestring | null | undefined-
expected_outcome_bystring | null | undefined-
dismiss_reasonstring | null | undefined-
resolutionstring | null | undefined-
confidence_at_decisionnumber | null | undefined-
priority_score_at_decisionnumber | null | undefined-

DecisionRecord

PropTypeDefaultDescription
id*string-
hypothesis_id*string-
user_id*string-
role*string-
action*string-
rationale*string-
expected_outcome*string | null-
expected_outcome_by*string | null-
dismiss_reason*string | null-
resolution*string | null-
confidence_at_decision*number | null-
priority_score_at_decision*number | null-
created_at*string-

DecisionLogEvent

PropTypeDefaultDescription
event_type*string-
occurred_at*string-
actor_id*string | null-
summary*string-
payload*Record<string, unknown>-

DecisionLogGroup

PropTypeDefaultDescription
hypothesis*DetailRecord-
events*DecisionLogEvent[]-

DecisionLogSummary

PropTypeDefaultDescription
total_hypotheses*number-
needs_routing*number-
high_severity*number-
deadline_within_24h*number-

DecisionLogResponse

PropTypeDefaultDescription
totalnumber | undefined-
entries*DecisionLogGroup[]-
summaryDecisionLogSummary | undefined-

DecisionLogFilters

PropTypeDefaultDescription
executive_idstring | undefined-
user_idstring | undefined-
hypothesis_idstring | undefined-
event_typestring | undefined-
sincestring | undefined-
untilstring | undefined-
severity("low" | "medium" | "high")[] | undefined-
status("FORMING" | "SUFFICIENT" | "ROUTED" | "DECIDED" | "EXPIRED" | "PENDING")[] | undefined-
routedboolean | undefined-
needs_routingboolean | undefined-
deadline_within_hoursnumber | undefined-
min_confidencenumber | undefined-
max_confidencenumber | undefined-
qstring | undefined-
sort_byDecisionLogSortBy | undefined-
sort_orderDecisionLogSortOrder | undefined-
limitnumber | undefined-
offsetnumber | undefined-
include_countsboolean | undefined-

FeedbackEntry

PropTypeDefaultDescription
id*string-
hypothesis_id*string-
user_id*string-
feedback_text*string-
vote*FeedbackVote-
created_at*string-
updated_at*string-

FeedbackEntryResponse

PropTypeDefaultDescription
total*number-
feedback*FeedbackEntry[]-

FeedbackEntryCreate

PropTypeDefaultDescription
feedback_text*string-
vote*FeedbackVote-

DecayTick

PropTypeDefaultDescription
hypothesis_id*string-
current_c*number-
ttl_hours*number-

Decision

PropTypeDefaultDescription
id*string-
hypothesis_id*string-
action*string-
rationale*string-
resolution*string | null-
expected_outcome*string-
expected_outcome_by*string-
decided_at*string-
confidence_at_decision*number-
priority_score_at_decision*number-
role*string | null-
user_id*string-
dismiss_reason*string | null-

DecisionReponse

PropTypeDefaultDescription
totalnumber | null | undefined-
decisions*Decision[] | null-

SimilarDecision

PropTypeDefaultDescription
id*string-
hypothesis_idstring | null | undefined-
hypothesis_labelstring | null | undefined-
actionstring | null | undefined-
statusstring | null | undefined-
rationalestring | null | undefined-
resolutionstring | null | undefined-
decided_atstring | null | undefined-
vec_similarity*number-

SimilarDecisionsResponse

PropTypeDefaultDescription
decision_id*string-
total*number-
results*SimilarDecision[]-

DecisionSearchRequest

PropTypeDefaultDescription
query*string-
modeDecisionSearchMode | undefined-
limitnumber | undefined-
user_idstring | undefined-
rolestring | undefined-
actionstring | undefined-
statusstring | undefined-
hypothesis_idstring | undefined-
sincestring | undefined-
untilstring | undefined-

DecisionSearchResult

PropTypeDefaultDescription
id*string-
hypothesis_idstring | null | undefined-
hypothesis_labelstring | null | undefined-
user_idstring | null | undefined-
rolestring | null | undefined-
actionstring | null | undefined-
statusstring | null | undefined-
rationalestring | null | undefined-
expected_outcomestring | null | undefined-
resolutionstring | null | undefined-
dismiss_reasonstring | null | undefined-
confidence_at_decisionnumber | null | undefined-
priority_score_at_decisionnumber | null | undefined-
decided_atstring | null | undefined-
scorenumber | null | undefined-
vec_similaritynumber | null | undefined-
keyword_ranknumber | null | undefined-

DecisionSearchResponse

PropTypeDefaultDescription
query*string-
mode*DecisionSearchMode-
total*number-
results*DecisionSearchResult[]-

UserSearchResult

PropTypeDefaultDescription
id*string-
full_name*string-
email*string-

AttentionSlot

PropTypeDefaultDescription
id*string-
executive_id*string-
hypothesis_id*string-
priority_rank*number-
priority_score*number-
signal_summary*SignalSummary-
escalation_deadline*string | null-
escalated_from*string | null-
status*SlotStatus-
closed_reason*string | null-
created_at*string-
updated_at*string-
decayed_at*string | null-
act_by_deadline*string | null-
severity*SeverityLevel | null-
confidence_initial*number | null-
confidence_current*number | null-
swap_out_slot_idstring | null | undefined-

Supporting types

export type SeverityLevel = "info" | "low" | "medium" | "high" | "critical"
export type EquilibriumEqState =
  "CRITICAL" | "INTERVENTION" | "DRIFTING" | "STABLE"
export type DetailRecordStatus =
  "FORMING" | "SUFFICIENT" | "ROUTED" | "DECIDED" | "EXPIRED"
export type SignalRecordStatus = "active" | "decayed"
export type SlotStatus = "ACTIVE" | "IN_PROGRESS" | "EXPIRED" | "ESCALATED"
export type DecisionAction =
  "resolve" | "dismissed" | "escalate" | "schedule" | string
export type DecisionActionType = "resolve" | "dismissed" | "escalate"
export type TransferOfferStatus =
  "PENDING" | "ACCEPTED" | "DECLINED" | "EXPIRED" | "CANCELED" | "WITHDRAWN"
export type ShareStatus =
  "PENDING" | "ACCEPTED" | "DECLINED" | "EXPIRED" | "REVOKED" | "CANCELED"
export type ShareDirection = "both" | "incoming" | "outgoing"
export type DecisionLogEventType =
  | "hypothesis.created"
  | "hypothesis.routed"
  | "hypothesis.expired"
  | "signal.fired"
  | "decision.created"
  | "feedback.submitted"
  | string
export type DecisionLogSortBy =
  "newest" | "urgency" | "deadline" | "confidence" | "severity"
export type DecisionLogSortOrder = "asc" | "desc"
export type FeedbackVote = "agree" | "disagree" | "neutral"
export type DecisionSearchMode = "hybrid" | "vector" | "keyword"

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