comparison · c_7ec4b410de02 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Commit A delivers a user-facing functional improvement by making pinned child-group icons clickable to unpin, wiring the existing POST flow into an additional UI surface, updating rendering, styling, and adding an end-to-end browser test that verifies the behavior across multiple navigation scenarios. It affects several components and improves usability. Commit B is a solid refinement that changes rank-row coloring from list-position-based to score-range-based normalization, with a clean helper function and good unit test coverage, but it is primarily a visualization improvement rather than adding new interaction capability. Both are valuable, but A has the broader product impact and implementation scope.
Side A introduces a new user-facing capability (unpinning directly from ranked child groups), wiring it through UI, server rendering, form handling, CSS, and end-to-end browser tests. It meaningfully expands interaction flow and consistency with existing pin controls. Side B refines visual encoding of rank rows with better normalization and solid tests, but it’s a contained presentation improvement rather than new functionality.
Commit A delivers a user-facing feature that enables unpinning directly from ranked child group rows, integrating backend rendering changes, form wiring, CSS updates across themes, and expanded end-to-end browser tests. It meaningfully extends interaction capabilities and modifies multiple layers of the stack. Commit B improves visual ranking fidelity with a better gradient normalization algorithm and solid unit tests, but its scope is confined to styling logic within a single module. Overall, A represents a broader and more impactful contribution.
comparison · c_66eb04076a98 (tommy-mor) vs c_bc8c17a00ed7 (tommy-mor)
Commit A makes a broader functional improvement to the UI by changing the color-mapping algorithm from list-position-based to score-range-based normalization. It introduces a reusable helper, updates the rendering logic to compute group score bounds, changes the styling behavior, documents the rationale, and adds multiple targeted tests covering edge cases and correctness. Commit B is a useful but narrower data-ingestion fix that skips pinned Reddit posts during import by checking stickied/pinned flags and adds a focused regression test. Both improve correctness, but A affects a more central presentation algorithm and involves a more substantial implementation.
Commit A makes a deeper, cross-cutting change to how ranking visuals are computed, replacing position-based coloring with score-based normalization, updating function signatures, call sites, and adding several targeted tests. It alters core UI behavior and improves consistency as data scales. Commit B is a focused data-cleanup improvement (skipping pinned posts) with a small helper and a single test, valuable but much narrower in scope and impact.
Side A introduces a more substantial behavioral change by redesigning the rank row coloring logic from ordinal-based to score-based min–max normalization, modifying function signatures, updating call sites, and adding multiple focused tests to validate edge cases and invariants. This improves visual semantics and scalability of the UI. Side B adds a useful but relatively small filtering enhancement (skipping pinned posts) with a helper and a single test. Overall, Side A represents a broader and more impactful contribution.
comparison · c_7ec4b410de02 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A adds a concrete user-facing capability by making pinned child-group icons submit the existing set_garden_pin clear flow, wiring the required navigation path through rendering, updating styles for the new button state, and adding an end-to-end browser test covering unpinning from the ranked list and its effects. Side B improves visual encoding by changing row coloring from list position to score-based min–max normalization with unit tests, but it is primarily a presentation refinement rather than a functional capability or bug fix.
A converts a non-interactive pinned icon into a working unpin control by wiring a POST /ui RPC (including new next_path plumbing) and adds an end-to-end browser test verifying the behavior, delivering real functionality. B only changes row coloring logic from ordinal-based to score-based gradients with unit tests, which is a visual refinement rather than a core capability.
Side A turns a static pinned icon into a functional POST form that reuses the existing /ui set_garden_pin flow, adds the necessary next_path plumbing, updates styles, and extends the browser test to verify unpinning from ranked child lists—clearly fixing a real UX gap. Side B improves visual semantics by switching from ordinal-based to min–max score-based gradients with solid unit tests, but it’s a presentation refinement rather than enabling new functionality.
A adds a real missing interaction (unpin directly from ranked child rows via the same POST /ui flow) with corresponding CSS states and an extended browser test covering the new UX path, delivering tangible user-facing functionality. B is a reasonable visual tweak (min-max score gradient) with good unit tests, but it's a smaller, purely cosmetic refinement affecting only color mapping, with lower functional impact than A's new capability.
B replaces ordinal-position coloring with min–max score normalization and documents the dilution issue, so rank colors carry lasting semantic meaning backed by focused unit tests. A only adds unpin parity on an already-pinned glyph (form + CSS + browser coverage), useful UX consistency but less foundational than correcting how rank mass is visualized.
comparison · c_66eb04076a98 (tommy-mor) vs c_bc8c17a00ed7 (tommy-mor)
Side A changes the ranking color logic from list-position-based to score-based min–max normalization within each group, introducing a dedicated `score_gradient_t` helper, updating rendering to use score ranges, and adding focused tests for normalization behavior and edge cases like tied scores. Side B fixes a practical import issue by skipping stickied/pinned Reddit posts with a helper and regression test, but its impact is narrower than A's broader improvement to core ranking visualization behavior.
A replaces a position-based coloring scheme with score-based min–max normalization, altering function signatures, computing per-group ranges, and adding targeted tests—an enduring improvement to how data is represented. B is a straightforward filter that skips pinned posts via a simple helper and test, useful but narrower in scope.
Side B prevents pinned/stickied Reddit posts from being imported by adding `child_is_pinned` and filtering in `parse_children`, plus a focused test—improving data correctness and avoiding persistent noise in stored listings. Side A refactors row coloring to use min–max score normalization and adds solid tests, but it primarily affects UI presentation rather than core data integrity or behavior.
B fixes a real data-quality bug (pinned/stickied posts polluting subreddit imports) with a clear, testable behavior change that affects actual content correctness. A is a UI-only cosmetic tweak to color gradient math for rank rows, which is a minor visual refinement with no functional or data-correctness impact.
B fixes import data quality by excluding stickied/pinned Reddit posts (with a clear helper and regression test), which permanently keeps non-content noise out of the ranking pipeline. A only refinines rank-row coloring from list ordinal to min–max score within a group—a solid, tested UX tweak, but presentation polish rather than correctness of ingested data.
comparison · c_b00c261f06c2 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A fixes an actual correctness bug in vote-outcome highlighting (winner/slider mapping, polarity), adds solid regression tests (`ratios_for_page_orients_to_page_left`, `sliding_left_makes_left_item_win_ranking`) verifying the invariant end-to-end, and improves CSS/JS to correctly reflect the winner state including a previously-missing 'even' case. Side B is a good but purely cosmetic enhancement (score-based gradient instead of position-based) without fixing any functional bug, making A's contribution more consequential to correctness even though it also carries some unrelated refactor noise.
A fixes lasting vote-UI correctness (center-anchored winner fill, ratio/slider polarity, history bars aligned with the HUD) plus per-group gradient scoping and adds polarity/ranking invariant tests. B is a real design upgrade—score min–max coloring instead of list ordinals—but it is a narrower visualization tweak that builds on the same rank_row path without the multi-surface bugfixes and core tests in A.
Side A fixes a real behavioral bug by changing rank-row gradient calculation to operate per ranking group instead of using a global ordinal, removes the incorrect global offset logic, and adds a regression test for that behavior. It also corrects vote comparison/history polarity by introducing consistent winner and slider mapping functions, updates the UI to display orientation correctly, and adds end-to-end tests covering ratio orientation and ranking outcomes, whereas Side B mainly changes the coloring algorithm from list position to normalized vote mass within a group as a visual refinement.
comparison · c_66eb04076a98 (tommy-mor) vs c_4ed2e2cca39b (tommy-mor)
Side B fixes a real crash bug (NameError from a missing GITHUB_API_BASE_URL definition) that would break OAuth login entirely, a small but critical correctness fix. Side A improves a cosmetic gradient-coloring heuristic with better tests, which is a nice UX refinement but not a functional bugfix affecting core app correctness.
A replaces ordinal color banding with min–max normalization on real vote mass, with a clear helper, edge cases (ties, tiny spread), and focused unit tests—lasting ranking UX semantics. B only adds a missing GITHUB_API_BASE_URL default; a necessary one-liner NameError fix but far less design substance.
Side A changes the ranking color logic from list-position-based gradients to score-based min–max normalization within each group, introduces a dedicated `score_gradient_t` helper, updates callers, and adds targeted tests covering normalization behavior and edge cases such as tied scores. Side B fixes a real configuration bug by defining `GITHUB_API_BASE_URL` with a default, but it is a small missing-variable fix with narrower impact than the broader, tested behavioral improvement in Side A.
comparison · c_66eb04076a98 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A fixes a real visual/UX bug (colors depending on list position/group size rather than actual vote mass) with a principled min-max normalization and thorough new tests. Side B is a small, low-risk cleanup removing dead-code guard, but changes behavior slightly (items now register even with zero-ratio votes) with less certain downstream impact and a much smaller scope.
A replaces ordinal coloring with min–max score gradients, a real UX/semantics fix with edge-case handling and targeted tests. B only deletes a dead zero-ratio guard and retunes one test—useful hygiene, but far less lasting product impact.
Side A changes the ranking color algorithm from list-position-based to score-based min–max normalization within each group, improving the UI so similar scores receive similar colors regardless of group size, and adds focused tests for the new behavior and edge cases such as tied scores. Side B mainly removes a redundant early-return guard and updates a test to reflect existing validation and edge-skipping behavior, which is a useful cleanup but a much smaller, non-functional change.
comparison · c_66eb04076a98 (tommy-mor) vs c_5cd3e5917d2f (tommy-mor)
Side B is a substantial architectural change that removes an entire subsystem (EntityStore), redefines the event log semantics to keep Reddit content ephemeral with TTL eviction, and touches storage schema, journal, projection, reducer, state, and integration tests consistently across the codebase—delivering real durability/privacy/lasting-value improvements. Side A is a small, well-scoped bugfix improving a color-gradient heuristic in one function with good tests, but it is narrow in scope and impact compared to B's systemic redesign.
B removes EntityImported/EntityStore entirely, keeps only NodeEnsured in the durable log, and adds TTL eviction for ephemeral Reddit display content—fixing retention policy, log bloat, and rebuild semantics across journal, projection, storage schema, and reddit import. A only retunes rank-row gradient math from list ordinal to per-group min–max score, a correct but narrow UI polish.
Side B makes a substantial architectural change: it removes the persistent EntityStore and EntityImported event, moves Reddit display data into ephemeral projection storage with TTL-based eviction, updates replay/journaling paths accordingly, and adds tests verifying rebuild and eviction behavior. Side A is a well-scoped UI improvement that changes row color gradients from list position to per-group score normalization with supporting tests, but its impact is limited to presentation rather than core system design and data handling.
comparison · c_66eb04076a98 (tommy-mor) vs c_f6d0fed9bf9a (tommy-mor)
Side A is a small, coherent bugfix that replaces a positional gradient with a score-based min-max normalization, includes updated targeted unit tests, and is directly reviewable and mergeable. Side B is an 'init seed' dump of many large files (parser.rs, reducer.rs, vote.rs, etc.) that appear to be pasted terminal output (including shell prompts embedded in the file content), unstructured design notes, and duplicated/unintegrated code, offering far less clear, lasting, reviewable value despite its size.
A is a precise, well-tested design fix that recolors rank rows via min–max of vote mass within each group (with clamp, tied-score handling, and regression tests), directly improving readability as groups grow. B is a noisy “init seed” dump of prototypes/notes plus large files that embed shell prompts and cat output, so much of the bulk is non-viable churn rather than clean lasting design.
Side A makes a targeted functional improvement by changing rank-row coloring from list position to per-group score normalization, adds a dedicated `score_gradient_t` helper, updates rendering to use min/max scores, and includes focused regression tests for edge cases like tied scores. Side B is a massive seed commit containing speculative designs and many new files, but it also includes obvious accidental terminal transcript dumps in source files (`forms.rs`, `ranking.rs`), making much of the patch noisy and of questionable lasting value compared with A's precise, test-backed bug fix.
comparison · c_66eb04076a98 (tommy-mor) vs c_4a5c84c0a37b (tommy-mor)
B fixes a genuine functional bug (hrefs encoding the raw storage path instead of the user-facing display path) and replaces a shallow, loosely-bounded browser test with an exhaustive 45-pair test that asserts actual ranking correctness end-to-end via the RPC API. A is a clean, well-tested improvement to color gradient logic, but it only affects cosmetic rendering, whereas B corrects user-facing link generation and substantially strengthens regression coverage of the core ranking feature.
B fixes real href correctness (encode display_path ~/…/-/… instead of full storage URLs in vote_compare_href/vote_pool_href) and turns a shallow “≥1 vote” smoke test into a full C(10,2)=45-pair flow that asserts one component ranked a→j via GetGardenRank. A is a solid UX tweak (score min–max gradient vs list ordinal) with unit tests, but it is visual polish rather than path/ranking correctness.
Side B fixes user-facing URL generation by using display_path instead of internal storage URLs in vote links, aligning hrefs with the application's displayed path format, and substantially strengthens end-to-end coverage by exercising all 45 pairwise votes and asserting the resulting ranking through the RPC API. Side A improves the visual color gradient by basing row colors on normalized score ranges within a group and adds focused unit tests, but this is primarily a presentation enhancement rather than a functional correctness change.
comparison · c_66eb04076a98 (tommy-mor) vs c_a896b2dc05d5 (tommy-mor)
Side A fixes a real UI correctness bug (color mapped by score via min-max normalization instead of arbitrary list position) with clear rationale and thorough new unit tests validating the fix. Side B refactors a Deque to a Vec and removes the on-write trim/eviction logic in favor of a cap applied only at query time, which risks unbounded on-disk growth of vote history and is explained by only a terse, unclear commit message ('dequeue -> vec') despite touching more files.
B redesigns the recent-votes path end-to-end (Deque→List/Vec, write-time trim removed, read-time cap, schema v4, simpler apply_records) with a focused regression test, which is lasting storage/reducer design. A only retunes rank-row gradient mapping from list ordinal to in-group min–max score—a correct UI polish with tests, but shallow and presentation-only next to B’s core data-model change.
Side A changes the UI logic to color rank rows based on each group's actual score range instead of ordinal position, introducing a dedicated `score_gradient_t` function, updating callers, and adding focused tests for normalization, tied scores, and stability. Side B is largely a storage refactor from deque to list with query-time capping and schema updates; while it changes persistence behavior, it mainly reorganizes data handling and removes write-time trimming rather than delivering a comparably clear user-facing improvement or bug fix.
comparison · c_4772ee88dbe3 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A removes dead demo-counter scaffolding and, more importantly, introduces a real architectural improvement: an async settlement worker (settlement.rs) that batches vote writes and caches ranking scores, decoupling expensive Bradley-Terry recomputation from the request path and switching ranking_panel to a read lock. Side B is a much smaller, purely cosmetic fix (rank row color gradient using score-based min-max normalization instead of list position) that improves UI polish but has far less lasting architectural or correctness impact.
A adds a real settlement worker (batched vote apply, JSONL append, score recompute), ranking cache + read-lock fast path, and deletes the demo-counter scaffold—structural correctness for persistence and HTTP latency. B only retunes rank-row colors from list ordinal to min–max score within a group, a small UI polish with local tests and no core data-path change.
Side A makes substantial architectural improvements: it removes the temporary demo-counter feature, introduces a dedicated settlement worker that batches vote persistence and ranking recomputation, adds cached ranking access (`ranked_items_cached`), warms the cache at startup, and switches UI reads from write locks to read locks. Side B is a focused UI enhancement that changes row coloring to use per-group score normalization with good supporting tests, but it is limited to presentation rather than core project behavior or performance.
comparison · c_597d3f736194 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A fixes real bugs in test infrastructure (wrong regex-vs-string split arg, wrong response body length causing broken redirects, wrong stream method, unguarded nil token) plus adds exception handling and CSS-selector-based readers, unblocking a broken E2E auth suite. Side B is a smaller, self-contained UI refinement (min-max normalization for rank coloring) that's well-tested but lower-impact and more cosmetic than a functional bugfix.
A fixes concrete mock HttpServer bugs (request body via getRequestBody, regex split, null-safe tokens/state, 302 length, handler try/catch) that had broken Clojure E2E auth, plus aligns test helpers with real selectors—restoring a critical verification path. B is a sound production UX tweak (score min–max gradient vs ordinal) with tests, but it refines presentation rather than unblocking core flows.
Side A fixes multiple concrete failures in the OAuth test infrastructure that were breaking end-to-end authentication: it corrects query parsing (`str/split` with regex), reads POST bodies from `getRequestBody`, guards against null bearer tokens and missing state, fixes redirect response handling, wraps handlers to avoid crashes, and updates Playwright test selectors and alias handling. Side B improves the UI by coloring rank rows based on normalized score ranges instead of list position and adds focused tests, but it is primarily a presentation enhancement rather than a broad reliability fix.
comparison · c_66eb04076a98 (tommy-mor) vs c_978e283f2229 (tommy-mor)
B is a substantial, coherent CLI restructuring (forum list/show/post subcommands, mandatory --delegate on posts, updated docs/DSL, RPC next-step strings, and integration tests) that changes real user-facing surface and behavior consistently across code, docs, and tests. A is a smaller but correct fix (min-max gradient instead of ordinal position) with good targeted tests, but it's a narrower, purely cosmetic improvement compared to B's broader architectural and UX rework.
B restructures the CLI’s core write path (ingest → `forum post <TAG>` with required delegate), splits forum into explicit list/show/post subcommands, and updates docs, RPC next-move strings, and integration tests—lasting interface design. A only changes rank-row coloring from ordinal position to min–max vote-mass within a group plus unit tests; valuable polish, but much narrower scope.
Side A changes the ranking visualization to derive row colors from each group's actual score range instead of list position, adding a dedicated `score_gradient_t` function, updating rendering to compute per-group min/max scores, and including focused tests for normalization, tied scores, and stability. Side B is a broad CLI and documentation reshaping that mainly renames and reorganizes commands (`ingest` to `forum post`, `forum` to `forum list/show`) and updates help text and tests, providing usability improvements but comparatively less enduring functional value.
comparison · c_66eb04076a98 (tommy-mor) vs c_3f420a1f5aa1 (tommy-mor)
Commit B is a substantial, functionally significant change: it moves theme selection from client-only JS/localStorage to a server-rendered, cookie-based, SSR-consistent mechanism (new /theme route, cookie helpers, layout signature changes across every page handler) and also adds room-aware URL rewriting for API/RPC responses (item_path_for_api_in_room, forum_thread_web_url) with accompanying tests, fixing real correctness gaps for private rooms. Commit A is a smaller, well-tested fix improving color gradient semantics for rank rows, which is valuable but narrower in scope and impact than B's cross-cutting architectural and correctness improvements.
B delivers a durable theme architecture (cookie + POST /theme, SSR stylesheet selection, login cookie re-issue) and substantial private-room API correctness via item_path_for_api_in_room/forum_thread_web_url wired through RPC and pages with tests. A is a focused, well-tested rank-color fix (score min–max vs list ordinal) but is scoped polish; B’s product and API surface changes outweigh that despite more mechanical plumbing.
Side B implements a substantial cross-cutting feature: persistent theme selection via cookies and a POST /theme flow, preserves the theme across authentication by reissuing cookies, updates page rendering to honor the selected theme, and fixes room-aware URL generation throughout the RPC/API with dedicated helper functions and tests. Side A improves the rank list visualization by switching row coloring from list position to per-group score normalization and adds focused tests, but it is a localized UI enhancement compared with B's broader infrastructure and correctness improvements.
comparison · c_11d6a0ec9839 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A fixes multiple real bugs across the request path (out-of-band delegate attribution, incorrect fallback that silently expanded the sibling pool, dead swap-side UI, and a route rename), touching rpc, ui_html, vote.rs, lib.rs and updating integration tests/browser tests consistently. Side B is a smaller, cosmetic-only change (color gradient normalization) with good test coverage but lower functional impact and narrower scope than A's cross-cutting correctness fixes.
A fixes real behavioral bugs: out-of-band WEB_BROWSER_AGENT delegation (correct attribution instead of stuffing it into DSL text), and refusing next-pair suggestions when the sibling pool has fewer than 2 items instead of silently falling back to the entire item set. B’s min–max score gradient is a clear UX improvement over ordinal coloring, but it is presentational polish versus A’s correctness and routing fixes.
Side A fixes multiple functional issues: it passes delegate attribution out-of-band instead of embedding it in DSL text, prevents an incorrect fallback to all items when the sibling pool has fewer than two candidates by returning no next pair, and simplifies the voting flow by removing the swap button while consistently renaming the route from `/vote/compare` to `/vote` across server code and tests. Side B improves UI coloring by basing gradients on normalized vote scores within a group and adds solid tests, but this is primarily a presentation enhancement rather than a correctness or workflow fix.
comparison · c_66eb04076a98 (tommy-mor) vs c_3ff71f7eaeda (tommy-mor)
B delivers multiple real feature/UX fixes (unpin via HUD form instead of stale link, vote-count badges on garden compare icons, CSS/theme updates, browser test coverage) plus doc corrections, spanning several files with tested behavior changes. A is a smaller, focused but narrower refactor of a single color-gradient function with good unit tests, but it affects only cosmetic rank-row coloring in one file.
B delivers concrete product fixes: pairwise vote counts on garden row controls, correcting the pin HUD from a misleading item permalink to a real unpin POST, plus matching CSS, docs, and browser/unit coverage. A is a clean, well-tested design tweak (min–max score gradient instead of list ordinal) but narrows to ranking row color only, so it adds less lasting surface area than B’s multi-path UX and correctness work.
Side A changes the ranking color logic from list-position-based gradients to score-based min–max normalization within each group, introducing a dedicated `score_gradient_t` helper, updating rendering to use actual scores, and adding focused tests for normalization, tied scores, and stability. Side B adds several UI enhancements (vote counts, HUD unpin behavior, styling, and tests), but they are more feature-oriented and spread across multiple files, whereas Side A corrects a core visualization behavior with a clearer, reusable design.
comparison · c_66eb04076a98 (tommy-mor) vs c_cd965c070df3 (tommy-mor)
Side B fixes a real bug (Reddit children imports bypassing ensure_path causing wrong path nesting) and a UI defect (unranked children showing raw ids instead of titles), backed by updated integration tests exercising the actual bug. Side A is a legitimate visual improvement (min-max gradient normalization) with good unit tests, but it's a cosmetic refinement rather than a correctness fix affecting data integrity.
B fixes real import/display bugs: Reddit children attach via apply_entity_under_parent (no ensure_path nesting) and unranked rows use stored titles through GlobalTree, with wired call sites and integration coverage. A only switches rank-row coloring from list ordinal to min–max score gradient—a correct UI polish, but narrower and non-functional versus B’s lasting data-path and labeling fixes.
Side B fixes a functional data-model and UI integration issue: Reddit child imports now attach entities directly under the intended parent via `apply_entity_under_parent`, preserves imported entity metadata, updates ranking panel rendering to use the tree for child titles, and wires the new API through callers. It also adds integration tests covering SSE updates and children fetch behavior, whereas Side A is a UI refinement that changes row color gradients from list position to score-based normalization with focused unit tests but does not address core functionality.
comparison · c_66eb04076a98 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B implements a full end-to-end feature: a new CLI `room create` command, RPC/reducer/event plumbing, simplification of the room model (dropping unused visibility since only private rooms are ever created), plus updated docs/tests across CLI, server, and integration suites. Side A is a smaller, well-tested UI fix (rank color gradient) that improves visual correctness but has narrower scope and impact than B's cross-cutting feature and API simplification.
B ships the CLI `room create` path and simplifies the room domain (drop ThreadVisibility/RoomState, rooms as HashSet) across RPC, events, reducer, docs, and tests—durable product surface. A only retunes rank-row gradient math to score min–max within a group, a correct but smaller UI polish.
Side B adds a substantial new end-to-end capability by introducing a CLI `room create` command, wiring it through RPC, updating server handling, simplifying the room model by removing the unused visibility field, and updating tests and documentation accordingly. Side A improves UI presentation by changing rank-row color mapping from list position to per-group score normalization with good test coverage, but it is primarily a visualization refinement rather than a core feature or architectural simplification.
comparison · c_66eb04076a98 (tommy-mor) vs c_c42f908efc44 (tommy-mor)
B is a broader type-safety refactor that removes stringly-typed item paths in favor of CanonicalItemUrl/newtype Deref impls, reducing risk of mismatched string keys across resolve_item, connectivity stats, and RPC pairing logic—real structural improvement with test coverage. A is a smaller, well-tested fix improving color-gradient correctness for rank rows, which is valuable but narrower in scope and impact than B's cross-cutting type refactor.
A replaces ordinal/list-position gradient coloring with min–max normalization of actual vote mass (score_gradient_t + per-group min/max), a precise behavioral fix that keeps similar scores visually close and is backed by targeted tests; B is a worthwhile but largely mechanical type-propagation refactor (Deref on URL newtypes, CanonicalItemUrl through resolve_item/pools/maps) that removes String churn without changing user-visible behavior or fixing a defect.
Side B performs a broad but coherent type-safety refactor by making `resolve_item` return `CanonicalItemUrl` instead of `String`, propagating canonical URL types through validation, ranking, RPC, and pair selection, and eliminating repeated parsing/wrapping logic while adding `Deref<str>` support for URL newtypes. Side A improves UI behavior by changing row coloring from list position to score-based min–max normalization with solid tests, but its impact is limited to presentation whereas Side B strengthens core API correctness and maintainability across many code paths.
comparison · c_66eb04076a98 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
B removes a real bug-prone redirect flow (env-var-based URLs, full page reloads) in favor of a consistent SPA-like fragment morph pattern, unifying auth pages with the shared layout() and reducing duplicated markup via form_inner(). A is a well-tested, focused fix to a visual gradient bug, which is valuable but narrower in scope than B's structural simplification and consistency improvement across auth flow and CSS themes.
B redesigns the auth POST path to return HTML fragments (error re-render and signed-in message) and extends poem JS to morph non-empty bodies, replacing redirects and the separate no-JS auth_layout with the shared layout—substantive flow and architecture for a core path. A is a precise, well-tested rank-color fix (score min–max vs ordinal) but only refines visualization within an existing list UI.
Side B makes a substantive architectural improvement to the authentication flow by replacing redirect-based form handling with inline HTML fragments, extending the existing Poem JS to morph form content from non-empty responses, and refactoring the auth templates to reuse shared form markup. Side A improves the ranking UI by basing row colors on per-group score ranges instead of list position and adds focused tests, but its impact is primarily presentational, whereas Side B changes user interaction and simplifies server/client behavior for auth.
comparison · c_66eb04076a98 (tommy-mor) vs c_57453fc5c6c0 (tommy-mor)
B delivers a complete, self-contained feature (garden ranking markdown copy via POST /ui + JsBuilder eval) with new module, unit tests, integration test, browser test, and documentation updates, providing durable user-facing value. A is a well-scoped correctness fix to the rank-row color gradient (min-max normalization vs list position) with solid tests, but it's a narrower visual polish change affecting less overall functionality than B's new capability.
B adds a full end-to-end capability (CopyGardenRank action, markdown formatter, UI buttons on garden headings, plus unit/integration/browser coverage and agents.md), which is reusable product value beyond styling. A is a correct, focused fix—min–max score gradients instead of ordinal position—with tight helper/tests, but it only refines existing rank-row colors rather than expanding what users can do with rankings.
Side B adds a substantial new end-to-end capability: a CopyGardenRank UI action, server handler, markdown formatter, clipboard JavaScript response, UI buttons across garden views, and integration/browser tests covering the feature. Side A improves row coloring by switching from list-position gradients to per-group score normalization with good helper extraction and tests, but it is a focused presentation enhancement rather than a broad new user-facing capability.
comparison · c_66eb04076a98 (tommy-mor) vs c_ebc883667d61 (tommy-mor)
Side A delivers a genuine algorithmic fix (min-max score normalization instead of list-position gradient) with new unit tests validating the behavior change, improving actual UI correctness and giving lasting design value. Side B merely deletes a stale duplicate file left over from an earlier refactor, which is necessary cleanup/bugfix for module resolution but contributes no new functionality beyond fixing an artifact of a prior split.
A replaces ordinal/list-position coloring with min–max score normalization inside each rank group (plus targeted tests for range, ties, and similarity), a lasting UX/design fix. B only deletes the leftover monolithic forum.rs and finishes relocating code into the forum/ tree, which is useful cleanup but not new behavior or design.
Side A changes the ranking color algorithm from list-position-based gradients to score-based min–max normalization within each group, introducing a dedicated `score_gradient_t` helper, updating `rank_row_style` call sites, and adding focused tests for range mapping, tied scores, and stability. Side B is primarily a structural refactor that deletes the duplicate `forum.rs` in favor of `forum/mod.rs` and split modules; while valuable for maintainability and removing module ambiguity, it largely preserves existing behavior rather than improving project functionality.
comparison · c_477013996fa5 (tommy-mor) vs c_66eb04076a98 (tommy-mor)
Side A delivers multiple substantive features: a full-bleed chromeless layout for vote-compare, correct edge-history sorting by vote strength with proper ratio orientation, and a fixed morph of the new post card, backed by new tests and CSS across three themes. Side B is a smaller, focused fix (min-max normalization for rank-row coloring) that is valuable but narrower in scope and impact compared to A's broader UX/correctness improvements.
A delivers lasting vote-compare product work: a chromeless full-bleed layout, edge history sorted/shown by page-left strength with correct left/right ratios, and post-success morph of the ingest card plus history—backed by tests and docs. B is a clear, correct polish (rank colors from in-group min–max vote mass instead of list ordinal) but narrower in scope and impact.
Side A delivers substantial functional improvements: it adds a fullscreen/chromeless vote-compare layout, updates the POST success path to morph in the newly created vote preview, reworks edge-history display to normalize ratios by page order and sort by vote strength, and includes browser/unit test updates to verify the behavior. Side B is a focused visual refinement that changes rank-row coloring from list-position to score-based min–max normalization with good tests, but it affects presentation only and has a narrower long-term impact.
comparison · c_66eb04076a98 (tommy-mor) vs c_939729b4d9a6 (tommy-mor)
Side A is a small, focused, well-tested correctness fix (min-max gradient normalization) with clear rationale and updated unit tests exercising the new logic. Side B is a sprawling, vaguely-labeled 'fix' commit that mixes unrelated concerns (Cargo.lock/dependency additions, typed form holes, a new vote redirect flow, CSS/JS additions) referencing a `html::vote` module whose implementation isn't even included in the diff, making it hard to verify correctness or review in isolation.
B adds the vote-compare flow (route, page CTA, slider UI/JS, typed $form:i32 holes, next navigation, CSS), which is core product capability with tests; lockfile/deps are supporting noise but the feature is lasting. A is a precise, well-tested visualization fix (score min–max vs list ordinal) but only refines rank-row colors within an existing list.
Side A makes a focused behavioral improvement by changing rank row coloring from list-position-based to score-based min–max normalization within each group, adds a dedicated `score_gradient_t` helper, and includes targeted tests for score mapping, ties, and styling behavior. Side B mostly introduces infrastructure and dependencies for a voting feature (new crates, routing, UI hooks, CSS, typed form holes, redirect support), but much of the core functionality is absent from the patch, making it a broader yet less self-contained contribution.