Skip to content

Callil Consolidation — Decision Log

All decisions made during the callil consolidation analysis and planning session on 2026-03-19.

#DecisionValueRationaleSource
D-01Target branchjmpicnic/component-consolidation off HEAD of jmpicnic/list-view-management-620Fresh branch for consolidation work, preserving both source branchesanalysis/index.md
D-02Integration methodManual file-by-file (no git merge)Two architects worked independently; semantic reconciliation needed per fileanalysis/index.md
D-03Overlap resolutionCase-by-case semantic analysisNo blanket “one side wins” rule; each overlapping file evaluated individuallyanalysis/index.md
D-04Pre-push gatenpm run lint, npx tsc --noEmit, npm run test must passMandatory local validation before any push to originanalysis/index.md
D-05CHANGELOG versionDeferred — evaluate against main CHANGELOG after completionVersion depends on what’s on main when consolidation completesanalysis/index.md
#DecisionValueRationaleSource
D-06cn() utility path@/types/canary/utils (NOT @/utils)Canonical location for all utilities is under src/types/canaryanalysis/index.md
D-07cn() import rewrite38+ files from @/utils@/types/canary/utilsWorktree moved cn to @/utils; must be reverted to canonical pathanalysis/index.md
D-08use-mobile.ts hooksrc/types/canary/hooks/use-mobile.tsHooks go under the canary types namespaceanalysis/index.md
#DecisionValueRationaleSource
D-09Stock shadcn/ui componentssrc/components/canary/primitives/ (peer of atoms/)Clear vendor boundary; regenerable via CLI; no stories needed; natural dependency direction atoms→primitivesanalysis/primitives.md
D-10Custom shadcn-derived componentssrc/components/canary/atoms/ (first-class, with stories/tests)Avatar, badge, button, card, dialog, input-group contain meaningful custom logicanalysis/primitives.md
D-11Primitives not exportedInternal use only, not in canary.ts barrelPrimitives are building blocks for atoms, not public APIanalysis/primitives.md
D-12Primitives count13 files (sonner.tsx excluded)sonner.tsx dropped per D-18analysis/primitives.md
#DecisionValueRationaleSource
D-13canary.tsUnion of both branches minus ArdaDetailField, plus all worktree additionsWorktree is a superset; DetailField replaced by ReadOnlyFieldanalysis/index.md
D-14extras.tsIdentical in both branches, no changesNo divergenceanalysis/index.md
D-15index.tsIdentical in both branches, no changesNo divergenceanalysis/index.md
D-16ArdaDetailFieldDrop from exports and delete underlying filesReplaced by ReadOnlyField from callil branchanalysis/index.md
D-17ArdaBadge collisionAcceptable — canary and extras have different import pathsCanary version is canonical long-term; extras version must not be used outside **/extras/** pathsanalysis/index.md
#DecisionValueRationaleSource
D-18globals.cssWorktree version replaces main clone (Arda orange palette)Main clone has default shadcn blue-slate; worktree has correct Arda brandinganalysis/styles.md
D-19tokens.cssKept as separate file, updated to Arda orangeLightweight published entrypoint for external consumers preservedanalysis/styles.md
D-20globals.css ↔ tokens.cssglobals.css imports tokens.css (no duplicate values)Single source of truth for token values; eliminates driftanalysis/styles.md
D-21Legacy sidebar CSSDroppedCanary sidebar organism replaces .sidebar-menu-button-hover, [data-active='true'] etc.analysis/styles.md
D-22sonner.tsx fileDropped (dead code)Nobody imports it; it’s the only consumer of next-themesanalysis/styles.md
D-23next-themes packageDroppedNext.js-specific, doesn’t belong in Vite/Storybook project; sole consumer (sonner.tsx) is dead codeanalysis/styles.md
#DecisionValueRationaleSource
D-24radix-uiKeep as production dependency (bundled)Used by 13 primitives; replaces @radix-ui/react-tooltipanalysis/dependencies.md
D-25@radix-ui/react-tooltipRemoveSuperseded by radix-ui unified packageanalysis/dependencies.md
D-26@reduxjs/toolkit, react-redux, redux-persistKeep as devDependenciesRequired by Storybook decorator for Dev Witness stories; not in published entry pointsanalysis/dependencies.md
D-27sonner (npm package)Keep as devDependencyUsed directly by use-case stories and canary-refactor; not in published entry pointsanalysis/dependencies.md
D-28react-iconsDropOne icon in transitional code; lucide-react is canonicalanalysis/dependencies.md
D-29shadcn CLIDropScaffolding tool; use npx shadcn@latest on demandanalysis/dependencies.md
D-30pako, qr-scanner, react-dropzoneDropZero usages in worktreeanalysis/dependencies.md
D-31@storybook/addon-linksConditionally keepDrop if no linkTo usage confirmedanalysis/dependencies.md
#DecisionValueRationaleSource
D-32Auto-publish lifecyclePromote into entity-data-grid; row-auto-publish is the only modeNo need for cell-granular onEntityUpdated — replaced entirelyanalysis/grid-integration.md
D-33Select vs Enum editorCallil’s SelectCellEditor replaces jmpicnic’s EnumCellEditorCustom listbox with keyboard nav, checkmark, ARIA roles superior to native <select> wrapperanalysis/grid-integration.md
D-34SelectCellEditor conventionBoth direct component and createSelectCellEditor factoryConsistent with existing canary cell editor patternanalysis/grid-integration.md
D-35Pagination approachBoth server-driven and client-side via StaticConfig (design-time)Different use cases need different modes; mutually exclusive at design timeanalysis/grid-integration.md
D-36Actions columnItem-grid’s actionsColumn ColDef pattern as InitConfig (mount-time)Full ColDef flexibility; mount-time for future user/tenant configurabilityanalysis/grid-integration.md
D-37AG Grid themeItem-grid’s themeQuartz with design-system token mappingDataGrid molecule’s 'legacy' string retrofitted to Arda tokensanalysis/grid-integration.md
D-38Entity-data-grid-shimDeprecated but kept in placeMigration aid for ArdaGrid-based dev-witness pages; new code must use entity-data-grid directlyanalysis/grid-integration.md
#DecisionValueRationaleSource
D-39useDirtyTracking removalRemove — useRowAutoPublish subsumes all functionalityNo external consumers beyond entity-data-gridplan/run-5
D-40Search implementationClient-side rowData filteringGives control over field selection and filtered count display; server-side via Query DSL is future enhancement (#824)plan/run-5
D-41Toolbar layoutSame row as search bar, toolbar right-aligned with ml-autoMatches item-grid’s existing layoutplan/run-5
#DecisionValueRationaleSource
D-42canary-refactor/ roleValidation harness adapted after consolidation, not duringNeither branch’s version is canonical; adaptation is a follow-on taskanalysis/canary-refactor.md
#DecisionValueRationaleSource
D-43Play function step DSLAll new play functions must use step() from Storybook contextNamed collapsible steps in interactions panel; integrates with test runneranalysis/test-coverage.md
D-44VRT ambiguous diffsAgent stops and consults user with screenshot paths and Playwright MCP offerPrevents auto-regenerating baselines when visual correctness is uncertainplan/choreography.md
D-45Implementation outputEach run writes summary, byproducts, validation output, session log to implementation/<run-dir>/Traceability and knowledge capture per runplan/run-*/project-plan.md
#TicketDescriptionCreated From
T-01#824Entity-data-grid: server-side search via Query DSLD-40 (client-side search decision; server-side is future enhancement)