comparison · c_fc17a4aa31e6 (tommy-mor) vs c_ef71be9831cc (tommy-mor)
Side B is a substantial architectural refactor that removes cached edge/index state (GroupState) in favor of a minimal source-of-truth (ScopeVotes) with edges/components derived on demand, touching ranking, reducer, storage, pair-suggestion logic, and tests consistently—reducing state-sync bugs and simplifying persistence. Side A is a small, purely cosmetic UI tweak (moving the delete button into the meta row with CSS flex adjustments) with no behavioral or architectural impact.
A only relocates the delete control in forum HTML/CSS (post_header_meta + flex layout tweaks) with no behavioral or data-model change. B simplifies the core ranking store by replacing GroupState’s cached indices/edges/voted_pairs with ScopeVotes (uuid_votes + recent_votes) and deriving edges/components at rank time across reducer, ranking, pair, storage, and tests—reducing maintained state and inconsistency risk.
Side B performs a substantial architectural refactor by replacing the cached `GroupState` with `ScopeVotes`, deriving graph edges, connected components, and rankings on demand from persisted votes. It updates ranking, storage, reducer, UI, and tests consistently, simplifying persisted state while preserving behavior; Side A is primarily a UI layout change that moves the delete button into the post metadata and adjusts CSS for flexbox positioning.
comparison · c_ef71be9831cc (tommy-mor) vs c_48fcbcde8f88 (tommy-mor)
Side A performs a substantive architectural refactor of the ranking data model (replacing cached GroupState with derived-on-demand ScopeVotes), removing stale cached invariants and simplifying storage/reducer logic while preserving/updating test coverage across many files. Side B is pure test-infrastructure deduplication (moving duplicated bb helper functions into shared modules) which improves maintainability but has no functional or architectural impact on the actual product.
Commit A redesigns core ranking state (GroupState → ScopeVotes), dropping cached edges/indexes and rebuilding weights/components only at rank time across reducer, ranking, storage, and UI paths—a lasting correctness and simplicity win. Commit B only extracts duplicated babashka test helpers (HTTP, mock OAuth, asserts, cargo env) into shared modules with no production behavior change.
Side A fundamentally redesigns ranking storage by replacing cached `GroupState` edge/index data with a minimal `ScopeVotes` model and rebuilding edges, item indexes, connected components, and rankings on demand. This touches ranking, persistence, reducers, UI, and tests to preserve behavior while simplifying state and eliminating duplicated cached data, whereas Side B mainly consolidates duplicated integration-test helpers into shared utilities (`test.common`/`test.oauth`) without changing core project behavior.
comparison · c_c6beb77e8e71 (tommy-mor) vs c_ef71be9831cc (tommy-mor)
Side B is a substantial architectural refactor that removes cached, incrementally-mutated edge/index state (GroupState) in favor of a minimal ScopeVotes struct that derives rankings on demand, eliminating a whole class of rollback/mutation bugs and simplifying storage schema, with corresponding test updates across many files. Side A is a smaller, more superficial change (selector renaming, reusing entity_section markup in vote compare cards, CSS pruning) that improves consistency but has much lower architectural impact, and even introduces a stray formatting artifact in a match arm.
B redesigns core ranking state: GroupState’s cached indexes/edges/rollback become ScopeVotes (uuid_votes + recent_votes only), with edges and components derived on demand across reducer, ranking, storage, and pair logic—a lasting architectural simplification. A is useful UI cleanup (data-entity-section selectors, vote cards reusing entity_section, CSS trim) but is surface-level compared with B’s domain-model change.
Side B performs a substantial architectural refactor by replacing cached `GroupState` with `ScopeVotes`, deriving ranking edges and connected components on demand from deduplicated votes, and updating ranking, pairing, storage, replay, and tests accordingly. Side A mainly improves HTML reuse and correctness for multiple entity sections by replacing a fixed `#entity-section` target with per-item selectors and reusing `entity_section` in the vote UI, which is useful but much narrower in long-term impact.
comparison · c_afa638171cf7 (tommy-mor) vs c_ef71be9831cc (tommy-mor)
Side B removes a fragile, incrementally-maintained cache (add/subtract/rollback edge-weight bookkeeping in GroupState) and replaces it with a single source of truth (uuid_votes) from which edges, components, and rankings are derived on demand—eliminating a whole class of state-drift/rollback bugs and simplifying the core ranking model with equivalent test coverage. Side A adds a legitimate new feature (Reddit OAuth linking) with sensible identity/privacy design, but it mostly extends existing patterns (mirroring GitHub OAuth) and adds a large amount of mock/test-harness boilerplate rather than fixing a structural weakness in the core system.
A ships lasting identity architecture: UUID-only principals, multi-provider OAuth link/conflict semantics (including Reddit end-to-end), private linked-provider UX, trust-weight stacking, and a real batch pending_weights fix. B is valuable core cleanup—dropping GroupState’s cached edges/idxs/rollback for on-demand ScopeVotes derivation—but it mostly realigns in-memory state with an already-deduped uuid_votes source of truth rather than adding comparable product capability.
Side B performs a substantial architectural simplification by replacing cached `GroupState` edge/index state with `ScopeVotes`, deriving edges, item indices, connected components, and rankings from persisted `uuid_votes` on demand. This removes duplicated mutable state across the reducer, storage, ranking, and UI layers while preserving behavior through broad test updates, whereas Side A mainly extends OAuth with Reddit support and UUID-linked identities, adding valuable features but with a narrower long-term impact.
comparison · c_48aeaf9b52c3 (tommy-mor) vs c_ef71be9831cc (tommy-mor)
Commit A fixes a genuine correctness bug (bipartite chain oscillation on star topologies) with a principled algorithmic correction grounded in the cited paper, plus solid regression tests (Rust + Clojure fixtures) proving the fix. Commit B is a substantial refactor (GroupState -> ScopeVotes, deriving edges on demand) that improves architecture and removes cached-state bugs risk, but it is churn-heavy, touches many files for a design preference, and doesn't fix a user-visible bug or add new guarantees beyond what A already established.
A fixes a real correctness bug in the core Rank Centrality math (wrong d_max caused bipartite oscillation and uniform star scores), aligns the implementation with the paper, and adds targeted regression tests. B is a worthwhile structural simplification (votes-only ScopeVotes, derive edges on demand) but is largely mechanical renames and state-hoisting across many call sites without changing ranking behavior.
Side B performs a substantial architectural refactor by replacing the cached `GroupState` with `ScopeVotes`, deriving edge weights and connected components on demand (`edges_from_scope`, `scope_components`, `item_index`) and updating persistence, ranking, pairing, UI, and tests to use the new model. Side A fixes an important correctness bug in Rank Centrality by switching to degree-based `d_max` and adds strong regression tests, but B's redesign simplifies state management, removes duplicated cached data, and establishes a more maintainable foundation across the project.
comparison · c_ef71be9831cc (tommy-mor) vs c_9bced108c8aa (tommy-mor)
A is a clean internal refactor (GroupState -> ScopeVotes) that removes cached edge state in favor of deriving it on demand, improving simplicity but is mostly mechanical renaming/restructuring of existing logic. B introduces a new, well-tested semantic URL graph (DFA traversal, builder with validation, generic fallback, extensive equivalence-class and regression tests) that adds real, durable functionality for canonicalizing and breadcrumbing URLs across reddit/youtube/generic sites, representing more net new capability with strong test coverage.
Commit A redesigns the core vote model (GroupState → ScopeVotes), dropping maintained edges/idx maps/rollback paths so ranking and pair logic derive weights from uuid_votes on demand across reducer, ranking, storage, and UI. Commit B adds a solid URL DFA/canonicalization stack with tests, but it is new peripheral infrastructure rather than a lasting simplification of the project's central ranking state.
Side A implements a substantial architectural refactor: it replaces cached `GroupState` with a simpler `ScopeVotes` model, derives ranking edges and connected components on demand, updates persistence and ranking algorithms, and adapts callers and tests throughout the project. Side B adds a sizable URL canonicalization/graph subsystem with extensive tests, but it is largely an isolated new feature, whereas Side A simplifies core state management and removes redundant cached data in a way that affects the project's central ranking pipeline.
comparison · c_ef71be9831cc (tommy-mor) vs c_77729db919ab (tommy-mor)
Side B introduces a genuinely new, composable URL-canonicalization subsystem (url_rules module with engine + registry, domain-specific rules for reddit/youtube, breadcrumb/parent derivation) that fixes real correctness issues (schemeless IDs, non-canonical hosts, youtube variants) and is exercised by substantial new tests. Side A is a solid internal refactor (GroupState -> ScopeVotes, deriving edges on demand) that improves clarity but is mostly mechanical renaming/restructuring of existing logic without adding new capability or fixing an external-facing bug, making B's contribution somewhat more impactful in scope though both are reasonable quality refactors.
A removes incremental edge/index caches from GroupState (ensure_item, rollback_weights, voted_pairs) in favor of ScopeVotes that keep only uuid_votes/recent_votes and rebuild edges at rank time—a lasting single-source-of-truth fix across reducer, ranking, storage, and pair logic. B adds a real url_rules engine and full-URL ItemIds, but much of the diff is mechanical https:// string churn in tests and call sites rather than equally deep design consolidation.
Side A makes a substantial architectural change by replacing cached `GroupState` with `ScopeVotes`, deriving ranking edges and connected components on demand from deduplicated votes. It updates ranking, storage, reducers, UI, and tests consistently, simplifying persisted state while preserving behavior. Side B mainly introduces URL canonicalization infrastructure and migrates many tests and IDs to `https://` forms, which is useful but much of the patch is mechanical conversion rather than a core data model improvement.