Institutional Memory-01
v0.5.4Three-view hypothesis history page (expandable grid, list, table) with parent-controlled view switching and an optional slot-based dialog.
Preview
Install & usage
npx shadcn@4.1.2 add @signalos/institutional-memory-01Pulls 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.
// 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
| Prop | Type | Default | Description |
|---|---|---|---|
| type | string | undefined | - | |
| signal_id | string | undefined | - | |
| metric_id | string | undefined | - | |
| label | string | undefined | - | |
| baseline_id | string | undefined | - | |
| deviation_std | number | undefined | - | |
| source | string | undefined | - |
Signal
| Prop | Type | Default | Description |
|---|---|---|---|
| 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
| Prop | Type | Default | Description |
|---|---|---|---|
| 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_llm | boolean | undefined | - | |
| refinement_confidence | number | null | undefined | - | |
| refinement_reasoning | string | null | undefined | - | |
| refinement_dropped_signal_ids | string[] | null | undefined | - | |
| refinement_dropped_reasoning | Record<string, unknown> | null | undefined | - | |
| refinement_model | string | null | undefined | - | |
| act_by_deadline | string | null | undefined | - | |
| act_by_source | string | null | undefined | - | |
| act_by_reason | string | null | undefined | - | |
| act_by_confidence | number | null | undefined | - |
Decision
| Prop | Type | Default | Description |
|---|---|---|---|
| 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
| Prop | Type | Default | Description |
|---|---|---|---|
| event_type* | string | - | |
| occurred_at* | string | - | |
| actor_id* | string | null | - | |
| summary* | string | - | |
| payload* | Record<string, unknown> | - |
DecisionLogGroup
| Prop | Type | Default | Description |
|---|---|---|---|
| hypothesis* | Hypothesis | - | |
| events* | DecisionLogEvent[] | - |
HypothesisFeedback
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| hypothesis_id* | string | - | |
| user_id* | string | - | |
| feedback_text* | string | - | |
| vote* | FeedbackVote | - | |
| created_at* | string | - | |
| updated_at* | string | - |
DecisionSearchResult
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| hypothesis_id | string | null | undefined | - | |
| hypothesis_label | string | null | undefined | - | |
| user_id | string | null | undefined | - | |
| role | string | null | undefined | - | |
| action | string | null | undefined | - | |
| status | string | null | undefined | - | |
| rationale | string | null | undefined | - | |
| expected_outcome | string | null | undefined | - | |
| resolution | string | null | undefined | - | |
| dismiss_reason | string | null | undefined | - | |
| confidence_at_decision | number | null | undefined | - | |
| priority_score_at_decision | number | null | undefined | - | |
| decided_at | string | null | undefined | - | |
| score | number | null | undefined | - | |
| vec_similarity | number | null | undefined | - | |
| keyword_rank | number | null | undefined | - |
SimilarDecision
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| hypothesis_id | string | null | undefined | - | |
| hypothesis_label | string | null | undefined | - | |
| action | string | null | undefined | - | |
| status | string | null | undefined | - | |
| rationale | string | null | undefined | - | |
| resolution | string | null | undefined | - | |
| decided_at | string | null | undefined | - | |
| vec_similarity* | number | - |
PaginationConfig
| Prop | Type | Default | Description |
|---|---|---|---|
| page* | number | - | |
| pageSize* | number | - | |
| total* | number | - | |
| totalPages* | number | - | |
| pageSizeOptions | number[] | undefined | - | |
| onPageChange* | (page: number) => void | - | |
| onPageSizeChange* | (pageSize: number) => void | - |
LinkableDecision
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| action | string | null | undefined | - | |
| decided_at | string | null | undefined | - | |
| actual_outcome | string | null | undefined | - | |
| reward | number | null | undefined | - | |
| status | string | null | undefined | - |
OutcomeApiError
| Prop | Type | Default | Description |
|---|---|---|---|
| kind* | "outage" | "refused" | "absent" | "unknown" | - | |
| detail* | string | - |
LinkCandidateLike
| Prop | Type | Default | Description |
|---|---|---|---|
| record_key* | string | - | |
| title | string | null | undefined | - | |
| description | string | null | undefined | - | |
| status | string | null | undefined | - | |
| score* | number | null | - | |
| opened_at | string | null | undefined | - | |
| resolved_at | string | null | undefined | - | |
| gate_failure | string | null | undefined | - | |
| features | CandidateFeaturesLike | null | undefined | - |
DecisionLinkLike
| Prop | Type | Default | Description |
|---|---|---|---|
| state* | DecisionLinkState | - | |
| record_key | string | null | undefined | - | |
| sor_table | string | null | undefined | - | |
| sor_schema | string | null | undefined | - | |
| bound_by | string | null | undefined | - | |
| bound_at | string | null | undefined | - | |
| watch_expires_at | string | null | undefined | - | |
| time_bounded | boolean | undefined | - | |
| features | CandidateFeaturesLike | null | undefined | - |
DecisionLinkScanLike
| Prop | Type | Default | Description |
|---|---|---|---|
| action* | string | - | |
| reason | string | null | undefined | - | |
| margin | number | null | undefined | - | |
| proposed_key | string | null | undefined | - | |
| window_start | string | null | undefined | - | |
| window_end | string | null | undefined | - |
DecisionLinkRecordOption
| Prop | Type | Default | Description |
|---|---|---|---|
| key* | string | - | |
| title* | string | null | - | |
| score* | number | null | - | |
| gate* | string | null | - |
DecisionLinkageLinkProps
| Prop | Type | Default | Description |
|---|---|---|---|
| href* | string | - | |
| className | string | undefined | - | |
| children* | ReactNode | - |
DecisionLinkageProps
| Prop | Type | Default | Description |
|---|---|---|---|
| decisions* | LinkableDecision[] | - | Decisions taken on the current hypothesis; the panel renders nothing meaningful when empty. |
| selectedDecisionId | string | 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. |
| link | DecisionLinkLike | null | undefined | - | The existing link for the selected decision, if any. |
| isLinkLoading | boolean | undefined | - | |
| linkError | OutcomeApiError | null | undefined | - | |
| scan | DecisionLinkScanLike | null | undefined | - | The most recent scan result for the selected decision. |
| isScanLoading | boolean | undefined | - | |
| scanError | OutcomeApiError | null | undefined | - | |
| onScan | (() => void) | undefined | - | Called to (re)scan the client's records for candidates. Omit to hide the control. |
| scoredCandidates | LinkCandidateLike[] | undefined | - | Ranked candidates from the scan. |
| gatedCandidates | LinkCandidateLike[] | undefined | - | Candidates the scan excluded before scoring. |
| selectedCandidate | LinkCandidateLike | null | undefined | - | The candidate currently selected in the verdict form, if resolvable from `scoredCandidates`/`gatedCandidates`. |
| isAbstaining | boolean | undefined | - | True when the automatic scan abstained rather than proposing a candidate. |
| needsConfiguration | boolean | undefined | - | True when this decision's pipeline has no system of record configured. |
| hasScanned | boolean | undefined | - | True once a scan has completed at least once for the selected decision. |
| isSettled | boolean | 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. |
| verdict | DecisionLinkVerdict | undefined | - | Verdict form state, fully controlled by the caller. |
| onVerdictChange | ((verdict: DecisionLinkVerdict) => void) | undefined | - | |
| recordKey | string | undefined | - | |
| onRecordKeyChange | ((value: string) => void) | undefined | - | |
| note | string | undefined | - | |
| onNoteChange | ((value: string) => void) | undefined | - | |
| recordOptions | DecisionLinkRecordOption[] | undefined | - | The records the scan returned, which are the only bindable ones. |
| canSubmitVerdict | boolean | undefined | - | |
| isSubmittingVerdict | boolean | undefined | - | |
| verdictError | OutcomeApiError | null | undefined | - | |
| isAlreadySettledError | boolean | undefined | - | |
| lastVerdictAt | string | null | undefined | - | |
| onSubmitVerdict | (() => void) | undefined | - | Called when the user submits the verdict form. |
| LinkComponent | ComponentType<DecisionLinkageLinkProps> | undefined | - | Renders the "Configure" link when a pipeline has no system of record. Omit to render plain text instead of a link. |
| systemOfRecordSettingsHref | string | undefined | - | |
| className | string | undefined | - |
ChatVisualizationLike
| Prop | Type | Default | Description |
|---|---|---|---|
| chart_type* | string | - | |
| chart_json* | Record<string, unknown> | - | |
| chart_insights | string | null | undefined | - |
ChatMessage
| Prop | Type | Default | Description |
|---|---|---|---|
| role* | ChatRole | - | |
| content* | string | - | |
| visualization | ChatVisualizationLike | null | undefined | - |
ChatThinkingStep
| Prop | Type | Default | Description |
|---|---|---|---|
| step* | number | - | |
| toolName* | string | - | |
| status* | "done" | "pending" | - | |
| inference | string | null | undefined | - |
ChatTurnMeta
| Prop | Type | Default | Description |
|---|---|---|---|
| elapsedMs* | number | - | |
| totalSteps* | number | - |
ChatSuggestion
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| label* | string | - | Short category chip, e.g. "Evidence". |
| question* | string | - |
HypothesisChatProps
| Prop | Type | Default | Description |
|---|---|---|---|
| messages* | ChatMessage[] | - | |
| sessionTitle | string | null | undefined | - | |
| historyLoading | boolean | undefined | - | |
| historyError | string | null | undefined | - | |
| isStreaming | boolean | undefined | - | |
| statusMessage | string | null | undefined | - | |
| thinkingSteps | ChatThinkingStep[] | undefined | - | |
| lastTurnMeta | ChatTurnMeta | null | undefined | - | |
| streamError | string | null | undefined | - | |
| onSendQuestion* | (question: string) => void | - | |
| suggestions | ChatSuggestion[] | undefined | - | Suggested questions offered on an empty thread and as follow-ups. Product copy - pass the caller's own set. |
| emptySuggestionCount | number | undefined | 5 | Number of suggestions to show on an empty thread. |
| followUpSuggestionCount | number | undefined | 3 | Number of suggestions to show as follow-up chips once a thread has messages. |
| isDarkMode | boolean | undefined | false | Renders chart/table/KPI payloads in dark colors. Pass the app's own dark-mode state - the panel does not detect theme itself. |
| className | string | undefined | - |
RecallPrecedentFeaturesLike
| Prop | Type | Default | Description |
|---|---|---|---|
| relevance* | number | - | |
| recency* | number | - | |
| outcome_quality* | number | - | |
| evidence* | number | - | |
| reliability | number | undefined | - | Source-trust weight. Present only for some sources. |
RecallHypothesisSnapshotLike
| Prop | Type | Default | Description |
|---|---|---|---|
| label* | string | - | |
| description | string | null | undefined | - | |
| hypothesis_id | string | null | undefined | - | Present when the originating hypothesis can still be drilled into. |
| source_connection_ids* | string[] | - |
RecallPrecedentLike
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| score* | number | - | |
| similarity* | number | null | - | Cosine similarity (0..1), or null for a keyword-only hit. |
| created_at | string | null | undefined | - | |
| action | string | null | undefined | - | |
| reinforcement_value* | number | - | Positive = worked, negative = backfired, zero = neutral. |
| outcome_observed* | boolean | - | |
| outcome_notes | string | null | undefined | - | |
| signal_types* | string[] | - | |
| domain_tags* | string[] | - | |
| features* | RecallPrecedentFeaturesLike | - | |
| decision_id | string | null | undefined | - | |
| hypothesis_snapshot* | RecallHypothesisSnapshotLike | - |
RecallOpenDecisionLike
| Prop | Type | Default | Description |
|---|---|---|---|
| id* | string | - | |
| hypothesis_id* | string | - | |
| hypothesis_label | string | null | undefined | - | |
| similarity* | number | null | - | |
| decided_at | string | null | undefined | - | |
| action | string | null | undefined | - | |
| status | string | null | undefined | - |
RecallSummaryLike
| Prop | Type | Default | Description |
|---|---|---|---|
| total* | number | - | |
| worked* | number | - | |
| backfired* | number | - | |
| neutral* | number | - | |
| avg_reward* | number | - | |
| top_positive_action | string | null | undefined | - |
RecallResult
| Prop | Type | Default | Description |
|---|---|---|---|
| precedents* | RecallPrecedentLike[] | - | |
| open_decisions* | RecallOpenDecisionLike[] | - | |
| summary* | RecallSummaryLike | null | - |
RecallPanelProps
| Prop | Type | Default | Description |
|---|---|---|---|
| hypothesisId* | string | null | - | |
| enabled | boolean | undefined | true | Gate the fetch until the host is ready (e.g. the dialog is open). |
| variant | "compact" | "full" | undefined | "full" | Inline card density. |
| previewCount | number | undefined | 2 | Precedents shown inline before the "View all" affordance. |
| result | RecallResult | null | undefined | - | |
| isLoading | boolean | undefined | - | |
| error | string | null | undefined | - | |
| onRetry | (() => void) | undefined | - | |
| mode | DecisionSearchMode | undefined | "hybrid" | |
| onModeChange | ((mode: DecisionSearchMode) => void) | undefined | - | |
| highConfidenceOnly | boolean | undefined | false | |
| 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
| Prop | Type | Default | Description |
|---|---|---|---|
| group* | DecisionLogGroup | null | - | |
| open* | boolean | - | |
| onOpenChange* | (open: boolean) => void | - | |
| decisions | Decision[] | undefined | - | |
| feedback | HypothesisFeedback[] | undefined | - | |
| signals | Signal[] | undefined | - | |
| searchResults | DecisionSearchResult[] | undefined | - | |
| searchTotal | number | undefined | - | |
| isSearching | boolean | undefined | - | |
| searchError | string | undefined | - | |
| onSearch | ((query: string, mode: DecisionSearchMode) => void) | undefined | - | |
| onSearchReset | (() => void) | undefined | - | |
| similarDecisions | SimilarDecision[] | undefined | - | |
| isSimilarLoading | boolean | undefined | - | |
| similarError | string | undefined | - | |
| linkage | DecisionLinkageProps | 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. |
| isExporting | boolean | undefined | - | When true, the export action shows a spinner and disables the trigger. |
| chat | HypothesisChatProps | undefined | - | "Ask AI" chat panel props. Omit to hide the panel entirely. |
| recall | Omit<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
| Prop | Type | Default | Description |
|---|---|---|---|
| total_hypotheses* | number | - | |
| needs_routing* | number | - | |
| high_severity* | number | - | |
| deadline_within_24h* | number | - |
InstitutionalMemory01Filters
| Prop | Type | Default | Description |
|---|---|---|---|
| search | string | undefined | - | |
| sortBy | DecisionLogSortByFilter | undefined | - | |
| severity | DecisionLogSeverityFilter | undefined | - | |
| deadline | DecisionLogDeadlineFilter | undefined | - |
InstitutionalMemory01Props
| Prop | Type | Default | Description |
|---|---|---|---|
| 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. |
| isLoading | boolean | 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. |
| dialog | DecisionLogDetailDialogProps | 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. |
| decisionsMap | Record<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. |
| title | string | undefined | "Institutional Memory" | Page heading. |
| description | string | 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. |
| filters | InstitutionalMemory01Filters | 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. |
| isRefreshing | boolean | undefined | - | When true, the refresh button shows a spinner. |
| filterSelects | readonly FilterSelectGroup[] | undefined | - | Generic select dropdowns injected by the parent (e.g. owner, status). |
| activeMetric | DecisionLogMetricFilter | 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. |
| toolbarExtras | ReactNode | - | 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(andCandidateList,CandidatePickerDialog,FeatureVector,VerdictForm, a localInlineNotice) undercomponents/linkage/, wired intoDecisionLogDetailDialogvia the newdialog.linkageprop (DecisionLinkageProps). All data-fetching, scan, and verdict-submission logic is the container's responsibility - the panel is fully props-in/events-out. - Fix
DecisionLogDetailDialogreferencing an undefinedlinkableDecisionsand undefined export handlers. Export is now controlled viaonExportCsv/onExportHtml/isExportingondialog; the export menu renders only when at least one handler is provided. - Add
LinkableDecision,OutcomeApiError,DecisionLinkState,CandidateFeaturesLike,LinkCandidateLike,DecisionLinkLike,DecisionLinkScanLike,DecisionLinkVerdict,DecisionLinkRecordOption,DecisionLinkageLinkProps, andDecisionLinkagePropstoInstitutionalMemory01.types.ts. - Add
@signalos/dropdown-menu,@signalos/textarea,@signalos/tooltip,@signalos/combobox,@signalos/data-primitives,@signalos/inputtoregistryDependenciesto match imports already used by the block. - Extract
DecisionLogDetailHeaderfromDecisionLogDetailDialog(badges, title, export menu, close button) to stay under the 500-line ceiling. - Add the "Ask AI" chat panel (
HypothesisChatand itsChatInput,ChatMessageBubble,ChatSuggestions,ChatThinkingTrace,ChatVisualizationsubcomponents, plus a localSectionHeading) undercomponents/chat/, wired intoDecisionLogDetailDialogvia the newdialog.chatprop (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-suppliedisDarkModeprop instead of reading theme state itself. - Add
ChatRole,ChatVisualizationLike,ChatMessage,ChatThinkingStep,ChatTurnMeta,ChatSuggestion, andHypothesisChatPropstoInstitutionalMemory01.types.ts. - Add
lucide-react,@tanstack/react-tableversion pins plusreact-markdown@^9.0.3,echarts@^6.1.0,echarts-for-react@^3.0.7todependencies. - Add the Recall (precedent search) panel (
RecallPanel,RecallSection,RecallDialog,RecallSummaryChip,PrecedentCard,PrecedentDetail,OpenDecisionCard,FeatureMeter,recall-utils) undercomponents/Recall/, wired intoDecisionLogDetailDialogvia the newdialog.recallprop (RecallPanelProps, omittinghypothesisId/enabledwhich the dialog derives itself). The panel no longer fetches through a Redux hook -result,isLoading,error,mode,highConfidenceOnlyare all props, andonRetry/onModeChange/onHighConfidenceOnlyChange/onViewHypothesisare all caller-supplied callbacks that degrade gracefully when omitted. - Remove
HypothesisDetailDialog: it depended directly onnext/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 plainonViewHypothesis(hypothesisId)callback ondialog.recall- the container decides how to open that hypothesis's own detail dialog. - Add
RecallPrecedentFeaturesLike,RecallHypothesisSnapshotLike,RecallPrecedentLike,RecallOpenDecisionLike,RecallSummaryLike,RecallResult, andRecallPanelPropstoInstitutionalMemory01.types.ts.RecallPanelProps.modereuses the existingDecisionSearchModetype 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-areatoregistryDependenciesforRecallDialog's scrollable list.
0.4.4
- Initial full implementation:
InstitutionalMemory01block withDecisionLogDetailDialog,DecisionLogSidebarPanels,FeedbackTimeline,FeedbackCard,FeedbackError,EvidenceCardWithClick,HypothesisDecisionSearch,SignalDetailMiniDialog,SimilarDecisionsPanel, andTableViewsubcomponents. - Add
DecisionLogEvent/DecisionLogEventTypetypes andevents,act_by_reason,act_by_deadlinefields toInstitutionalMemory01.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
onMetricClickandactiveMetricprops to MetricTile onClick handlers; metric tiles now toggle the active filter correctly instead of doing nothing. - Fix dead
onViewDetailfallbacks in grid and list views — affordance is now hidden (passesundefined) when the callback is not provided. - Fix
TableViewpagination type mismatch: localPaginationConfigwithonRowsPerPageChangereplaced by the shared type fromInstitutionalMemory01.types.ts(onPageSizeChange); page-size changes now reachDataTable. - 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; importSORT_BY_OPTIONS,SEVERITY_OPTIONS,DEADLINE_OPTIONSfromInstitutionalMemory01.constants.ts. AddInstitutionalMemory01.constants.tsto shippedfiles[]. - Add JSDoc to all previously undocumented props in
InstitutionalMemory01Props. - Expand test suite: add coverage for
isLoadingstate,onFiltersChange,onRefresh,onMetricClickfire, andonMetricClicktoggle-off.
0.3.4
- Unit test case issue fix
0.3.3
- Added
@signalos/switchregistry dependency; preview toolbar uses Switch component.
0.3.1
- Refactored to fully presentational: block now accepts
entries: DecisionLogGroup[]instead ofExpandableListDefaultItem[], converting to list items internally. - All API types (blackboard, hypothesis, signal, decision, feedback, search) moved into
InstitutionalMemory01.types.ts; removed all backend/Redux dependencies. DecisionLogDetailDialogreceives all data via props:decisions,feedback,signals,searchResults,similarDecisions, and loading/error states.HypothesisDecisionSearchmanages its own input/mode state; firesonSearch/onResetcallbacks to parent.SimilarDecisionsPanelis now fully prop-driven (results,isLoading,error).EvidenceCardWithClickacceptssignalprop directly instead of reading from a Redux selector.FeedbackCard/HypothesisFeedbackPanelremovedhypothesisIdrequirement; acceptsdecisionsarray only.- Removed
ScrollAreadependency (replaced with native overflow scroll); no new registry deps added. InstitutionalMemory01.utils.tsno longer imports backend types; severity helpers are self-contained.- Preview updated with realistic mock
DecisionLogGroupdata.
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.