api-surface-1
Selkie 1.0 API Surface Audit
Last updated: 2026-06-25.
This document classifies the currently shipped modules before the 1.0 API freeze. The default policy is minimum breakage: keep existing public-looking modules unless they are unsafe or misleading, add compatibility aliases for unavoidable renames when feasible, and migrate first-party consumers in the same branch as any intentional break.
Stable 1.0 Candidates
These are expected to remain public, with only compatibility-preserving changes unless a concrete production issue is found.
SelkieSelkie::AppSelkie::ContainerSelkie::EventSelkie::ScreenManagerSelkie::SizingSelkie::StoreSelkie::StyleSelkie::ThemeSelkie::WidgetSelkie::Layout::HBoxSelkie::Layout::SplitSelkie::Layout::VBoxSelkie::Widget::BorderSelkie::Widget::ButtonSelkie::Widget::CardListSelkie::Widget::CheckboxSelkie::Widget::CommandPaletteSelkie::Widget::ConfirmModalSelkie::Widget::FileBrowserSelkie::Widget::HelpOverlaySelkie::Widget::ImageSelkie::Widget::ListViewSelkie::Widget::ModalSelkie::Widget::MultiLineInputSelkie::Widget::ProgressBarSelkie::Widget::RadioGroupSelkie::Widget::RichTextSelkie::Widget::RichText::SpanSelkie::Widget::ScrollViewSelkie::Widget::SelectSelkie::Widget::SpinnerSelkie::Widget::TabBarSelkie::Widget::TableSelkie::Widget::TextSelkie::Widget::TextInputSelkie::Widget::TextStreamSelkie::Widget::ToastSelkie::Widget::ViewportedCardList
Selkie::App Facade
Selkie::App is now the stable entry point over internal helpers under
Selkie::App::Internal::*. Before 1.0, review these public methods and
attribute accessors as the intended facade surface:
Lifecycle and loop:
run,quit,shutdownTerminal:
stdplane,set-title,build-title-osc,build-terminal-cleanup-sequence,set-error-log,error-logScreens and theme:
theme,store,screen-manager,root,set-theme,add-screen,switch-screenFocus and events:
focused,event-supply,focus,focus-next,focus-prev,widget-attached,check-focus-invariant,on-key,on-frame,on-resizeOverlays:
toast,show-modal,close-modal,has-modalInput/render helpers:
widget-at-in,detect-sprixel-bug-prone-terminal,force-refresh-sprixels,hot-hz,sprixel-refresh-idle-thresholdPackage helper:
Selkie::App::pick-frame-budget
Contract Sweep Decisions
Reviewed on 2026-06-25 without doing the full method/export inventory. The following names are deliberate enough to keep unless the final 1.0 inventory finds a concrete production issue:
Keep
Selkie::Store.register-handlerfor event handlers andregister-fxfor effect handlers. Thefxabbreviation matches the store's re-frame vocabulary and has broad first-party/downstream usage.Keep all four subscription entry points:
subscribe,subscribe-path-callback,subscribe-computed, andsubscribe-with-callback. The path forms are push-indexed; the computed forms are pull-checked. The callback suffix names the side-effecting forms.Keep
mark-dirty,mark-dirty-tree, andmark-screen-dirty.mark-screen-dirtyis documented as the root-walk + descendant-cascade path, not just another spelling ofmark-dirty.Keep the layout vocabulary split:
repositionmoves the local plane,set-viewportupdates absolute/visible viewport metadata from parent layouts, andhandle-resizeis the terminal/layout resize cascade.Keep current reviewed defaults: subscription change detection remains structural by default with
:identity-check-onlyas an opt-out; modal and borderset-contentdestroy old content by default; App title tmux wrapping is opt-in; toast duration defaults to 2 seconds; async drain timeout defaults to 5 seconds; mouse button handlers default to primary button 1.
Stable But Opt-In
These are shipped and documented, but are not imported by the umbrella
use Selkie; path. Keep them public unless the chart API gets a deliberate
pre-1.0 redesign.
Selkie::Plot::PaletteSelkie::Plot::ScalerSelkie::Plot::TicksSelkie::Widget::AxisSelkie::Widget::BarChartSelkie::Widget::HeatmapSelkie::Widget::HistogramSelkie::Widget::LegendSelkie::Widget::LineChartSelkie::Widget::PlotSelkie::Widget::ScatterPlotSelkie::Widget::Sparkline
Experimental Or Support Surface
These modules are useful, but should not be treated as frozen until they have explicit narrative docs and downstream usage checks.
Selkie::EffectiveBoundsSelkie::Layout::AllocateSelkie::TraceSelkie::TreeSelkie::Widget::FocusableByDefaultSelkie::Widget::PasswordStrengthSelkie::Test::FocusSelkie::Test::KeysSelkie::Test::SnapshotSelkie::Test::Snapshot::HarnessSelkie::Test::StoreSelkie::Test::SupplySelkie::Test::Tree
Internal Implementation Surface
These modules are installed so Selkie::App resolves correctly from a packaged
distribution, but they are explicitly not part of the 1.0 compatibility
contract. Consumers should use Selkie::App.
Selkie::App::Internal::ErrorLogSelkie::App::Internal::DispatchSelkie::App::Internal::FocusTreeSelkie::App::Internal::HitTestSelkie::App::Internal::IdleBudgetSelkie::App::Internal::OverlayTreeSelkie::App::Internal::RenderLoopSelkie::App::Internal::ScreenModalLifecycleSelkie::App::Internal::TerminalSelkie::App::Internal::TerminalSequences
Theme Surface
Required core slots:
baseborderborder-focusedtexttext-dimtext-highlightinputinput-focusedinput-placeholderscrollbar-trackscrollbar-thumbdividertab-activetab-inactive
Defaulted UI slots added for the production-readiness cleanup:
control-focusedselectiondropdowndropdown-highlightoverlay-titleoverlay-keymodal-backdroptoastpassword-emptypassword-weakpassword-fairpassword-goodpassword-strongpassword-very-strong
Defaulted chart slots:
graph-axisgraph-axis-labelgraph-gridgraph-linegraph-fillgraph-legend-bg
Selkie::Widget::PasswordStrength uses the password band slots above and
text-dim for the unfilled bar. level-for reports the current band as a
theme slot name so consumers can reuse the framework palette without depending
on raw RGB constants.
Event And Effect Names
Public event/effect names are part of the 1.0 compatibility contract once
documented. The core Store payload shapes are documented in
Selkie::Store Pod as of 2026-06-25:
Focus events:
ui/focus,ui/focus-next,ui/focus-prevBuilt-in Store effects:
db,db-replace,db-delete,dispatch,asyncError isolation event:
__effect-errorStore effect names still to audit if/when they ship:
batch,tick,timer
Avoid renames unless the current name is unsafe or materially misleading. If a rename is unavoidable, keep a compatibility alias through the final 0.x series where feasible.
Removal Notes
No public module is approved for removal by this audit pass. Confirmed private dead code removed on 2026-06-19:
Selkie::Store.!debug-log-enabledSelkie::Widget::MultiLineInput.!move-leftSelkie::Widget::MultiLineInput.!move-rightSelkie::Widget::MultiLineInput.!move-word-leftSelkie::Widget::MultiLineInput.!move-word-rightSelkie::Widget::ViewportedCardList.!update-content-height