comparison · c_cf0a514b261a (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Commit B delivers a substantive user-facing fix for vote comparison highlighting and polarity. It corrects ranking highlight behavior across groups, reworks vote history visualization to use consistent slider semantics, adds winner labeling, updates CSS and JavaScript to keep visual feedback aligned with vote direction, removes obsolete code, and introduces multiple targeted tests covering orientation, slider mapping, highlighting, and end-to-end ranking behavior. Commit A is a small maintenance change that removes a redundant dead-code guard in the reducer after validating that zero ratios are already rejected upstream, with corresponding test updates. While useful for code cleanliness and correctness, its scope and impact are much smaller than B's.
Side A is a small cleanup removing a redundant guard and adjusting tests—useful but limited in scope and impact. Side B delivers a substantial UI/UX fix and enhancement: correcting vote highlighting logic, introducing consistent slider-based visualization, improving CSS behavior, refining data mapping, and adding multiple targeted tests. It affects more components (HTML, JS, CSS, tests) and fixes user-visible behavior, making it significantly more impactful.
Side B delivers a substantial UI and correctness improvement: fixes vote compare highlighting, rewrites slider polarity logic, adds winner semantics, updates CSS rendering for center-anchored gradients, adjusts JS behavior, removes obsolete code, and introduces multiple focused tests including an end-to-end ranking invariant. It spans several modules (HTML, CSS, JS) with meaningful behavioral impact. Side A is a small cleanup removing dead code and adjusting a single test expectation. Therefore, Side B contributes significantly more overall value.
comparison · c_b00c261f06c2 (tommy-mor) vs c_b21d271b1b82 (tommy-mor)
Commit B introduces a substantial new capability and supporting infrastructure: an extensible external URL foundation with on-demand GitHub resolution, new UI actions, backend write-path support for system ingests, URL normalization improvements, resolver state management, garden UI enhancements, recursive child ranking depth, extensive tests (including browser integration), and related documentation. It changes many components cohesively to enable a new feature set. Commit A is a focused bug fix that corrects vote comparison highlighting, adjusts ranking gradient behavior to operate per group instead of globally, improves vote history visualization, and adds targeted regression tests. It is valuable but much narrower in scope and impact than the architectural additions in B.
Commit B introduces a substantial new capability: an extensible external URL system with a full GitHub resolver, backend ingestion pipeline, UI controls, normalization logic, and extensive tests (including browser automation). It touches many core areas (state, API, DSL, HTML, URL identity, and async workers) and adds meaningful product functionality. Commit A is a focused UI/logic fix for vote highlighting with some styling and tests—useful but comparatively small in scope and impact.
Side B introduces a substantial new extensible URL foundation and GitHub external resolver system: new resolver module with API integration, cooldown logic, system ingest pathway, write command, UI actions, garden UI controls, normalization changes, extensive tests (unit + browser), and state wiring. This meaningfully expands platform capabilities. Side A mainly fixes vote compare highlighting and slider polarity with related CSS/JS tweaks and tests—valuable but comparatively incremental. Therefore B contributes far more overall functionality and architectural impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side B fixes user-visible vote comparison highlighting by correcting ranking-group gradient calculation, replacing the history ratio bars with slider-based rendering that preserves left/right polarity, updating UI logic/CSS, and adding multiple tests covering orientation, slider mapping, and ranking invariants. Side A only removes a now-redundant zero-ratio early return in the reducer and updates the associated test expectations, a comparatively small cleanup with limited lasting impact.
Side A changes core reducer behavior by removing an early return in `apply_vote`, allowing items/pairs to be registered even when ratios clamp to zero, and updates tests accordingly—this affects data integrity and processing semantics. Side B mainly adjusts UI rendering (highlighting, slider behavior, CSS) and adds helper functions/tests, which are valuable but not as foundational as altering the reducer’s logic.
Side B fixes vote highlighting and polarity end-to-end: it corrects slider-to-ratio mapping (`slider_value_from_ratios`), introduces `winner_side`/`winner_text`, updates the history UI to use a consistent disabled slider, adjusts CSS gradients for correct visual emphasis, and adds multiple tests (including a ranking invariant). Side A merely removes a zero-ratio guard in `apply_vote` and updates a test comment/expectations, a small cleanup with limited impact compared to B’s cross-layer correctness fix.
Side B fixes an actual bug (per-group ranking gradient and slider/winner polarity) with real logic changes, new tests validating the fix, and corresponding CSS/JS updates, delivering concrete user-facing correctness improvements. Side A merely removes dead code from the reducer and adjusts one test's assertions, which is a smaller, lower-impact cleanup with no functional bugfix.
A only deletes a few lines of already-dead zero-ratio guard code and updates one test assertion—correct hygiene with almost no behavioral impact. B fixes real vote-compare highlighting across rank gradients, history HUD sliders, winner/tie polarity, CSS center-anchored fills, and JS labels, plus adds focused tests; that is a lasting user-facing correctness and UX fix.
comparison · c_b00c261f06c2 (tommy-mor) vs c_b21d271b1b82 (tommy-mor)
Side B introduces substantial new infrastructure: an extensible external URL foundation with a GitHub resolver, new UI actions and write commands for system ingests, resolver cooldown state, URL normalization improvements, recursive garden browsing enhancements, and extensive unit/browser tests. Side A is a focused bug fix that correctly changes rank highlighting to be computed per ranking group instead of globally and adds regression tests, but its scope and long-term architectural impact are much smaller.
Side B introduces a substantial new external resolver system (GitHub integration, SystemIngest pipeline, UI actions, and normalization logic) with end-to-end functionality and tests, adding durable capabilities. Side A mainly fixes ranking highlight logic by scoping gradients per group and improves vote UI display, which is valuable but comparatively narrow in impact.
Side B introduces a substantial extensible URL foundation: new external resolver infrastructure (GitHubResolver with API integration, cooldowns, SystemIngest write path), URL normalization changes (query stripping, YouTube/GitHub canonicalization), new UI actions, and broad tests including browser coverage. Side A is a small, targeted fix to ranking highlight gradients and minor vote UI tweaks with limited scope, whereas B adds enduring architecture and cross-cutting functionality.
Side B implements a substantial, cohesive feature (on-demand GitHub external resolver with a new system-ingest write path, cooldown state, URL identity normalization rewrite, and matching browser/unit tests) that adds real durable capability and fixes URL identity bugs across multiple modules. Side A is a focused but much smaller UI/CSS fix for vote-history slider highlighting, useful but narrow in scope and lasting impact compared to B's broader architectural additions.
B establishes lasting URL identity rules (strip query/fragment by default, GitHub and YouTube canonicalization), a SystemIngest path, and a working on-demand GitHub resolver with browser coverage—foundational product architecture. A is a solid, tested vote-highlight/polarity UX fix (per-group gradients, center-anchored history sliders), but it is narrower polish on existing vote UI rather than core extensibility.
comparison · c_597d3f736194 (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
B fixes a real product bug (per-group rank indexing was leaking a global offset into gradient styling, and vote history slider/ratio polarity) and adds targeted unit tests (rank_row_style_gradients, winner_side, slider mapping, ranking polarity) that lock in the corrected behavior. A only patches test-support mock server code (regex vs string split, response header codes, request body access) which is useful for keeping E2E tests green but has no effect on the shipped product.
B fixes user-facing vote/rank correctness (per-group gradient ranks instead of a global ordinal, center-anchored winner highlighting, history sliders aligned with HUD polarity) and locks it in with targeted Rust tests. A is a real, necessary repair of broken OAuth E2E mocks (regex split, getRequestBody, null-safe state/token, handler try/catch) plus selector tweaks, but it only restores test infrastructure rather than lasting product behavior.
Side A restores broken end-to-end OAuth authentication tests by fixing concrete server mock failures: it corrects form/body reading (`getRequestBody`), query parsing, redirect handling, null safety, and wraps handlers to avoid crashes, while also improving test interactions with selectors. Side B mainly improves vote comparison highlighting and history presentation with associated logic and tests, but these are UI behavior refinements rather than fixing a foundational test infrastructure regression.
comparison · c_b00c261f06c2 (tommy-mor) vs c_4ed2e2cca39b (tommy-mor)
Side A fixes a real correctness bug (rank gradient computed globally instead of per-group) and adds a slider-polarity fix with unit tests verifying both the ranking math and the vote-history rendering, showing durable engineering care. Side B is a minimal one-line fix for a NameError, which is valuable but narrow in scope and lacks any test or broader design consideration.
A fixes real vote/rank UI correctness (per-group gradient ordinals, center-anchored winner fill, ratio polarity aligned with the HUD) and locks it in with targeted tests; B only adds a missing GITHUB_API_BASE_URL default. B is a valid crash fix but three lines of config, while A delivers lasting product behavior and regression coverage.
Side A fixes a real UI correctness issue by changing rank row styling to be computed per ranking group instead of globally, removes obsolete offset logic, and adds regression tests for the gradient behavior. It also aligns vote history visualization with slider semantics by introducing consistent winner/slider mapping, updating the UI, and adding multiple polarity tests, whereas Side B is a small but isolated fix that simply defines `GITHUB_API_BASE_URL` with a default to prevent a missing-variable failure.
comparison · c_b00c261f06c2 (tommy-mor) vs c_bc8c17a00ed7 (tommy-mor)
Side B is a focused, well-tested bugfix (skip pinned/stickied Reddit posts) with a clean helper function and a clear regression test, with no side effects outside its scope. Side A fixes a real UI bug but sprawls into unrelated CSS/JS changes (widening columns, complex gradient logic) and silently removes the `vote_back_nav` call without explanation, risking an unintended regression.
A fixes core vote-compare UX/correctness (per-group rank gradients, center-anchored winner fill, history sliders aligned with HUD polarity) with multi-layer changes and strong invariant tests. B is a clean, valuable import filter for stickied/pinned Reddit posts with a focused test, but narrower in product impact.
Side B makes a focused behavioral fix to the Reddit importer by skipping stickied/pinned posts during subreddit parsing, preventing unwanted permanent entries from being imported, and adds a regression test covering both the `stickied` and `pinned` fields. Side A fixes UI highlighting/orientation issues and adds several tests, but much of the patch is presentation and styling changes, making its lasting impact somewhat narrower than the importer correctness fix.
comparison · c_b00c261f06c2 (tommy-mor) vs c_4a5c84c0a37b (tommy-mor)
Side B fixes a genuine correctness bug (vote hrefs leaking full storage URLs instead of display paths, which could break links/UX) and replaces a weak 15-iteration test with an exhaustive 45-pair test that asserts the resulting ranking via RPC, giving much stronger regression coverage. Side A's changes are mostly UI polish (slider CSS/JS, highlighting gradient) with a real but narrower bugfix to rank_row_style scaling, plus decent unit tests, but of smaller functional impact than B's href fix and end-to-end verification.
A fixes real ranking/UI polarity bugs (per-group gradients instead of a global ordinal, center-anchored winner fill, history bars aligned to the HUD slider mapping) and locks them in with focused unit tests. B’s display_path href fix and 45-pair ranking assertion are valuable, but smaller in product surface—mostly URL encoding plus one strengthened integration test.
Side B fixes URL generation to use `display_path()` instead of stored full paths for vote compare and pool links, aligning hrefs with the user-facing path format, and greatly strengthens the browser test by exercising all 45 pairwise votes and verifying the final RPC ranking. Side A is primarily a UI correctness change (per-group rank gradient highlighting plus vote-history slider visualization) with useful regression tests, but its impact is narrower than the routing fix and comprehensive end-to-end validation added in Side B.
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_b00c261f06c2 (tommy-mor) vs c_7ec4b410de02 (tommy-mor)
B ships a concrete, testable feature (clickable unpin from ranked child groups) with a real backend/UI flow change plus an expanded browser test covering the new interaction end-to-end. A is a legitimate bugfix with good unit tests, but it also introduces a large CSS regression (fixed 3-way slider gradient with hardcoded 50% midpoints that breaks the actual slider value display, contradicting its own JS which still sets --vote-slider-pct dynamically), making its visual fix partially inconsistent, whereas B's change is self-contained and verified more thoroughly.
A fixes real ranking/vote-display bugs (per-group gradient ordinals instead of global offsets; center-anchored winner fill and slider polarity matching the HUD) and locks them in with polarity/unit tests, so the core compare UX stays correct. B only wires an existing unpin RPC onto ranked-child pin icons plus browser coverage—useful consistency, but a smaller localized feature than A’s correctness work.
Side A fixes a correctness issue in vote/ranking presentation by changing rank gradient calculation to be per-group instead of global, aligns vote-history slider polarity with the live HUD, and adds focused unit tests covering the orientation and ranking invariants. Side B adds a useful UI capability by making pinned icons in ranked child groups clickable to unpin and verifies it with an end-to-end browser test, but it is a narrower feature enhancement rather than a broader correctness fix affecting core vote visualization and ranking behavior.
comparison · c_4772ee88dbe3 (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side A performs a genuine architectural improvement: it introduces a batching settlement worker that decouples vote persistence/ranking computation from the request path, adds a cached-scores fast path (`ranked_items_cached`), and cleans out an entire unused demo-counter feature (code, events, tests) that was cluttering the codebase. Side B is a more narrowly scoped UI bugfix (slider/winner highlighting) with good test coverage, but it only affects presentation correctness rather than the core system design, making A's contribution more structurally significant and longer-lasting.
A adds lasting core architecture: a settlement worker that batches vote disk writes and ranking recomputes, a cached-score read path (`ranked_items_cached` / `warm_ranking_cache`), and lock downgrades so ranking panels need only read locks—plus removal of the throwaway demo-counter path. B is a real, well-tested UX fix (per-group rank gradients, center-anchored winner highlighting, polarity/slider mapping), but it is localized UI/CSS polish versus A’s foundational concurrency and ranking design.
Side A introduces a substantial architectural improvement by adding a settlement worker that batches vote persistence and ranking recomputation, separates cached ranking reads (`ranked_items_cached`) from recomputation, and switches UI rendering to read locks instead of write locks. It also removes the temporary demo-counter feature and updates state initialization to warm the ranking cache, whereas Side B is primarily a UI correctness and presentation fix (vote highlighting, slider/history rendering, per-group gradients) with accompanying tests.
comparison · c_b00c261f06c2 (tommy-mor) vs c_2dc96aace098 (tommy-mor)
Side B introduces a real architectural improvement (offloading Reddit JSON payloads to RocksDB via a new durable crate, streaming event-log replay, and updated tests/integration) that reduces startup RAM and improves persistence design, despite heavy vendored lockfile noise. Side A is a legitimate but much smaller bugfix/UI polish for vote-compare highlighting and slider gradient logic, valuable but far less impactful than B's structural storage change.
B delivers lasting architecture: a real EntityStore on RocksDB, removal of full Reddit JSON from GlobalTree, and streaming event-log replay that cuts startup RAM—fundamental scalability. A is a solid but narrower UI fix (per-group rank gradients, center-anchored vote sliders, polarity tests) that improves correctness of highlighting without changing the system's capacity or data model.
Side B makes a substantial architectural improvement by introducing a RocksDB-backed `durable` workspace crate, moving raw entity JSON out of `GlobalTree` into a persistent `EntityStore`, and replacing event-log bulk loading with streaming `replay()` to reduce startup memory usage. Side A is a focused UI correctness fix that changes rank highlighting to be computed per ranking group instead of globally and adds regression tests, but its impact is much narrower than the persistence and scalability changes in Side B.
comparison · c_a896b2dc05d5 (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side B fixes a real user-facing bug (vote polarity/highlighting) with targeted logic changes, new regression tests proving correctness (ratios_for_page orientation, winner_side, slider mapping, ranking invariant), plus supporting CSS/JS fixes—delivering concrete lasting value. Side A is a reasonable internal refactor (Deque->List) with a schema version bump and a test, but it's more of a data-structure churn/cleanup than a bugfix, and removing capacity enforcement on write shifts an invariant to read-time without clear necessity.
A redesigns recent-vote persistence (Deque/VecDeque → List/Vec, schema 3→4), dropping write-time trim and parent tracking in projection_apply in favor of append-only writes with a query-time cap plus a test—lasting data-model simplification. B is a solid UI bugfix (per-group rank gradients, center-anchored slider polarity, history HUD parity) with good tests, but it is presentation-layer polish rather than durable core design.
Side A makes a substantive persistence-model change by replacing the durable recent-vote deque with an append-only list, removing post-commit trimming, updating schema versioning, reconstructing only the newest capped window on read, and adding a regression test for the new query-time cap. Side B primarily fixes UI vote highlighting and gradient behavior with supporting tests; while useful, it is largely presentation logic and does not alter the project's core storage or data-handling design.
comparison · c_978e283f2229 (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side A reworks the CLI command structure (forum list/show/post subcommands, room scoping) with corresponding server RPC message updates, DSL doc rewrites, and integration test updates, delivering a coherent, testable UX/API restructuring. Side B is a UI-focused fix (vote slider highlighting/polarity) with good unit tests, but it's narrower in scope, touches only presentation logic, and includes some risky refactors (removing back-nav, changing rank ordinal computation) without corresponding integration coverage.
A permanently redesigns the CLI contract (ingest → scoped `forum post <TAG>`, forum list/show/post subcommands, required --delegate, docs/RPC next-hints/tests), which is core agent/user surface. B is a real, well-tested vote-highlight/polarity UI fix (per-group gradients, center-anchored slider, history bars), but narrower and presentation-local.
Side B fixes a concrete UI correctness issue by making vote highlighting and history consistently reflect the winning side, adds helper functions for winner/slider mapping, updates CSS/JS accordingly, and backs the behavior with targeted unit tests covering ratio orientation and ranking polarity. Side A is primarily a large CLI/documentation reshaping and command reorganization with corresponding test updates, which improves interface consistency but is mostly structural rather than introducing a comparably durable functional fix.
comparison · c_b00c261f06c2 (tommy-mor) vs c_ebc883667d61 (tommy-mor)
Side A fixes a real bug (vote compare highlighting/polarity) with a targeted rank_row_style fix, added unit tests verifying the fix, and matching CSS/JS slider polarity corrections—concrete, testable functional value. Side B is purely a mechanical dedup/refactor (removing a stale duplicate forum.rs since forum/ module already existed), which is useful cleanup but is structural churn with no new tests or behavioral guarantees, and its diff is dominated by pre-existing code being relocated rather than newly added value.
A fixes real vote-compare behavior (per-group rank gradients, center-anchored winner-side slider fill, history polarity helpers) and locks it in with polarity/ranking tests. B only removes a leftover monolithic forum.rs so the forum/ tree is the sole module root—necessary hygiene, but mostly deletion/move with no product logic change.
Side A fixes a concrete user-visible bug by changing rank gradient calculations from global ranking offsets to per-group indices, adds regression tests for the highlighting behavior, and aligns vote-history slider polarity with supporting helper functions and tests. Side B is primarily a structural refactor that removes a duplicate `forum.rs` and reorganizes code into `forum/` modules without introducing significant new behavior, improving maintainability but providing less direct lasting functionality.
comparison · c_b00c261f06c2 (tommy-mor) vs c_11d6a0ec9839 (tommy-mor)
Side B fixes a real correctness bug (falling back to unrelated items when the sibling pool is too small, which silently produced wrong comparisons) and an attribution bug (agent identity leaking into DSL body text), plus removes dead UI and renames a confusing route, all backed by updated integration/browser tests. Side A is mostly CSS/JS tweaks for slider visuals and a minor per-group gradient refactor with good unit tests, but it's more cosmetic polish than structural correctness work.
B fixes lasting correctness: agent attribution via out-of-band delegate_opt instead of embedding WEB_BROWSER_AGENT in the DSL body, and stops silently expanding the compare pool to all items when siblings < 2. A’s per-group rank gradients, center-anchored slider polarity, and history/HUD alignment (with tests) are real UX fixes, but B’s protocol and pair-selection behavior outweigh A’s presentation-layer work and B’s route-rename noise.
Side A fixes a concrete UI correctness bug by changing rank gradient calculations from global ranking offsets to per-group indexing, so highlighting behaves correctly across multiple ranking groups, and adds targeted tests to lock in that behavior. Side B mixes several unrelated changes (route rename, removing a button, delegate plumbing, and fallback behavior), with much of the diff consisting of mechanical URL updates rather than a single substantive improvement.
comparison · c_c25451965a7f (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side A fixes a real functional bug (hardcoded staging/production hostnames breaking OAuth/redirect URLs for custom hosts) and DRYs up nearly-identical logic across five auth integration files into one shared `util/get-base-url`, plus corrects the deploy trigger branch — a broad, correctness-critical improvement. Side B fixes a narrower UI/rank-highlighting bug and polishes vote-slider styling with decent added tests, but its impact is confined to one page's visual presentation rather than core app correctness.
B fixes real vote/rank UI semantics (per-group gradients instead of global offsets, center-anchored winner fill, oriented history sliders) and locks them in with polarity and style tests. A’s HOSTNAME/origin consolidation and staging deploy trigger are useful infrastructure cleanup, but more mechanical than B’s correctness and UX invariants.
Side A introduces a reusable `get-base-url` utility driven by `HOSTNAME` with environment fallbacks, replaces multiple hardcoded callback URL implementations across OAuth/login integrations, updates the frontend to use `window.location.origin`, and adjusts deployment to the staging branch. These changes fix incorrect redirects for custom hosts and centralize configuration, whereas Side B mainly corrects vote comparison highlighting and visualization logic with supporting tests and CSS, an important but more localized UI fix.
comparison · c_b00c261f06c2 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side B fixes a real UX/architecture flaw (redirect-based auth flow) by unifying the auth form with the existing poem/fetch pattern, adding proper fragment responses and consistent layout reuse, which reduces special-casing and duplicated layout code. Side A is a solid, well-tested UI bugfix (vote highlighting/slider polarity) with good tests, but it's narrower in scope and mostly CSS/JS polish plus a per-group ranking fix, offering less structural improvement than B's consolidation of auth handling into the existing generic form-submission mechanism.
A fixes core vote/ranking UI correctness (per-group gradients, center-anchored winner fill, ratio→slider polarity) and locks it in with polarity and rank-style tests, replacing mismatched history bars with HUD-consistent sliders. B is a clean but narrower auth UX change (fragments + poem innerHTML morph instead of redirects) that mostly refactors the choose-username path without comparable invariant fixes.
Side B introduces a reusable interaction pattern by changing auth POST handling from redirect-based navigation to HTML fragments that the existing Poem JS morphs into the form, enabling inline success/error feedback and restoring the standard layout while adding fragment-rendering helpers. Side A fixes a real UI bug by making rank-row gradients apply per ranking group instead of globally and adds targeted tests, but much of the remaining patch is broader vote-history UI polish rather than the core bug fix.
comparison · c_3ff71f7eaeda (tommy-mor) vs c_b00c261f06c2 (tommy-mor)
Side B fixes a real correctness bug (rank gradient computed across all groups instead of per-group, and vote-history bar direction misrepresenting ratios) and adds targeted unit tests validating the polarity/slider mapping, which is a genuine bugfix with lasting value. Side A is mostly UI polish (vote counts, HUD unpin button, docs tweak) which is useful but more incremental/cosmetic than a correctness fix.
B fixes core vote-compare correctness: rank-row gradients scoped per group, slider polarity/winner mapping aligned with HUD semantics, and history bars replaced by the same center-anchored slider model, backed by polarity and ranking invariant tests. A is valuable UX polish (unpin via POST clear, pairwise vote counts on garden icons, docs/CSS/browser coverage) but is additive surface rather than repairing the ranking/vote visualization contract.
Side B fixes a concrete correctness issue in vote comparison by making highlight gradients operate per ranking group instead of globally, aligns vote-history visualization with actual left/right vote polarity through new mapping helpers, and adds focused tests for orientation and ranking invariants. Side A adds useful UI enhancements (vote counts beside compare links and an unpin action in the HUD) plus tests, but these are primarily feature and usability improvements rather than a core correctness fix.