Institutional Memory-01

v0.5.4

Three-view hypothesis history page (expandable grid, list, table) with parent-controlled view switching and an optional slot-based dialog.

View as Markdown

Preview

Open full page ↗

Install & usage

npx shadcn@4.1.2 add @signalos/institutional-memory-01

Pulls the page source plus its widget dependencies (@signalos/tokens, @signalos/utils, @signalos/badge, @signalos/dialog, @signalos/table, @signalos/expandable-list, @signalos/page-header, @signalos/view-controler, @signalos/button, @signalos/card, @signalos/skeleton, @signalos/circular-progress, @signalos/activity-timeline, @signalos/data-table, @signalos/status-badge, @signalos/switch, @signalos/filter-toolbar, @signalos/metric-tile, @signalos/pagination, @signalos/dropdown-menu, @signalos/textarea, @signalos/tooltip, @signalos/combobox, @signalos/data-primitives, @signalos/input, @signalos/scroll-area) into your app - you own the copy. Requires access.

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

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

Props

EvidenceItem

PropTypeDefaultDescription
typestring | undefined-
signal_idstring | undefined-
metric_idstring | undefined-
labelstring | undefined-
baseline_idstring | undefined-
deviation_stdnumber | undefined-
sourcestring | undefined-

Signal

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*Severity-
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*"active" | "decayed"-
confidence_current*number-

Hypothesis

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*HypothesisStatus-
created_at*string-
updated_at*string-
confidence_initial*number-
decay_lambda*number-
severity*Severity-
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-

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-

DecisionLogEvent

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

DecisionLogGroup

PropTypeDefaultDescription
hypothesis*Hypothesis-
events*DecisionLogEvent[]-

HypothesisFeedback

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

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-

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-

PaginationConfig

PropTypeDefaultDescription
page*number-
pageSize*number-
total*number-
totalPages*number-
pageSizeOptionsnumber[] | undefined-
onPageChange*(page: number) => void-
onPageSizeChange*(pageSize: number) => void-

LinkableDecision

PropTypeDefaultDescription
id*string-
actionstring | null | undefined-
decided_atstring | null | undefined-
actual_outcomestring | null | undefined-
rewardnumber | null | undefined-
statusstring | null | undefined-

OutcomeApiError

PropTypeDefaultDescription
kind*"outage" | "refused" | "absent" | "unknown"-
detail*string-

LinkCandidateLike

PropTypeDefaultDescription
record_key*string-
titlestring | null | undefined-
descriptionstring | null | undefined-
statusstring | null | undefined-
score*number | null-
opened_atstring | null | undefined-
resolved_atstring | null | undefined-
gate_failurestring | null | undefined-
featuresCandidateFeaturesLike | null | undefined-

DecisionLinkLike

PropTypeDefaultDescription
state*DecisionLinkState-
record_keystring | null | undefined-
sor_tablestring | null | undefined-
sor_schemastring | null | undefined-
bound_bystring | null | undefined-
bound_atstring | null | undefined-
watch_expires_atstring | null | undefined-
time_boundedboolean | undefined-
featuresCandidateFeaturesLike | null | undefined-

DecisionLinkScanLike

PropTypeDefaultDescription
action*string-
reasonstring | null | undefined-
marginnumber | null | undefined-
proposed_keystring | null | undefined-
window_startstring | null | undefined-
window_endstring | null | undefined-

DecisionLinkRecordOption

PropTypeDefaultDescription
key*string-
title*string | null-
score*number | null-
gate*string | null-

DecisionLinkageLinkProps

PropTypeDefaultDescription
href*string-
classNamestring | undefined-
children*ReactNode-

DecisionLinkageProps

PropTypeDefaultDescription
decisions*LinkableDecision[]-Decisions taken on the current hypothesis; the panel renders nothing meaningful when empty.
selectedDecisionIdstring | null | undefined-The decision currently being adjudicated. Falls back to the first decision when omitted or stale.
onSelectDecision((decisionId: string) => void) | undefined-Called when the user switches which decision is being adjudicated.
linkDecisionLinkLike | null | undefined-The existing link for the selected decision, if any.
isLinkLoadingboolean | undefined-
linkErrorOutcomeApiError | null | undefined-
scanDecisionLinkScanLike | null | undefined-The most recent scan result for the selected decision.
isScanLoadingboolean | undefined-
scanErrorOutcomeApiError | null | undefined-
onScan(() => void) | undefined-Called to (re)scan the client's records for candidates. Omit to hide the control.
scoredCandidatesLinkCandidateLike[] | undefined-Ranked candidates from the scan.
gatedCandidatesLinkCandidateLike[] | undefined-Candidates the scan excluded before scoring.
selectedCandidateLinkCandidateLike | null | undefined-The candidate currently selected in the verdict form, if resolvable from `scoredCandidates`/`gatedCandidates`.
isAbstainingboolean | undefined-True when the automatic scan abstained rather than proposing a candidate.
needsConfigurationboolean | undefined-True when this decision's pipeline has no system of record configured.
hasScannedboolean | undefined-True once a scan has completed at least once for the selected decision.
isSettledboolean | undefined-True once the link and scan requests have both settled (success or error).
onPickCandidate((recordKey: string) => void) | undefined-Called when the user picks a candidate, from either the best-match tile or the picker dialog.
verdictDecisionLinkVerdict | undefined-Verdict form state, fully controlled by the caller.
onVerdictChange((verdict: DecisionLinkVerdict) => void) | undefined-
recordKeystring | undefined-
onRecordKeyChange((value: string) => void) | undefined-
notestring | undefined-
onNoteChange((value: string) => void) | undefined-
recordOptionsDecisionLinkRecordOption[] | undefined-The records the scan returned, which are the only bindable ones.
canSubmitVerdictboolean | undefined-
isSubmittingVerdictboolean | undefined-
verdictErrorOutcomeApiError | null | undefined-
isAlreadySettledErrorboolean | undefined-
lastVerdictAtstring | null | undefined-
onSubmitVerdict(() => void) | undefined-Called when the user submits the verdict form.
LinkComponentComponentType<DecisionLinkageLinkProps> | undefined-Renders the "Configure" link when a pipeline has no system of record. Omit to render plain text instead of a link.
systemOfRecordSettingsHrefstring | undefined-
classNamestring | undefined-

ChatVisualizationLike

PropTypeDefaultDescription
chart_type*string-
chart_json*Record<string, unknown>-
chart_insightsstring | null | undefined-

ChatMessage

PropTypeDefaultDescription
role*ChatRole-
content*string-
visualizationChatVisualizationLike | null | undefined-

ChatThinkingStep

PropTypeDefaultDescription
step*number-
toolName*string-
status*"done" | "pending"-
inferencestring | null | undefined-

ChatTurnMeta

PropTypeDefaultDescription
elapsedMs*number-
totalSteps*number-

ChatSuggestion

PropTypeDefaultDescription
id*string-
label*string-Short category chip, e.g. "Evidence".
question*string-

HypothesisChatProps

PropTypeDefaultDescription
messages*ChatMessage[]-
sessionTitlestring | null | undefined-
historyLoadingboolean | undefined-
historyErrorstring | null | undefined-
isStreamingboolean | undefined-
statusMessagestring | null | undefined-
thinkingStepsChatThinkingStep[] | undefined-
lastTurnMetaChatTurnMeta | null | undefined-
streamErrorstring | null | undefined-
onSendQuestion*(question: string) => void-
suggestionsChatSuggestion[] | undefined-Suggested questions offered on an empty thread and as follow-ups. Product copy - pass the caller's own set.
emptySuggestionCountnumber | undefined5Number of suggestions to show on an empty thread.
followUpSuggestionCountnumber | undefined3Number of suggestions to show as follow-up chips once a thread has messages.
isDarkModeboolean | undefinedfalseRenders chart/table/KPI payloads in dark colors. Pass the app's own dark-mode state - the panel does not detect theme itself.
classNamestring | undefined-

RecallPrecedentFeaturesLike

PropTypeDefaultDescription
relevance*number-
recency*number-
outcome_quality*number-
evidence*number-
reliabilitynumber | undefined-Source-trust weight. Present only for some sources.

RecallHypothesisSnapshotLike

PropTypeDefaultDescription
label*string-
descriptionstring | null | undefined-
hypothesis_idstring | null | undefined-Present when the originating hypothesis can still be drilled into.
source_connection_ids*string[]-

RecallPrecedentLike

PropTypeDefaultDescription
id*string-
score*number-
similarity*number | null-Cosine similarity (0..1), or null for a keyword-only hit.
created_atstring | null | undefined-
actionstring | null | undefined-
reinforcement_value*number-Positive = worked, negative = backfired, zero = neutral.
outcome_observed*boolean-
outcome_notesstring | null | undefined-
signal_types*string[]-
domain_tags*string[]-
features*RecallPrecedentFeaturesLike-
decision_idstring | null | undefined-
hypothesis_snapshot*RecallHypothesisSnapshotLike-

RecallOpenDecisionLike

PropTypeDefaultDescription
id*string-
hypothesis_id*string-
hypothesis_labelstring | null | undefined-
similarity*number | null-
decided_atstring | null | undefined-
actionstring | null | undefined-
statusstring | null | undefined-

RecallSummaryLike

PropTypeDefaultDescription
total*number-
worked*number-
backfired*number-
neutral*number-
avg_reward*number-
top_positive_actionstring | null | undefined-

RecallResult

PropTypeDefaultDescription
precedents*RecallPrecedentLike[]-
open_decisions*RecallOpenDecisionLike[]-
summary*RecallSummaryLike | null-

RecallPanelProps

PropTypeDefaultDescription
hypothesisId*string | null-
enabledboolean | undefinedtrueGate the fetch until the host is ready (e.g. the dialog is open).
variant"compact" | "full" | undefined"full"Inline card density.
previewCountnumber | undefined2Precedents shown inline before the "View all" affordance.
resultRecallResult | null | undefined-
isLoadingboolean | undefined-
errorstring | null | undefined-
onRetry(() => void) | undefined-
modeDecisionSearchMode | undefined"hybrid"
onModeChange((mode: DecisionSearchMode) => void) | undefined-
highConfidenceOnlyboolean | undefinedfalse
onHighConfidenceOnlyChange((value: boolean) => void) | undefined-
onViewHypothesis((hypothesisId: string) => void) | undefined-Opens the full institutional-memory detail for another hypothesis (a precedent's own, or an in-flight decision's). Omit to hide the affordance.

DecisionLogDetailDialogProps

PropTypeDefaultDescription
group*DecisionLogGroup | null-
open*boolean-
onOpenChange*(open: boolean) => void-
decisionsDecision[] | undefined-
feedbackHypothesisFeedback[] | undefined-
signalsSignal[] | undefined-
searchResultsDecisionSearchResult[] | undefined-
searchTotalnumber | undefined-
isSearchingboolean | undefined-
searchErrorstring | undefined-
onSearch((query: string, mode: DecisionSearchMode) => void) | undefined-
onSearchReset(() => void) | undefined-
similarDecisionsSimilarDecision[] | undefined-
isSimilarLoadingboolean | undefined-
similarErrorstring | undefined-
linkageDecisionLinkageProps | undefined-Outcome linkage panel props. Omit to hide the panel entirely.
onExportCsv(() => void) | undefined-Called to export the open hypothesis's details as CSV. Omit to hide the option.
onExportHtml(() => void) | undefined-Called to export the open hypothesis's details as HTML. Omit to hide the option.
isExportingboolean | undefined-When true, the export action shows a spinner and disables the trigger.
chatHypothesisChatProps | undefined-"Ask AI" chat panel props. Omit to hide the panel entirely.
recallOmit<RecallPanelProps, "hypothesisId" | "enabled"> | undefined-Recall (precedent search) panel props. `hypothesisId` and `enabled` are derived automatically from `group` and `open` - omit them here. Omit the whole prop to hide the panel.

DecisionLogSummary

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

InstitutionalMemory01Filters

PropTypeDefaultDescription
searchstring | undefined-
sortByDecisionLogSortByFilter | undefined-
severityDecisionLogSeverityFilter | undefined-
deadlineDecisionLogDeadlineFilter | undefined-

InstitutionalMemory01Props

PropTypeDefaultDescription
entries*DecisionLogGroup[]-Hypothesis groups to display, each pairing a hypothesis with its event log.
view*InstitutionalMemory01View-Currently active view mode. Controlled by the parent.
onViewChange*(view: InstitutionalMemory01View) => void-Called when the user switches view mode.
isLoadingboolean | undefined-When true, the list and metric tiles render in a loading skeleton state.
pagination*PaginationConfig-Pagination state and handlers. Always required — pass a no-op config when pagination is not needed.
dialogDecisionLogDetailDialogProps | undefined-Props for the optional detail dialog. Omit to disable the dialog entirely.
onViewDetail((group: DecisionLogGroup) => void) | undefined-Called when the user activates "view detail" on a hypothesis row. Omit to hide the affordance.
decisionsMapRecord<string, Decision[]> | undefined-Per-hypothesis decisions, keyed by hypothesis id. Managed by the container.
onExpand((hypothesisId: string) => void) | undefined-Called when a hypothesis row is expanded; container should fetch and store decisions.
titlestring | undefined"Institutional Memory"Page heading.
descriptionstring | undefined-Subheading shown below the title.
tableData*ColumnDef<DecisionLogGroup, unknown>[]-Column definitions for the table view. Required even if the table view is not the default.
summary*DecisionLogSummary | null-Metric tile summary values. Pass null to render tiles in loading state.
filtersInstitutionalMemory01Filters | undefined-Current toolbar filter values. Only include fields you want to control.
onFiltersChange((patch: Partial<InstitutionalMemory01Filters>) => void) | undefined-Called with a partial patch whenever the user changes a filter. Merging is the container's responsibility.
onRefresh(() => void) | undefined-Called when the user clicks the refresh button in the toolbar. Omit to hide the button.
isRefreshingboolean | undefined-When true, the refresh button shows a spinner.
filterSelectsreadonly FilterSelectGroup[] | undefined-Generic select dropdowns injected by the parent (e.g. owner, status).
activeMetricDecisionLogMetricFilter | null | undefined-Currently active metric tile filter (null = no filter).
onMetricClick((metric: DecisionLogMetricFilter | null) => void) | undefined-Called when a metric tile is clicked; container fetches filtered data.
toolbarExtrasReactNode-Additional content rendered inside the FilterToolbar (e.g. action buttons, toggles, badges).

Supporting types

export type InstitutionalMemory01View = "grid" | "list" | "table"
export type Severity = "info" | "low" | "medium" | "high" | "critical"
export type HypothesisStatus =
  "FORMING" | "SUFFICIENT" | "ROUTED" | "DECIDED" | "EXPIRED"
export type DecisionAction =
  "resolve" | "dismissed" | "escalate" | "schedule" | string
export type DecisionSearchMode = "hybrid" | "vector" | "keyword"
export type FeedbackVote = "agree" | "disagree" | "neutral"
export type DecisionLogEventType =
  | "hypothesis.created"
  | "hypothesis.routed"
  | "hypothesis.expired"
  | "signal.fired"
  | "decision.created"
  | "feedback.submitted"
  | string
export type DecisionLinkState =
  | "UNLINKED"
  | "PENDING_CREATION"
  | "BOUND"
  | "ABSTAINED"
  | "FALSE_ALARM"
  | "NO_RECORD"
export type CandidateFeaturesLike = Record<string, number | null | undefined>
export type DecisionLinkVerdict =
  "bind" | "rebind" | "pending" | "not_real" | "no_record" | "abstain"
export type ChatRole = "human" | "ai"
export type DecisionLogSortByFilter =
  "newest" | "urgency" | "deadline" | "confidence" | "severity"
export type DecisionLogSeverityFilter = "high" | "medium" | "low" | ""
export type DecisionLogDeadlineFilter = "24" | "48" | "72" | ""
export type DecisionLogMetricFilter =
  "total_hypotheses" | "needs_routing" | "high_severity" | "deadline_within_24h"

Changelog

0.5.4

  • Add DecisionLinkagePanel (and CandidateList, CandidatePickerDialog, FeatureVector, VerdictForm, a local InlineNotice) under components/linkage/, wired into DecisionLogDetailDialog via the new dialog.linkage prop (DecisionLinkageProps). All data-fetching, scan, and verdict-submission logic is the container's responsibility - the panel is fully props-in/events-out.
  • Fix DecisionLogDetailDialog referencing an undefined linkableDecisions and undefined export handlers. Export is now controlled via onExportCsv / onExportHtml / isExporting on dialog; the export menu renders only when at least one handler is provided.
  • Add LinkableDecision, OutcomeApiError, DecisionLinkState, CandidateFeaturesLike, LinkCandidateLike, DecisionLinkLike, DecisionLinkScanLike, DecisionLinkVerdict, DecisionLinkRecordOption, DecisionLinkageLinkProps, and DecisionLinkageProps to InstitutionalMemory01.types.ts.
  • Add @signalos/dropdown-menu, @signalos/textarea, @signalos/tooltip, @signalos/combobox, @signalos/data-primitives, @signalos/input to registryDependencies to match imports already used by the block.
  • Extract DecisionLogDetailHeader from DecisionLogDetailDialog (badges, title, export menu, close button) to stay under the 500-line ceiling.
  • Add the "Ask AI" chat panel (HypothesisChat and its ChatInput, ChatMessageBubble, ChatSuggestions, ChatThinkingTrace, ChatVisualization subcomponents, plus a local SectionHeading) under components/chat/, wired into DecisionLogDetailDialog via the new dialog.chat prop (HypothesisChatProps). Suggested questions and their counts are now caller-supplied props (suggestions, emptySuggestionCount, followUpSuggestionCount) instead of fixed content; dark-mode chart rendering is driven by the caller-supplied isDarkMode prop instead of reading theme state itself.
  • Add ChatRole, ChatVisualizationLike, ChatMessage, ChatThinkingStep, ChatTurnMeta, ChatSuggestion, and HypothesisChatProps to InstitutionalMemory01.types.ts.
  • Add lucide-react, @tanstack/react-table version pins plus react-markdown@^9.0.3, echarts@^6.1.0, echarts-for-react@^3.0.7 to dependencies.
  • Add the Recall (precedent search) panel (RecallPanel, RecallSection, RecallDialog, RecallSummaryChip, PrecedentCard, PrecedentDetail, OpenDecisionCard, FeatureMeter, recall-utils) under components/Recall/, wired into DecisionLogDetailDialog via the new dialog.recall prop (RecallPanelProps, omitting hypothesisId/enabled which the dialog derives itself). The panel no longer fetches through a Redux hook - result, isLoading, error, mode, highConfidenceOnly are all props, and onRetry / onModeChange / onHighConfidenceOnlyChange / onViewHypothesis are all caller-supplied callbacks that degrade gracefully when omitted.
  • Remove HypothesisDetailDialog: it depended directly on next/dynamic, @/store, and a Redux decision-log slice to self-fetch and re-open a hypothesis's detail. Drilling into another hypothesis from a precedent or an in-flight decision is now the plain onViewHypothesis(hypothesisId) callback on dialog.recall - the container decides how to open that hypothesis's own detail dialog.
  • Add RecallPrecedentFeaturesLike, RecallHypothesisSnapshotLike, RecallPrecedentLike, RecallOpenDecisionLike, RecallSummaryLike, RecallResult, and RecallPanelProps to InstitutionalMemory01.types.ts. RecallPanelProps.mode reuses the existing DecisionSearchMode type rather than a duplicate.
  • Fix a raw-scale token usage in RecallSummaryChip (bg-success-500/bg-error-500 → bg-status-success/bg-status-error).
  • Add @signalos/scroll-area to registryDependencies for RecallDialog's scrollable list.

0.4.4

  • Initial full implementation: InstitutionalMemory01 block with DecisionLogDetailDialog, DecisionLogSidebarPanels, FeedbackTimeline, FeedbackCard, FeedbackError, EvidenceCardWithClick, HypothesisDecisionSearch, SignalDetailMiniDialog, SimilarDecisionsPanel, and TableView subcomponents.
  • Add DecisionLogEvent / DecisionLogEventType types and events, act_by_reason, act_by_deadline fields to InstitutionalMemory01.types.ts.

0.4.3

  • Fix cross-item imports to use canonical @/components paths; add missing signalos.category to manifests.

institutional-memory-01

0.4.2

  • Replace raw scale tokens with semantic tokens.

0.4.1

  • Updated component content.

0.4.0

  • Wire onMetricClick and activeMetric props to MetricTile onClick handlers; metric tiles now toggle the active filter correctly instead of doing nothing.
  • Fix dead onViewDetail fallbacks in grid and list views — affordance is now hidden (passes undefined) when the callback is not provided.
  • Fix TableView pagination type mismatch: local PaginationConfig with onRowsPerPageChange replaced by the shared type from InstitutionalMemory01.types.ts (onPageSizeChange); page-size changes now reach DataTable.
  • Replace all raw Tailwind palette classes in InstitutionalMemory01.utils.ts (bg-red-600/15, text-red-500, bg-amber-500/20, text-success-500, bg-error-500, etc.) with semantic tokens (bg-bg-error, text-text-error, bg-bg-warning, text-text-warning, text-text-success, bg-status-error, bg-status-warning).
  • Remove duplicate inline constant arrays from InstitutionalMemory01.tsx; import SORT_BY_OPTIONS, SEVERITY_OPTIONS, DEADLINE_OPTIONS from InstitutionalMemory01.constants.ts. Add InstitutionalMemory01.constants.ts to shipped files[].
  • Add JSDoc to all previously undocumented props in InstitutionalMemory01Props.
  • Expand test suite: add coverage for isLoading state, onFiltersChange, onRefresh, onMetricClick fire, and onMetricClick toggle-off.

0.3.4

  • Unit test case issue fix

0.3.3

  • Added @signalos/switch registry dependency; preview toolbar uses Switch component.

0.3.1

  • Refactored to fully presentational: block now accepts entries: DecisionLogGroup[] instead of ExpandableListDefaultItem[], converting to list items internally.
  • All API types (blackboard, hypothesis, signal, decision, feedback, search) moved into InstitutionalMemory01.types.ts; removed all backend/Redux dependencies.
  • DecisionLogDetailDialog receives all data via props: decisions, feedback, signals, searchResults, similarDecisions, and loading/error states.
  • HypothesisDecisionSearch manages its own input/mode state; fires onSearch/onReset callbacks to parent.
  • SimilarDecisionsPanel is now fully prop-driven (results, isLoading, error).
  • EvidenceCardWithClick accepts signal prop directly instead of reading from a Redux selector.
  • FeedbackCard / HypothesisFeedbackPanel removed hypothesisId requirement; accepts decisions array only.
  • Removed ScrollArea dependency (replaced with native overflow scroll); no new registry deps added.
  • InstitutionalMemory01.utils.ts no longer imports backend types; severity helpers are self-contained.
  • Preview updated with realistic mock DecisionLogGroup data.

0.2.0

  • Refactored to be fully prop-driven: items, view, onViewChange, onViewDetail, and dialog all passed from parent.
  • Added list view (simple bordered rows with category/severity badges).
  • Added table view (ID, title, category, severity, status columns).
  • Added parent-controlled slot-based dialog (open, onOpenChange, title, ReactNode content).
  • Extracted InstitutionalMemory01.types.ts with typed interfaces for all props.

0.1.0

  • Initial release: centered-card sign-in page composed from @signalos primitives (input, label, checkbox, button) with error/loading states and brand/footer slots.