From e9109a0b077b43030aec267ea1973b298726aa39 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 19 Jul 2026 02:30:37 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20Improve=20table?= =?UTF-8?q?=20accessibility=20with=20row=20headers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Changed the first column in report tables from `` to `` to improve screen reader navigation. - Added `font-variant-numeric: tabular-nums;` to table cells to align numerical data properly. - Updated corresponding CSS selectors to apply standard table cell styles to the new `tbody th` elements, preventing visual regressions. - Explicitly set `font-weight: normal` on `tbody th` to match previous visual style. --- .jules/palette.md | 4 ++++ python/fast_mlsirm/report.py | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.jules/palette.md b/.jules/palette.md index 74cddb7ad..2c33fc92e 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -19,3 +19,7 @@ ## 2024-07-13 - CLI Debugging Stack Traces **Learning:** Adding a `FAST_MLSIRM_DEBUG` bypass to user-friendly `try/except` blocks is crucial for DX. Otherwise, unexpected runtime errors during development will be swallowed into generic stderr messages, hiding the stack trace needed to actually fix the bug. **Action:** When adding `try-except` blocks to Python CLI subcommands to improve Developer Experience (DX) by preventing raw tracebacks for users, include a debug bypass (e.g., `if os.environ.get("FAST_MLSIRM_DEBUG"): raise`) in *all* catch blocks (including `RuntimeError` and `Exception`) to ensure tracebacks aren't swallowed during local development and debugging. + +## 2024-07-14 - Semantic HTML Updates require CSS Maintenance +**Learning:** Changing a structural HTML tag (like swapping `` for `` in the table body) for accessibility reasons can break the design if the project's CSS specifically scoped its styles to the old tag. The new semantic element will revert to browser defaults, creating a visual regression. +**Action:** When altering HTML tags for accessibility, always update existing CSS rules that specifically styled the old tags to include the new ones (e.g., updating `td { ... }` to `td, tbody th { ... }`) to prevent introducing visual regressions. diff --git a/python/fast_mlsirm/report.py b/python/fast_mlsirm/report.py index 30ee4276b..97479eceb 100644 --- a/python/fast_mlsirm/report.py +++ b/python/fast_mlsirm/report.py @@ -318,8 +318,10 @@ def _table(rows: list[dict[str, Any]], *, label: str, limit: int = 12) -> str: body_rows = [] for row in rows[:limit]: cells = "".join( - f"{escape(_format_value(row.get(column, '')))}" - for column in columns + f'{escape(_format_value(row.get(column, "")))}' + if i == 0 + else f"{escape(_format_value(row.get(column, '')))}" + for i, column in enumerate(columns) ) body_rows.append(f"{cells}") @@ -680,20 +682,27 @@ def _css() -> str: } th, -td { +td, +tbody th { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--line); white-space: nowrap; + font-variant-numeric: tabular-nums; } -th { +thead th { background: #f1f4ef; color: #2f3437; font-size: 0.8rem; } -tr:last-child td { +tbody th { + font-weight: normal; +} + +tr:last-child td, +tr:last-child th { border-bottom: 0; } From 2ed66054c11e95e533dc5845e6e676985705f27d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 22 Jul 2026 14:23:36 +0900 Subject: [PATCH 2/3] docs(changelog): record the accessible report table headers; refresh head for re-review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous CHANGES_REQUESTED verdict on this head was an infrastructure failure (the central coverage-evidence sandbox could not install numpy — fixed by ContextualWisdomLab/.github#611), not a code judgment. This commit documents the change and produces a fresh head so the scheduler dispatches a new review under the repaired pipeline. --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d502a0c..7ebda08c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ ### Changed +- Improved generated report table accessibility: the first identifying column + of each data row now renders as `` for screen-reader grid + navigation, with matching CSS updates (header styles scoped to `thead th`, + normal-weight `tbody th`, and `font-variant-numeric: tabular-nums` for + aligned numeric columns). + - Exposed the Rust MMLE-EM estimator (`mlsirm_core::mmle::fit_mmle_2pl`) through the PyO3 binding as `fast_mlsirm._core.fit_mmle_2pl`, so `fit(estimator="mmle")` now runs on the Rust core when the extension is built From 8aad49da377350d6b750ef87ede883f51778591e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 29 Jul 2026 21:24:35 +0900 Subject: [PATCH 3/3] chore: revert CHANGELOG to the merge-base version to clear the base conflict The changelog entry added for re-review now conflicts with the heavily extended CHANGELOG on main. Reverting this branch's CHANGELOG to the merge-base version makes the file untouched by this PR, so the base branch's version merges cleanly; the PR keeps its report.py change. --- CHANGELOG.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ebda08c9..d7d502a0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,6 @@ ### Changed -- Improved generated report table accessibility: the first identifying column - of each data row now renders as `` for screen-reader grid - navigation, with matching CSS updates (header styles scoped to `thead th`, - normal-weight `tbody th`, and `font-variant-numeric: tabular-nums` for - aligned numeric columns). - - Exposed the Rust MMLE-EM estimator (`mlsirm_core::mmle::fit_mmle_2pl`) through the PyO3 binding as `fast_mlsirm._core.fit_mmle_2pl`, so `fit(estimator="mmle")` now runs on the Rust core when the extension is built