Skip to content

Development History

Chronology of the queue generator rewrite (Jan–Feb 2026), reconstructed from development task documents before archival.

Phase 1: Foundation & Data Modeling (late Jan 2026)

Config singleton & access patterns - Established qg_config() as exclusive config entry point with ConfigBundle typed accessors (DONE_access_configurations, DONE_for_config_access) - Config editor planned as 5-stage migration to read/write API (DONE_Editor_qg_config)

Queue data model - Introduced explicit Plate/Vial queue types with VialSample, PlateCell, Plate classes; randomization boundaries defined within plates/containers (DONE_model_plates_20260125) - Designed parameter inference from 400+ legacy queue CSVs (DONE_param_inference)

Sampler refactoring (round 1) - Cleaned sampler.toml: removed dead fields (qc_row, samples_per_plate, fill_order); proposed factory pattern for 6 sampler instances (DONE_refactor_samplers) - Position formatting unified: row/col → grid_position for all samplers (DONE_position_formatting)

GUI first steps (2026-01-27) - Tech area filtering implemented; hit marimo table limitations (no multi-column sort, no resizable columns) (DONE_GUI_20260127) - Identified dead code: 6 unused config model methods (DONE_dead_code) - API surface cleanup: 19 functions marked private (DONE_make_PRIVATE) - Samples.csv consolidation proposed (DONE_update_samples)

Phase 2: Config Model Redesign (early Feb 2026)

New config model from scratch - Parallel config model designed: unified plate layouts, sampler TOML, sampler_plate_layouts.csv, separate QC layout CSVs for grid vs Evosep (DONE_config_model_new_doc_3) - Config directory reorganized into structure/ (WHEN), position/ (WHERE), formatting/ (HOW), methods/ (WHAT); UI simplified by eliminating instrument_patterns.csv (DONE_config_sub_modules)

Sampler refactoring (round 2) - Unified PlateLayout model, Sampler class with position_fun callable, sampler_plate_layouts.csv mapping (DONE_sampler_refactoring_doc_1) - Clarified Evosep IS a grid (rows=position_starts, cols=offsets); position_fun registry approach; QC layout separation rationale (DONE_sampler_refactoring_review_doc_2)

Position & tray allocation - Confirmed user samples CAN share trays with QC but avoid exact QC positions; documented vial vs plate collision handling (DONE_are_trays_with_qc_allocated_to_defaults) - HyStar XML output support analyzed: needs XML writer with attributes (Position, SampleID, Volume, DataPath, SuperMethod) (DONE_hystar_xml_support)

Terminology & data fixes (2026-01-25 content, committed Feb 4) - Tray/plate consistency fixed; randomization plate ordering preserves B-Fabric input order; one_container_per_tray parameter added (DONE_martina)

Faceted GUI filtering - Single denormalized table defines valid configuration space; user selections filter rows; remaining unique values populate dropdowns (DONE_Helping_GUI_Selection)

Phase 3: Code Review & Quality (Feb 4–5, 2026)

Comprehensive code review (Feb 4) - Full 4,000+ line review: rated 4/5 with modern Python practices; identified mixed responsibilities in QueueGenerator, type system bypasses, monolithic Marimo apps, scattered validation (DONE_CODE_REVIEW_REPORT, DONE_review)

Config access review (Feb 5) - Added get_qc_samples() convenience method; removed implicit plate layout fallback; concluded no need for separate QueueConfigResolver (DONE_config_model_access_review) - Identified 4 redundant validation checks; proposed custom exception hierarchy (ConfigurationError, PositionError, CapacityError, CollisionError) (DONE_excessive_exception_handling)

Quick wins identified (Feb 5) - Priority 1: DEFAULT_SAMPLE_ID constant, importlib.resources for paths, QueueConfigResolver extraction (DONE_5_points)

Phase 4: User Testing & Output Fixes (Feb 6–12, 2026)

First round — Claudia Fortes (2026-02-06) - Tested Exploris_1 Evosep on Chronos: randomized export format mismatch, Evosep/Plate position format wrong (alpha vs numeric), QC positions shift on CSV export (DONE_Claudia_first_round)

Second round — Claudia (2026-02-12) - All 8 issues resolved: position format (xcalibur vs xcalibur_sii), preamble line, column order, sample type removal, sample ID addition, L3 Laboratory literal, position quoting, inj_vol formatting (DONE_Second_round_review_Claudia_12_02_ENG)

Phase 5: Final Refactoring & Cleanup (Feb 16–18, 2026)

Plate layout unification - Both Evosep (tip) and Vanquish/MClass (well) use 8×12 grids but different internal representations; proposed unified alpha (A1-H12) with late conversion to numeric at output time (DONE_c_h_, DONE_chronos_hystar_evosep, DONE_tip_vs_well_plates_V2)

Code review actions completed (Feb 16) - Eliminated duplicate alpha_to_flat, added sampler_type to model, added runtime bounds checks, removed layout_mode from QueueGenerator (DONE_code_review_Feb_16, DONE_review_addressed)

Magic strings audit - Identified sentinels ("default"), polarities, queue types, pattern names; recommended constants/enums (DONE_string_variables)

GUI cleanup - Queue app UI improvements (DONE_queue_app_gui_cleanup) - Writer factory for output formats (DONE_writer_factory)

Chronos output format (Feb 18) - Chronos requires: row counter, exact column order, "EvoSlot N" tray format; dedicated Chronos writer with tray_format field (DONE_chronos_formatting)

Remove qc_layout_name from QueuePattern (Feb 20) - Removed redundant qc_layout_name field from QueuePattern model and queue_patterns.toml; pattern–layout compatibility is now solely determined by subset check (pattern.get_all_sample_ids() ⊆ layout.get_sample_ids()) - Made qc_layout_name a required parameter in QueueParameters.create() (caller must always provide it explicitly; no fallback from pattern) (TODO_qc_layout_pattern_relation)