comparison · c_bc8c17a00ed7 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Commit A introduces a functional behavior change by excluding pinned/stickied Reddit posts during subreddit import, adds a dedicated helper, updates documentation, and includes a regression test covering both relevant Reddit fields (`stickied` and `pinned`). This is a meaningful correctness improvement that affects imported data. Commit B is primarily a cleanup/refactoring change that removes dead code made redundant by earlier validation, updates expectations in a test, and preserves existing behavior through lower-level edge handling. While valuable for code simplicity, its impact is smaller than the new functionality and regression protection added in A.
Commit A introduces a meaningful behavior change to the Reddit ingestion pipeline by filtering out pinned/stickied posts, adds a helper function, updates documentation, and includes a targeted test. This improves data quality and affects downstream processing. Commit B mainly removes a redundant guard and adjusts tests to reflect existing behavior, a smaller refactor with minor behavioral implications. Overall, A has broader functional impact.
Side A introduces new functional behavior (skipping pinned/stickied Reddit posts), adds a dedicated helper function, updates documentation, and includes a comprehensive unit test. This meaningfully changes import semantics and improves correctness. Side B removes a redundant guard and adjusts tests to reflect existing behavior, which is a smaller refactor/cleanup. Overall, Side A delivers a more substantial contribution.
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_bc8c17a00ed7 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A fixes importer behavior by explicitly skipping stickied/pinned Reddit posts in `parse_children`, adds a dedicated `child_is_pinned` helper checking both `stickied` and `pinned` flags, and includes a regression test covering both cases. Side B mainly removes a guard that is asserted to be unreachable because earlier validation already rejects zero ratios, updating tests to reflect existing behavior rather than adding new functionality or fixing a user-visible issue.
A adds a concrete behavioral improvement by filtering out stickied/pinned Reddit posts in `parse_children`, with a dedicated helper and test ensuring only real posts are imported. B mainly removes a supposedly dead zero-ratio guard in `apply_vote` and adjusts tests, which is a cleanup with minor semantic change but less clear user-facing impact.
Side A adds a concrete behavioral improvement by skipping stickied/pinned Reddit posts during import via a new `child_is_pinned` check in `parse_children`, along with a focused test verifying only non-pinned posts are returned. Side B merely removes a zero-ratio early return in `apply_vote` and adjusts a test, changing when items are registered but not adding new functionality; it’s largely cleanup of redundant logic.
Side A fixes a real behavioral bug (pinned posts polluting subreddit imports) with a working implementation and a dedicated regression test, directly improving data correctness. Side B is a minor cleanup removing dead code and relies on assuming add_edge_weight's zero-skip behavior is correct elsewhere, which is lower-risk but also lower-impact than A's functional fix.
A adds lasting import behavior by filtering stickied/pinned Reddit posts in parse_children, with a dedicated helper and a focused unit test covering both sticky fields and a normal post. B only deletes a defensive zero-ratio early-return already enforced upstream and adjusts a test to match; useful hygiene, but no new capability or user-facing fix.
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_28dfd8015c8a (tommy-mor) vs c_cf0a514b261a (tommy-mor)
B removes actual dead/redundant logic in production Rust code and updates the corresponding test to correctly verify the new invariant (items still registered, edges skipped), representing a real behavioral cleanup with verification. A is a config-only change unifying kaocha test suites, which is convenient but purely infrastructural and lower-risk/lower-value than fixing incorrect logic and test assertions in the core reducer.
A replaces hand-maintained ns allowlists with a single ^test\..+ auto-discovery rule, a lasting design fix so new suites (e.g. test.ranking) run without edits to tests.edn or CI. B only deletes a redundant zero-ratio early-return already enforced at the DSL/handler boundary and retunes one unit test—correct hygiene, but smaller lasting impact than the discovery simplification.
Side A replaces manually enumerated Kaocha test suites with a single auto-discovered `^test\..+` configuration, eliminating ongoing maintenance and ensuring new test namespaces run automatically without updating `tests.edn`. Side B mainly removes a redundant dead-code guard and updates the corresponding test expectations; while it simplifies logic, its impact is narrower than the lasting improvement to test infrastructure in Side A.
comparison · c_cf0a514b261a (tommy-mor) vs c_9bced108c8aa (tommy-mor)
Side B introduces a substantial, well-tested URL canonicalization subsystem (graph traversal DFA, builder with validation, parsing, tracking-param stripping, generic fallback) with extensive unit and integration tests covering reddit/youtube edge cases—clear lasting functional value. Side A is a small, correct cleanup removing dead code and updating a test comment/assertion, which is valid but minor in scope and impact compared to B's substantial new capability.
A only deletes a few lines of already-dead zero-ratio guard code and retunes one test; B introduces a full URL canonicalization subsystem (graph DFA, builder, parser, registry tests) with real design and broad coverage for Reddit/YouTube/generic URLs and breadcrumbs.
Side B adds a substantial new URL canonicalization subsystem: a graph/DFA-based resolver with parsing, graph builder validation, generic fallback logic, Reddit/YouTube canonicalization, breadcrumb generation, and extensive unit/end-to-end tests covering normalization, encoding, aliases, and regressions. Side A only removes a now-redundant zero-ratio guard from `apply_vote` and updates the test expectations to reflect that zero-weight edges are skipped later while items are still registered.
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_4ed2e2cca39b (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A fixes a real runtime bug (NameError on missing API base URL) that would crash the OAuth callback, providing a concrete correctness fix. Side B is a minor cleanup removing dead code and adjusting a test's assertions, which is reasonable but lower-impact than fixing an actual crash-causing bug.
A fixes a real NameError by defining the missing GITHUB_API_BASE_URL default used in the OAuth path, restoring a broken auth flow. B only deletes a dead zero-ratio early-return already enforced at parse/handler layers and adjusts a test—useful hygiene, but not a functional bugfix.
Side A fixes a concrete runtime bug by defining `GITHUB_API_BASE_URL` with a default and normalizing it, preventing a `NameError` when the OAuth callback references the setting. Side B mainly removes a supposedly redundant zero-ratio guard and updates tests to reflect the new behavior (registering items/pairs while skipping zero-weight edges), which is more of a cleanup/behavior adjustment than a clear bug fix.
comparison · c_cf0a514b261a (tommy-mor) vs c_ebc883667d61 (tommy-mor)
Side B fixes a genuine build-breaking ambiguity (duplicate forum.rs vs forum/mod.rs) and completes a real module split into cohesive files (feed, page, paginator, post_single, profile, thread_morph), which is structural, lasting cleanup enabling future maintenance. Side A removes truly dead code and updates a test correctly, which is valid but much smaller in scope and impact than resolving a module-resolution conflict and restructuring a 1400-line monolith.
A removes a real dead-code path in apply_vote and fixes the negative-ratio test to the actual contract (items/pairs registered; zero-weight edges skipped by add_edge_weight), tightening core vote semantics. B only deletes the leftover monolithic forum.rs and reshuffles the same HTML into forum/* modules—including large near-copies of feed/views/profile—so its value is structural cleanup, not new behavior.
Side A makes a behavioral change by removing a dead zero-ratio early return in `GroupState::apply_vote`, relying on existing parser/browser validation and `add_edge_weight` to skip zero-weight edges. It also updates tests to verify that items and pairs are still registered while no edges are created, reflecting the intended reducer semantics. Side B is primarily a large refactoring that deletes the monolithic `forum.rs` and redistributes code into submodules without introducing significant new functionality.
comparison · c_d6d339485601 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A adds a genuine user-facing feature (connectivity/topology stats in CLI output) with clear formatting logic and two solid unit tests, with no behavioral risk. Side B claims to remove 'dead code' but the diff shows the change actually alters reducer behavior (items and pairs are now registered even for a zero-ratio vote), contradicting its own justification and introducing a subtle state inconsistency risk despite the tests being updated to match.
A adds lasting user-facing value by surfacing existing connectivity stats (density, components, comparisons-to-connect) in pair CLI output with focused formatting and tests. B only deletes a redundant zero-ratio early-return already enforced at parse/handler boundaries and adjusts the related test, which is correct hygiene but much smaller project impact.
Side A adds a new user-visible capability by formatting and displaying existing graph connectivity statistics in the CLI, including density, connectedness, and pluralization, and backs it with unit tests covering connected and disconnected cases. Side B is a small cleanup that removes a redundant zero-ratio guard and updates a test to reflect existing behavior (items/pairs are still registered while zero-weight edges are skipped), which is useful but narrower in lasting impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_f6d0fed9bf9a (tommy-mor)
Side A is a small, correct, well-reasoned bugfix with an updated test asserting the new (correct) behavior, and clear justification for why the removed guard was dead code. Side B is a chaotic 'init seed' dump that includes shell-prompt garbage pasted into files (forms.rs, ranking.rs, reducer.rs literally start with 'tommy@...cat server/src/...'), making those files non-compiling noise rather than a real, usable commit, despite containing large amounts of code.
B seeds core product surface—rank centrality, GroupState/reducer event application, vote compare UI, HTML form RPC plumbing, and test harnesses—whereas A only deletes a few lines of already-dead zero-ratio guard and retargets one unit test. Even with notes and some paste-corrupted files, B’s lasting design mass dwarfs A’s small cleanup.
Side A removes a demonstrably dead zero-ratio early return from `GroupState::apply_vote`, relying on existing parser/browser validation and the existing `add_edge_weight` zero-weight check, then updates the test to verify the new intended behavior (items and pairs are still registered while zero-weight edges are skipped). Side B is an enormous seed commit mixing many unrelated additions, including files that accidentally contain shell transcript text (e.g. `forms.rs` and `ranking.rs` begin with terminal output), making it noisy and likely non-buildable rather than a clear, lasting project improvement.
comparison · c_cf0a514b261a (tommy-mor) vs c_11d6a0ec9839 (tommy-mor)
Side B fixes a real attribution bug (delegate leaking into DSL text), removes a broken fallback that silently used unrelated items, cleans up dead UI code, and renames a route across the whole codebase with matching test updates — a broader, functionally meaningful change. Side A is a small correctness/dead-code cleanup in the reducer with a decent test update, but it's narrower in scope and impact.
B fixes real product bugs on the vote page: correct out-of-band delegate attribution instead of embedding the agent in DSL text, and refusing a sibling pool < 2 rather than silently falling back to all items—plus removing a useless control. A only deletes a dead zero-ratio guard already enforced upstream and retargets one test, which is sound hygiene but far less lasting impact.
Side B fixes multiple user-facing correctness issues: it passes the browser agent as an explicit delegate instead of embedding it in DSL text, prevents an incorrect fallback to all items when the sibling pool has fewer than two candidates, simplifies the UI by removing the swap button, and consistently renames the voting route to `/vote` across handlers and tests. Side A mainly removes a now-redundant zero-ratio guard in `apply_vote` and updates the associated test expectations, which is a smaller cleanup relying on existing validation and edge-skipping behavior rather than adding significant new functionality or fixing broader behavior.
comparison · c_cf0a514b261a (tommy-mor) vs c_3ff71f7eaeda (tommy-mor)
Side B delivers multiple real feature improvements (vote-count tooltips/badges on garden pin icons, converting the pin HUD link into a proper unpin form action, plus matching CSS and new/expanded automated tests) that add durable, well-tested functionality. Side A is a small, well-justified but minor dead-code removal in the reducer with a corresponding test update—correct and clean, but far more limited in scope and impact.
B adds durable product value: pairwise vote counts on garden vote controls, pin-HUD unpin (clear) instead of a misleading item link, themed CSS, and browser/unit coverage. A only deletes a already-redundant zero-ratio early-return in the reducer and retunes one test—correct hygiene, but far less lasting impact.
Side B adds substantive user-facing functionality and supporting infrastructure: it replaces the pin HUD permalink with an unpin POST action, displays pairwise vote counts in the garden UI via a new `edge_vote_count_for_pair` helper, updates CSS/JS, and adds both unit and browser tests to verify the behavior. Side A is a small cleanup that removes a redundant zero-ratio guard in `apply_vote` and adjusts tests to reflect existing parser and edge-handling behavior, which is useful but much narrower in lasting impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_6a02ffb06a41 (tommy-mor)
Side B fixes a real off-by-one/indexing bug (0-based vs 1-based thread_post_index mismatch used in URLs), removes a dead conditional in the template, and adds regression tests plus doc clarifications across three files, giving concrete lasting correctness value. Side A merely removes a redundant early-return guard that was already dead code, a smaller and lower-impact cleanup with a single adjusted test.
B fixes real indexing inconsistency by switching rank-history thread_post_index from 1-based-with-silent-0-default to shared 0-based paths (/t/tag/N), replacing unwrap_or(0) with invariant enforcement and updating API/UI/tests/docs accordingly. A only deletes a dead zero-ratio guard already enforced upstream and retunes one unit test, which is sound cleanup but lower lasting impact.
Side B corrects and standardizes the thread post index semantics across RPC, HTML, types, and integration tests: it switches rank history to the intended 0-based `/t/tag/N` indexing, removes the silent `unwrap_or(0)` fallback in favor of asserting the expected invariant with `expect(...)`, and updates rendering and documentation accordingly. Side A is a worthwhile cleanup that removes a redundant zero-ratio guard and updates tests to reflect that zero-weight edges are skipped elsewhere, but it is primarily dead-code removal relying on existing validation.
comparison · c_cf0a514b261a (tommy-mor) vs c_e57094c6229a (tommy-mor)
Side B introduces a substantial, working feature: explicit user-initiated entity fetching (vs auto-fetch on browse), full raw payload persistence via a new EntityImported event, dotenv support, config-driven Reddit API base URLs for testability, UI controls, CSS, and an integration test with a mock Reddit server plus fixtures. Side A is a minor, low-risk cleanup removing dead code with a corresponding test update, which is fine but has far less lasting architectural impact than B's design change (raw payload storage/replay, decoupled fetch triggering, and testable API config).
Side B lands a durable architectural feature: user-initiated entity import with full payloads in the event log (EntityImported), replay via apply_entity_import, configurable Reddit API bases, and an explicit Fetch UI plus integration coverage. Side A only deletes a dead zero-ratio guard in apply_vote and tweaks one unit test—correct cleanup, but negligible lasting design impact beside B.
Side B introduces substantial new functionality and architecture: explicit user-triggered Reddit entity fetching, persistent `EntityImported` events with replay support, storage of raw API payloads plus derived views, configurable API endpoints, and associated UI, tests, and fixtures. Side A only removes a now-redundant zero-ratio guard in `apply_vote` and updates a test to reflect that zero-weight edges are skipped while items are still registered, which is a small cleanup compared with B's lasting feature additions.
comparison · c_cf0a514b261a (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B adds a real end-to-end feature (CLI `room create` command, RPC wiring, docs/guide updates) plus a genuine simplification removing the unused ThreadVisibility concept and its plumbing across events, reducer, timeline, and tests. Side A is a small, correct but minor dead-code cleanup in the reducer with a test tweak, of much smaller scope and impact.
B adds the end-to-end `room create` CLI path and simplifies the domain (drops ThreadVisibility/RoomState, rooms become a HashSet) with matching RPC, events, docs, and tests—real lasting product and design value. A only deletes a dead zero-ratio guard already enforced at parse/handler boundaries and adjusts one test, a correct but tiny cleanup.
Side B adds a substantial new user-facing capability by introducing a CLI `room create` command, wiring it through the RPC layer, updating the server implementation, simplifying room state from a `HashMap` with unused visibility to a `HashSet`, and updating tests and documentation accordingly. Side A is a small cleanup that removes a redundant zero-ratio guard in `apply_vote` and adjusts a test to reflect existing zero-weight edge handling, which is useful but much narrower in impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_c25451965a7f (tommy-mor)
Side B fixes a real, spreading bug: hardcoded hostnames/URLs across multiple OAuth/redirect integrations (linear, twitter, spotify, youtube, login, oauth, frontend authUtils) that would break custom deployments, consolidating logic into a single util.get-base-url and enabling CI deploys from staging. Side A is a minor, low-risk cleanup removing dead-code guard in one reducer function, useful but narrow in scope and impact compared to B's cross-cutting correctness and deployability fix.
B lands a real functional fix by centralizing base-URL logic (HOSTNAME / window.location.origin) across OAuth, login, Spotify/Twitter/YouTube callbacks and the frontend, plus switching the deploy workflow to staging—removing brittle hardcoded hosts. A only deletes a few lines of already-dead zero-ratio guard and tweaks the matching test, which is worthwhile hygiene but far smaller lasting impact.
Side B introduces a reusable get-base-url utility driven by HOSTNAME and updates multiple OAuth/login/callback paths to use it instead of hardcoded production/staging hostnames, plus the frontend now derives its base URL from window.location.origin. These are lasting functional improvements for custom-host deployments and deployment workflow, whereas Side A mainly removes a redundant zero-ratio guard and adjusts the associated test expectations after relying on existing parser validation and edge-skipping behavior.
comparison · c_cf0a514b261a (tommy-mor) vs c_c42f908efc44 (tommy-mor)
Side B is a substantial type-safety refactor that threads CanonicalItemUrl through resolve_item, RPC handlers, and validation, eliminating repeated string-to-newtype conversions and reducing the chance of stringly-typed bugs across a large surface area, plus adding Deref impls for ergonomics. Side A is a tiny, low-risk cleanup removing dead code with a corresponding test fix, which is correct but narrow in scope and impact compared to B's broader architectural improvement.
B pushes CanonicalItemUrl through resolve_item, pools, validate, rank-change maps, and pair selection, dropping repeated String wrap/unwrap and CanonicalItemUrl::parse round-trips while adding Deref on href newtypes—real type-boundary cleanup with lasting API clarity. A only deletes a dead zero-ratio early-return already enforced at parse/handler and retargets one test; correct hygiene, but far smaller enduring design impact.
Side B performs a broad but coherent type-safety refactor by changing `resolve_item` to return `CanonicalItemUrl`, propagating canonical URL types through validation, ranking, RPCs, and connectivity logic, and adding `Deref<str>` support to URL newtypes to reduce string conversions. Side A removes a redundant zero-ratio guard and updates the corresponding test to reflect that zero-weight edges are skipped later while items are still registered, which is a comparatively small cleanup with limited architectural impact.
comparison · c_64faa3bee86f (tommy-mor) vs c_cf0a514b261a (tommy-mor)
A implements a real feature (inline HTML fragment morphing for auth forms without redirects), touching multiple files with coherent, working logic and matching CSS updates for both themes. B is a minor, low-risk dead-code cleanup in the reducer with a test update, which is fine but much smaller in scope and impact.
A replaces auth redirects with HTML fragments and poem-JS morphing, plus shared form_inner/layout reuse—lasting UX and design cohesion. B only deletes a dead zero-ratio guard already enforced upstream and adjusts one test, a correct but low-impact cleanup.
Side A changes the authentication flow to return HTML fragments instead of redirects, adds reusable auth fragments, updates the shared Poem JS form handler to morph returned HTML into the form, and integrates the pages with the common layout, providing a lasting UX and architectural improvement. Side B is a small cleanup that removes a redundant zero-ratio guard in the reducer and updates tests to match existing behavior, which is useful but much narrower in impact.
comparison · c_f515f8a12d7a (tommy-mor) vs c_cf0a514b261a (tommy-mor)
A removes a duplicated UI action (ExpandNewThreadForm) and toolbar, consolidating on a single SSR-based compose flow for both room and home pages—an actual simplification of user-facing behavior and codebase surface, with tests removed for the eliminated action. B merely deletes a defensive zero-ratio guard in the reducer, trading redundant safety for marginal code reduction while making item/pair registration behavior change slightly riskier if reachable from another path, offering less durable value than A's consolidation.
A removes an entire UI action (ExpandNewThreadForm), the home toolbar + hop, and SSRs #new-thread-ui-slot like room pages—real lasting simplification of the compose flow. B only deletes a dead zero-ratio guard already enforced upstream, plus a small test tweak; correct hygiene but far less product impact.
Side A removes the now-redundant ExpandNewThreadForm UI action and its server handler, switching the public home page to server-render the same collapsed new-thread slot used on room pages. This simplifies the architecture by eliminating duplicate interaction paths and associated parsing/tests while preserving logged-in and logged-out behavior. Side B mainly deletes a dead zero-ratio guard and updates a test to reflect existing downstream handling, which is a smaller cleanup with less architectural impact.
comparison · c_f10e7b043e68 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A completes a meaningful architectural migration of URL canonicalization from ad-hoc per-domain functions to a more principled graph/DFA-based design, deleting ~190 lines of bespoke engine code and updating the public registry API and docs accordingly, which is more consequential for future maintainability. Side B is a valid but very small dead-code removal (a redundant zero-ratio guard) with a matching test update, useful but narrow in scope compared to A's structural rework.
A replaces the ad-hoc ParsedUrl combinator engine with a semantic graph-based URL canonicalization design (new graph/parse modules, slimmed registry API, updated docs)—a lasting architectural change to core ItemId identity. B only deletes a dead zero-ratio early-return and adjusts one test comment/assertion; useful hygiene but negligible lasting design impact.
Side A replaces the URL canonicalization architecture from ad hoc normalization functions in `engine.rs` with a graph-based API (`graph`/`parse`) and updates the public registry to delegate canonicalization and breadcrumb generation through that abstraction, along with documentation and test module reorganization. Side B only removes a redundant zero-ratio guard in `apply_vote` and adjusts the corresponding test expectations, which is a small cleanup with limited long-term impact.
comparison · c_939729b4d9a6 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A introduces a real feature (a vote page/redirect flow, typed form-hole substitution for i32 fields, new dependencies wired correctly, JS slider logic, CSS) with accompanying tests, delivering substantial new functionality. Side B is a small, well-reasoned cleanup removing dead code and adjusting a test's assertions, which is valid but far more limited in scope and lasting impact.
A ships a real vote-compare flow (route, HTML/CSS/JS, post-vote navigation via `next`, `$form:i32` substitution with tests) that extends product capability. B only deletes a dead zero-ratio early-return already enforced elsewhere and adjusts one test—correct hygiene, but negligible lasting design impact.
Side A introduces substantive functionality and infrastructure: typed form-template substitution for i32 fields with tests, a new `next` navigation flow after recording votes, routing/hooks for a voting UI, and supporting client-side behavior and dependencies. Side B only removes a redundant zero-ratio guard from `apply_vote` and updates the corresponding test expectations, which is a small cleanup compared with A's broader, lasting feature and correctness improvements.
comparison · c_7ec67b9cef2c (tommy-mor) vs c_cf0a514b261a (tommy-mor)
B is a small, verified real change: it removes dead/incorrect logic in apply_vote, explains why via the add_edge_weight invariant, and updates the corresponding test to assert the new correct behavior. A is purely a planning document plus a thin, largely unused wrapper struct (RouteContext) that doesn't actually change any behavior or migrate any call sites yet, so its lasting code value is minimal compared to B's concrete bugfix.
B removes proven dead code in apply_vote and corrects the related test to match real behavior (items/pairs register; zero-weight edges stay absent), a small lasting simplification of production logic. A mostly adds a handoff plan.md plus a thin RouteContext newtype that still delegates to ThreadNav/CanonicalItemUrl—useful staging, but little durable design landed compared with B’s precise reducer cleanup.
Side B removes a redundant early return in `GroupState::apply_vote`, allowing items and voted pairs to be registered while still relying on existing zero-weight edge handling, and updates tests to verify the intended behavior. Side A mainly adds a long planning document plus a thin `RouteContext` wrapper around `ThreadNav` and exports it, which is useful scaffolding but introduces little functional change on its own.
comparison · c_ca72f0995396 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A improves a real UI feature (consolidated cli_panel with hover-copy) and adds a genuine safety assertion against JS-injection via unescaped single quotes, while updating call sites and two theme CSS files consistently. Side B is a small, plausible dead-code cleanup in the reducer with a test update, but it's a minor, low-impact correctness tweak rather than a substantive feature or bugfix. Both are reasonable, but A delivers more lasting functional and UX value.
A redesigns cli_panel into a multi-command grouped UI with click-to-copy rows, JS single-quote safety asserts, call-site updates, and theme CSS—lasting UX and correctness across pages. B only deletes a redundant zero-ratio early-return already enforced upstream and adjusts one test, a correct but tiny dead-code cleanup.
Side A redesigns the shared `cli_panel` component to support multiple commands in a single panel, adds click-to-copy rows, updates all call sites to the new API, and introduces assertions preventing unsafe characters from being embedded in single-quoted JavaScript literals. Side B mainly removes a now-redundant zero-ratio early return and adjusts a test to reflect existing behavior, which is a smaller cleanup with narrower long-term impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_16438843de8f (tommy-mor)
Side A is a small, precise cleanup that removes genuinely dead code, correctly reasons about why the guard is redundant, and updates the corresponding test to verify actual behavior—clear, verifiable, lasting value. Side B ('more seed') dumps loose files (Dockerfile, fly.toml, deps.edn, and stray event_log.rs/views.rs at repo root, not integrated into any module tree) with no clear integration or intent, appearing to be unstructured scaffolding rather than a coherent, reviewed contribution.
B adds lasting project infrastructure (Dockerfile, fly.toml deploy config, event_log persistence, and ViewStore), while A only deletes a small dead zero-ratio guard and retunes one test. The deploy/persistence modules outweigh a few lines of redundant validation cleanup.
Side A makes a targeted behavioral cleanup by removing a redundant zero-ratio early return that is already enforced by earlier validation, preserving negative clamping and updating the test to reflect the intended semantics (items and pairs are still registered while zero-weight edges are skipped). Side B adds several new files (Dockerfile, Fly config, event log and view store modules), but the patch shows no integration with the existing codebase, so much of its lasting impact is uncertain from the diff alone.
comparison · c_cf0a514b261a (tommy-mor) vs c_5696b828c728 (tommy-mor)
Side A removes actual dead code in a code path (a redundant guard in apply_vote), verifies the correctness rationale, and updates a test to match real behavior with clear reasoning about invariants—this is a small, precise, functional cleanup. Side B is a large documentation-only rewrite that improves internal consistency of docs/plans but changes no code behavior and carries risk of documentation drift versus actual implementation; it's valuable but purely informational rather than a lasting code-level fix.
A removes dead zero-ratio early-return logic from apply_vote and corrects the test to the real behavior (items/pairs still registered; zero-weight edges skipped), a precise reducer cleanup. B only rewrites DSL/GUIDE/plan docs to drop @ from wire identity—useful alignment, but documentation churn without runtime effect.
Side A makes a behavioral code change by removing a redundant early return in `GroupState::apply_vote`, allowing items and voted pairs to be registered even when clamped ratios become zero while still relying on `add_edge_weight` to skip zero-weight edges. It also updates the test to verify the new, more consistent reducer behavior. Side B is an extensive documentation update aligning guides and plans with the current identity model, but it does not change project behavior.
comparison · c_c6beb77e8e71 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A fixes a real bug (duplicate hardcoded #entity-section ids breaking morph targeting when multiple entities render) by introducing per-item selectors, and it deduplicates vote-card rendering by reusing entity_section instead of a separate ad-hoc markup path, trimming CSS accordingly. Side B is a valid but minor dead-code removal with a supporting test update, offering less lasting architectural benefit despite being clean and correct.
A replaces a single global #entity-section/#entity-panel id with per-item data-entity-section selectors and a shared entity_section_selector, then reuses entity_section in the vote compare UI and drops the duplicated vote-compare markup/CSS—real lasting UI structure. B only deletes a dead zero-ratio early-return in apply_vote and adjusts one test, a correct but tiny cleanup already covered by parser/handler guarantees.
Side A makes a functional design improvement by replacing a global `#entity-section` target with per-item `data-entity-section` selectors and a shared `entity_section_selector`, allowing SSE/Idiomorph updates to address the correct entity section. It also refactors vote comparison to reuse the common `entity_section` rendering, eliminating duplicated UI code and aligning styling, whereas Side B mainly removes a now-redundant guard and updates tests to reflect existing behavior around zero-weight edges.
comparison · c_19f4b8f10b98 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
B removes genuinely dead/redundant code with a clear rationale and updates the corresponding test to match the new (correct) behavior, improving code clarity and correctness confidence. A is a UI simplification that removes labels/toggle behavior and changes placeholder text, which is a stylistic tweak with less lasting substantive value and risks losing the collapsible-form UX without clear justification.
B removes proven dead code from the core reducer and updates tests to match the real invariant (zeros rejected upstream; zero-weight edges skipped), which is a lasting clarity/correctness win. A only trims UI chrome and tweaks placeholders/copy on the new-thread form—cosmetic churn with little durable design impact.
Side B removes a redundant guard in the reducer based on documented upstream validation, preserving item and pair registration while relying on existing zero-weight edge handling, and updates tests to verify the intended behavior. Side A mainly simplifies the forum form UI by removing labels/toggle behavior and changing placeholder text/button wording, which is largely cosmetic and potentially reduces usability rather than adding durable functionality.
comparison · c_48fcbcde8f88 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side A meaningfully deduplicates substantial copy-pasted HTTP/oauth/harness code across four test files into shared modules (test.common, test.oauth), reducing maintenance burden and improving correctness consistency (timeouts, multi-user mock). Side B is a small, well-justified dead-code removal with an updated test, which is valuable but narrower in scope and lasting impact than A's broad de-duplication.
A extracts duplicated HTTP clients, mock Google OAuth, assert/ANSI harness, cargo-build, and server-env helpers into test.common/test.oauth and rewires auth/grants/integration to use them, which is lasting test design. B only deletes a few lines of already-dead zero-ratio guard in apply_vote and adjusts one unit test—correct hygiene, but far smaller lasting impact.
Side A consolidates duplicated test infrastructure into shared utilities by introducing reusable helpers such as `run-cargo-build-release!`, `slug-server-env`, shared test assertions, configurable OAuth mock behavior, and `complete-registration!`, then updates multiple integration test suites to use them. This reduces maintenance burden and centralizes behavior across the test codebase, whereas Side B only removes a redundant zero-ratio guard in `apply_vote` and adjusts a single test to match the revised semantics.
comparison · c_3403e5929da7 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side B removes genuinely dead/redundant code with a clear rationale (guard is now unreachable given upstream validation) and updates the corresponding test to reflect the correct invariant, tightening the reducer's logic. Side A refactors sibling grouping in a UI-only helper (splitting unranked items into separate groups) with a matching test, which is a smaller, more cosmetic behavioral tweak with less systemic value than removing incorrect/dead logic in core reducer code.
A changes real sibling-nav behavior (each unranked item becomes its own group) with an updated contract and a dedicated regression test, which shapes lasting UI structure. B only deletes a redundant zero-ratio early-return already enforced upstream and retunes an existing test—useful hygiene, but no meaningful product or design effect.
Side A makes a functional change to sibling navigation by placing each unranked sibling into its own navigation group instead of one combined group, and adds a targeted regression test verifying the new grouping behavior. Side B mainly removes a redundant zero-ratio early return and updates the test to reflect that items are still registered while zero-weight edges are skipped, which is a worthwhile cleanup but has a narrower long-term impact.
comparison · c_b8e80699547c (tommy-mor) vs c_cf0a514b261a (tommy-mor)
Side B is a small, precise bugfix that removes dead/redundant logic in a live reducer and updates the corresponding test with correct reasoning, improving code clarity and correctness in production code. Side A is a large, unintegrated new file (reddit.rs) with no evidence of being wired into the rest of the codebase, tests, or build, making its lasting value speculative compared to B's verified, real correctness fix.
A adds a full RedditClient module (rate limiting, request helpers, and robust serde types/deserializers for posts/comments), which is substantial lasting infrastructure. B only deletes a redundant zero-ratio early-return already enforced upstream and tweaks the related test, a correct but minimal dead-code cleanup.
Side A adds a substantial new Reddit API client with rate limiting, HTTP request handling, response/error processing, typed serde models, custom deserializers, and helper methods for working with posts and comments, introducing significant reusable functionality. Side B is a targeted cleanup that removes a redundant zero-ratio guard in the reducer and updates the test to reflect existing behavior where zero-weight edges are already skipped, which is a useful but much smaller maintenance improvement.
comparison · c_a337088f57f0 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
B removes actual dead/redundant defensive code in a core reducer path with a clear rationale and updates the corresponding test to match new correct behavior, a small precise correctness/clarity fix. A is a larger dev-tooling refactor that improves local iteration but also removes room title/breadcrumb UI text seemingly unrelated to the stated purpose, making it more diffuse and less clearly net-positive.
A turns the walkthrough fixture into a lasting dev loop (cargo-watch reload, persistent fixture-data/, preferred port 8080, reuse/rebase of seeded summary) plus a small room-page cleanup—substantive ongoing DX. B only deletes a dead zero-ratio early-return and retunes one test; useful hygiene, but far less project impact than the fixture redesign.
Side A substantially improves the developer workflow by replacing a rebuild-based fixture runner with a persistent cargo-watch setup, reusing seeded fixture data across runs, preferring a stable port with fallback, and adding supporting utilities such as port selection and summary rebasing. Side B only removes a redundant zero-ratio guard in the reducer and updates a test to reflect existing validation and edge-skipping behavior, which is a small cleanup with limited lasting impact.
comparison · c_b7cc67300477 (tommy-mor) vs c_cf0a514b261a (tommy-mor)
B removes genuinely dead/redundant code and correctly updates the test to reflect actual reducer behavior, providing a small but real simplification and behavioral clarification. A merely adds a randomized (non-seeded) test that risks flakiness and mainly demonstrates existing functionality rather than fixing or clarifying behavior.
A adds a non-trivial property test that the core rank-centrality path recovers true order from a minimal spanning-tree of perfect-ratio votes, locking in lasting algorithmic behavior. B only deletes a dead zero-ratio early-return and retunes an existing test to the already-enforced contract, which is useful hygiene but much smaller enduring impact.
comparison · c_cf0a514b261a (tommy-mor) vs c_b3cb2762569d (tommy-mor)
B ports the full Reddit graph parser into the live server (parser.rs, parser_action, parser_render), wires ParseQuery through the UI/API/JS with live morphing, tab-completion, and integration tests—adding lasting product capability. A only deletes a few lines of already-dead zero-ratio guard code and tweaks one test assertion.