comparison · c_c25451965a7f (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side A is a solid, focused fix that centralizes hostname/base-URL logic into one util function, removing duplicated hardcoded strings across multiple files—clear, low-risk improvement. Side B is a larger, more substantive change that removes an entire unused ThreadVisibility concept from events, reducer, timeline, RPC, CLI, and tests, simplifies rooms from a HashMap to a HashSet, adds a new CLI `room create` command with documentation, and updates integration tests—representing more real design simplification and feature completion across the stack, despite being messier and touching more files/tests.
Side B adds the missing CLI `room create` path and lasting domain simplification (drop ThreadVisibility/RoomState, rooms as HashSet, cleaner RoomCreated events and RPC), with matching docs/tests; Side A is a useful but narrower consolidation of hardcoded OAuth/redirect base URLs plus a staging deploy branch flip.
Side A fixes a real deployment and correctness issue by centralizing base URL generation in `app.util/get-base-url`, replacing scattered hardcoded host/environment logic across multiple OAuth/login callback paths, using `window.location.origin` on the frontend, and updating the deployment workflow to deploy from `staging`. Side B adds a useful `room create` CLI command and simplifies room handling by removing unused visibility state, but much of the patch is API/docs plumbing and feature exposure rather than fixing cross-environment correctness problems.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_bc82aea84e84 (tommy-mor)
Side A implements a real feature end-to-end (CLI `room create` command, RPC handler, event schema simplification from HashMap to HashSet, docs, and tests updated across multiple files), delivering working, tested functionality. Side B merely deletes two stale planning markdown files with no code changes, which is housekeeping value at best and contributes no functional improvement to the project.
Commit A ships the room-create CLI path plus a real design simplification (drop ThreadVisibility/RoomState, rooms as HashSet of private shortid/slug, RPC/tests/docs updated), which is lasting product surface. Commit B only deletes completed plan.md/plan2.md with no code or behavioral change.
Side A adds a real end-user capability by implementing the `room create` CLI command, wiring it through RPC, creating room events and grants on the server, updating reducer data structures, and adding tests and documentation. Side B only deletes planning documents (`plan.md` and `plan2.md`), which removes design notes but does not improve or extend the project's runtime behavior.
comparison · c_f6d0fed9bf9a (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
B is a coherent, compiling change that simplifies the room model (drops the unused/confusing ThreadVisibility field), threads that change consistently through events, reducer, RPC, CLI (adds `room create`), docs, and tests. A is a chaotic dump of speculative/idea files placed at repo root (not in server/src), several of which literally contain pasted shell prompts and `cat` commands baked into the file content, indicating they are not real, integrated source files but seed notes/junk with no demonstrated build integration.
Side B ships a real, integrated feature path: CLI `room create`, a cleaner private-room model (drop ThreadVisibility/RoomState, rooms as HashSet), matching RPC/reducer/timeline/test/doc updates. Side A is mostly an exploratory dump (notes .tdsl files, TEST scripts, a large Reddit parser prototype) with lasting code quality undercut by corrupted patches (forms.rs/ranking.rs are shell `cat` paste, not clean sources).
Side A introduces substantial new project functionality across multiple areas: a ranking engine with connected-component and rank-centrality logic plus tests, a reducer for event-driven state, UI action parsing with JSON form templates, browser plumbing, and a large parser/autocomplete system. Side B is a focused refinement that adds a CLI `room create` command and simplifies room handling by removing the room visibility concept (replacing a room map with a `HashSet` and updating RPC/tests/docs), which is useful but comparatively incremental.
comparison · c_b8e80699547c (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B is an integrated, real feature: it adds a CLI 'room create' command, wires it through RPC/server/reducer, simplifies the room model (removing unused ThreadVisibility complexity), and updates tests/docs consistently across the codebase. Side A is a standalone, seemingly unused reddit.rs API client with no evidence of integration into the rest of the project, making its lasting value speculative at best.
B delivers an integrated, user-facing feature (CLI `room create` + RPC path) plus a lasting domain simplification (drop ThreadVisibility/RoomState, rooms as HashSet of private shortid/slug ids only, with matching test/doc updates). A adds a large standalone Reddit client module that is well-structured but unwired and orthogonal to the core room/forum model shown in the rest of the tree.
Side A adds an entire Reddit API client with built-in rate limiting, structured request/error handling, comprehensive serde models for Reddit posts/comments, and helper methods for extracting typed data, providing substantial new functionality. Side B mainly exposes an existing room-creation RPC through the CLI, updates documentation, and simplifies the server by removing the unused room visibility field and changing room storage from a map to a set; these are useful refinements but much smaller in lasting functional impact.
comparison · c_28dfd8015c8a (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B implements a real end-to-end feature (CLI 'room create' command, RPC handler, event/reducer simplification removing unused visibility field, plus updated tests/docs) that adds functional capability and simplifies the room model. Side A is a useful but small config change (kaocha test discovery), which is convenient but far lower in scope, complexity, and lasting design impact compared to B's cross-cutting feature and cleanup work.
B delivers a real product path (CLI `room create`), simplifies the domain by dropping ThreadVisibility/RoomState and making rooms a HashSet, and wires that through RPC, reducer, events, tests, and docs. A only rewrites tests.edn ns-patterns so suites auto-discover—useful maintenance, but far less lasting product and design impact.
Side B adds a substantive end-to-end feature by introducing a `room create` CLI command, wiring it through the RPC path, updating the server to handle the simplified `RoomCreate { slug }` API, and adjusting tests and documentation accordingly. Side A improves test infrastructure by replacing manually enumerated Kaocha test suites with automatic `^test\..+` discovery, which reduces maintenance, but its impact is narrower than the new user-facing capability and associated API simplification in Side B.
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_6a02ffb06a41 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B removes real dead/unused complexity (unused ThreadVisibility enum, unused public-room-creation path, simplifies rooms from HashMap to HashSet) and adds a genuinely useful CLI 'room create' command with docs and updated tests across multiple test suites, representing broader functional value. Side A is a smaller, more surgical fix (replacing a silent unwrap_or(0) fallback with an explicit expect and fixing an off-by-one index semantic), which is correct but narrower in scope than B's combination of dead-code removal and new CLI functionality.
B adds a real CLI `room create` path and lasting domain simplification (drop ThreadVisibility/RoomState, rooms as HashSet, simpler RoomCreate RPC) wired through server, types, tests, and docs. A only tightens rank-history indexing (1-based/optional → 0-based/expect, UI always links, tests), a correct but narrower consistency fix.
Side B adds a substantial new CLI capability for creating private rooms (`room create`), wires it through command parsing and RPC, simplifies the room model by removing unused visibility state (replacing a `HashMap` of room metadata with a `HashSet` of room IDs), and updates tests and documentation accordingly. Side A mainly corrects the thread post index semantics by enforcing the invariant with `expect`, always rendering the post link, updating documentation, and adding tests, which is a useful but narrower consistency fix.
comparison · c_4ed2e2cca39b (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B implements a substantial, coherent feature (CLI 'room create' path end-to-end: new CLI subcommand, server RPC simplification removing unused visibility concept, reducer/type/test updates, and docs) spanning many files with real design cleanup. Side A is a trivial one-line env var addition to fix a NameError, useful but minor in scope and impact compared to B's broader, functioning feature work.
B implements the full room-create CLI path, simplifies the core data model (drops ThreadVisibility/RoomState, rooms become a HashSet), and updates RPC/events/reducer/tests/docs accordingly—lasting product and design work. A only adds a missing GITHUB_API_BASE_URL default env var, a one-liner NameError fix with far less scope.
Side B adds a substantial new end-user capability by introducing a `room create` CLI command, wiring it through the RPC path, updating documentation, and simplifying the room model by removing the unused visibility field and related state. Side A is a targeted configuration fix that defines `GITHUB_API_BASE_URL` with a default to prevent a `NameError` in the OAuth callback, which is valuable but much narrower in long-term impact.
comparison · c_3ff71f7eaeda (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B removes dead/unused complexity (the never-really-used ThreadVisibility::Public branch, simplifying RoomState to a HashSet), adds a genuinely new CLI capability (`room create`) with corresponding RPC/reducer/timeline updates and test/doc updates across the stack. Side A is mostly UI polish (vote counts, HUD unpin button, CSS) plus doc tweaks—useful but narrower in scope and lasting impact than B's structural simplification and new feature wiring.
B adds a real CLI path (`room create`) wired to RPC and, more importantly, simplifies the lasting domain model by dropping `ThreadVisibility`/`RoomState` and making `rooms` a `HashSet` of private ids—core events, reducer, types, and tests all align. A is solid UX polish (vote-count badges, HUD unpin form, CSS, browser coverage) but does not change architecture or unlock a primary workflow the way B does.
Side B introduces a first-class `room create` CLI command wired through the RPC layer, updates the shared `RpcCommand` schema, simplifies room state by removing the unused visibility concept, and adjusts reducer, server, and tests accordingly. Side A improves the garden UI by showing pairwise vote counts and making the pin HUD unpin directly via `POST /ui`, but these are primarily interface enhancements compared with B's enduring API and data-model cleanup.
comparison · c_f515f8a12d7a (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B adds a real end-to-end feature (CLI `room create` command, RPC simplification removing an unused/confusing visibility field, updated docs, tests, and cross-module consistency changes to reducer/events/timeline), representing more substantial and broader-reaching work. Side A is a smaller, focused UI cleanup that removes a redundant toolbar/action, which is valuable but narrower in scope and impact than B's feature completion plus data-model simplification.
B lands the real room-create path (CLI command + RPC) and a lasting domain cleanup: drop ThreadVisibility/RoomState, store rooms as a HashSet, and tighten create/events/reducer/tests. A only unifies home SSR compose and deletes ExpandNewThreadForm—useful UX consistency, but far smaller architectural impact.
Side B adds a substantive end-user capability by introducing a CLI `room create` command wired through the existing RPC, updates documentation, and simplifies the room model by removing the unused visibility field and replacing the room registry with a `HashSet` of room IDs. Side A is a focused UI cleanup that server-renders the collapsed new-thread slot on the home page and removes the now-redundant `ExpandNewThreadForm` action, but its impact is primarily eliminating duplicate UI flow rather than adding or restructuring core functionality.
comparison · c_bc8c17a00ed7 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B implements a full, working feature end-to-end (CLI `room create` command, RPC handler simplification, event/type cleanup removing unused ThreadVisibility, updated docs and integration/bb tests), representing broader lasting functional and architectural value. Side A is a small, well-tested but narrow bugfix (skip pinned Reddit posts) that is correct and useful but much more limited in scope compared to B's feature-plus-cleanup work.
B adds the end-to-end `room create` CLI/RPC path and simplifies the domain (drops `ThreadVisibility`/`RoomState`, rooms become a `HashSet` of private ids) with matching tests and docs—core product surface. A only skips stickied/pinned Reddit children in `parse_children` plus one unit test, a correct but narrow import filter.
Side B adds a complete user-facing room creation path to the CLI, wires it through the RPC layer, updates the protocol by removing the unused visibility parameter, simplifies room storage from a HashMap to a HashSet where only existence is needed, and updates tests and documentation accordingly. Side A is a solid targeted bug fix that skips stickied/pinned Reddit posts during import and adds a regression test, but its impact is narrower than the end-to-end feature and API simplification in Side B.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_cd965c070df3 (tommy-mor)
Side B fixes a real bug (imported Reddit children were mis-wired via ensure_path, and unranked child labels showed raw slugs instead of titles), with a targeted reducer API change and updated integration tests covering the fix. Side A is a reasonable feature addition (room create CLI + simplifying visibility away) but is more speculative scaffolding/simplification with less evidence of fixing a concrete defect, and removes visibility handling that may reduce flexibility without clear justification.
A lands an end-to-end room-create path (CLI + RPC) and a lasting domain cleanup: drops ThreadVisibility/RoomState, makes rooms a HashSet of private ids, and tightens create/audit call sites across server, types, and tests. B is a real but narrower fix—Reddit children attach via apply_entity_under_parent without ensure_path side effects, and unranked rows use stored titles—plus test wiring, so less structural impact than A’s model and feature surface.
Side A adds an end-to-end `room create` CLI command that authenticates, invokes the `RoomCreate` RPC, prints the new room ID, updates documentation, and simplifies the underlying data model by removing the unused room visibility field and replacing the room registry with a `HashSet` of room IDs. Side B fixes Reddit child import behavior by attaching imported posts directly under the fetched parent and displaying imported titles in the unranked list, with improved integration tests, but its scope is a targeted correctness fix rather than a broader capability addition.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_c42f908efc44 (tommy-mor)
Side A implements an actual end-to-end feature (room create CLI subcommand, RPC, docs, tests) and simplifies the data model by removing an unused/redundant visibility concept, which is a real, shippable improvement. Side B is a broad but mechanical refactor (String -> CanonicalItemUrl newtype, Deref impls) that touches many call sites without adding new capability or fixing a concrete bug, offering type-safety benefits but less direct user-facing value.
A lands a real product path (CLI `room create` + docs) and a lasting domain simplification—dropping ThreadVisibility/RoomState so rooms are a HashSet of private ids and RoomCreate no longer takes visibility—plus matching RPC/reducer/test updates. B is a worthwhile but narrower type-hygiene refactor (Deref on URL newtypes, CanonicalItemUrl through resolve_item/pair/validate) that mainly removes intermediate String maps without changing user-facing behavior.
Side A adds a user-facing `room create` CLI command end-to-end, wiring it through the RPC, bearer authentication, documentation, and tests, while also simplifying the room model by removing the unused visibility field and replacing the room registry with a `HashSet` of room IDs. Side B is a solid internal refactor that strengthens type usage by returning `CanonicalItemUrl` from `resolve_item` and propagating typed URLs throughout ranking and validation code, but it is primarily a maintainability improvement rather than introducing new project capability.
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_978e283f2229 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B adds real functional CLI/server capability (room create command, RPC wiring, simplifying rooms from a HashMap to a HashSet since visibility was unused/dead code) plus corresponding test updates across multiple test suites, representing genuine feature work and code simplification. Side A is primarily a CLI subcommand restructuring (forum -> forum list/show/post) and doc/help text rewording, which is useful but is mostly renaming/reshaping existing functionality rather than adding new capability or fixing a bug.
A restructures the primary write/read CLI (ingest → `forum post` with required tag/delegate, forum into list/show/post) and aligns docs, integration tests, and server next-move strings to that model—lasting interface design for the main agent path. B is valuable but narrower: a `room create` CLI path plus simplifying rooms to a HashSet by dropping ThreadVisibility/RoomState, which cleans the model without reshaping day-to-day participation.
Side A implements a substantive CLI redesign by splitting forum operations into explicit `forum list/show/post` subcommands, making `--delegate` mandatory for CLI posting, updating RPC interactions, tests, and extensive documentation to match the new command structure. Side B adds a useful `room create` command and simplifies room handling by removing unused visibility state, but its functional scope is narrower and much of the patch is cleanup and API simplification rather than a broad user-facing workflow improvement.
comparison · c_4a5c84c0a37b (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B adds a full CLI room-creation path (new CLI subcommand, RPC wiring, docs) plus a real simplification removing the unused ThreadVisibility concept and switching rooms from HashMap to HashSet, touching many files consistently. Side A is a smaller, focused fix (display_path in hrefs) with a much improved test, which is valuable but narrower in scope than B's cross-cutting feature+cleanup.
B adds a real user-facing CLI path (`room create`) and permanently simplifies the domain by dropping `ThreadVisibility`/`RoomState` so rooms are a `HashSet` of private ids, with matching RPC/reducer/docs/tests. A’s lasting substance is smaller: encode `display_path` in vote hrefs plus a stronger 45-pair ranking browser assertion, valuable but incremental versus B’s feature + model cleanup.
Side A fixes user-facing URL generation by using `display_path()` for vote and pool links instead of stored canonical URLs, keeping hrefs consistent with the UI and DSL, and strengthens coverage with an end-to-end test that exercises all 45 pairwise votes and verifies the final garden ranking through `GetGardenRank`. Side B adds a useful `room create` CLI command and simplifies room state by removing unused visibility, but much of the patch is API cleanup, documentation updates, and plumbing rather than a targeted correctness improvement backed by stronger behavioral testing.
comparison · c_11d6a0ec9839 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B adds a real CLI feature (room create) plus a genuine simplification—removing an unused visibility concept that only ever had one meaningful value ('private'), simplifying the reducer's HashMap<String,RoomState> to a HashSet<String> and cleaning up events/timeline/tests consistently across the codebase. Side A is a smaller, more surface-level fix (route rename, small bug fixes, removing a button) that is useful but narrower in scope and impact than B's cross-cutting simplification plus new CLI capability.
B delivers a real product path (CLI `room create`) and a lasting domain cleanup: drops unused `ThreadVisibility`/`RoomState`, simplifies `rooms` to a `HashSet`, and aligns RPC/events/reducer/tests around private-only rooms. A’s delegate out-of-band fix and “no sibling pool fallback” are genuine correctness/UX fixes, but the route rename and swap-button removal are thinner polish with less structural impact.
Side B adds a substantive new CLI capability (`room create`) end-to-end, wiring a new command through the client, RPC, server, and documentation so users can create private rooms directly. It also simplifies the room model by removing the unused visibility concept and replacing the room registry with a `HashSet` of room IDs, whereas Side A mixes one important bugfix (passing the delegate out-of-band and avoiding an incorrect fallback when too few sibling items exist) with mostly UX cleanup and route renaming.
comparison · c_597d3f736194 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B is a substantive feature: it wires up a full room-create path from CLI through RPC to reducer/events, simplifying a dead/unused visibility concept, updating tests, and adding docs/help text—net simplification plus new user-facing capability. Side A is a valuable but narrower bugfix restoring test infra (HTTP server byte handling, regex split, error trapping) that only affects test reliability, not production code or features.
B adds a real CLI `room create` path and simplifies the core domain by dropping ThreadVisibility/RoomState in favor of a private-room HashSet, with matching RPC, reducer, docs, and tests—lasting product and model value. A only repairs test doubles (request body vs input stream, query split regex, nil token/state, handler try/catch) and Playwright helpers so E2E auth runs again, which is necessary but test-only.
Side A fixes concrete failures in the OAuth test infrastructure by correcting query parsing (`str/split` with regex), reading POST bodies from `getRequestBody`, guarding null bearer tokens and state values, wrapping mock handlers in error handling, and updating the Playwright helpers to use real selectors instead of brittle timing. These changes directly restore broken end-to-end authentication flows, whereas Side B mainly adds a CLI path for room creation and simplifies room metadata by removing unused visibility handling, which is useful but less critical and less of a correctness fix.
comparison · c_7ec4b410de02 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B removes dead/unused complexity (ThreadVisibility, unused RoomState field, HashMap→HashSet simplification) and adds a genuinely useful CLI command (`room create`) with docs and tests updated across multiple layers (rpc.rs, events.rs, reducer.rs, timeline.rs, CLI, integration tests, bb tests). Side A is a smaller, focused UI feature (clickable pin/unpin) with decent browser test coverage but touches fewer architectural layers and has more narrowly scoped value.
B adds a real CLI `room create` path and simplifies the domain by dropping ThreadVisibility/RoomState so rooms are a HashSet of private ids, touching RPC, events, reducer, types, docs, and tests—structural product surface. A only wires an existing set_garden_pin clear into ranked child pin glyphs plus CSS/test updates, a useful but localized UX polish.
Side B adds a new top-level CLI `room create` command wired through to the RPC, updates the server to support the simplified `RoomCreate` flow, removes the unused room visibility concept from events/reducer state, and updates documentation and tests accordingly. Side A is a solid UX improvement that makes ranked child pin icons submit the existing `set_garden_pin` unpin action and adds browser coverage, but it is a narrower interface enhancement compared with B's broader, lasting API and architecture simplification.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
B implements a substantive DSL redesign (block-first explanations/bodies) with real parser logic changes, new error messages, added tests for rejecting legacy syntax, and updates across many fixtures/tests to keep the suite consistent — a meaningful, load-bearing feature change. A is a smaller, well-scoped feature (room create CLI command) but also simplifies RoomState to a HashSet, losing per-room visibility tracking, which is a minor regression in extensibility; overall A's scope is narrower and lower-risk but B's work has broader lasting impact on the core DSL contract.
B redesigns the core sorter DSL so votes are explanation-first (leading `{...}` then the comparison), with a real parser split/pending-block path and full fixture/docs/UI updates—this permanently changes how every vote is authored. A is solid but narrower: it wires `room create` in the CLI and simplifies rooms by dropping ThreadVisibility/`RoomState` for a `HashSet`, which is useful product plumbing rather than a foundational interaction change.
Side A adds a substantive new user-facing capability by introducing the `room create` CLI command end-to-end, wiring it to the `RoomCreate` RPC, handling authentication, JSON/text output, and updating documentation. It also simplifies the room model by removing the unused room visibility field and replacing the room registry with a `HashSet`, reducing unnecessary complexity, whereas Side B primarily changes the DSL syntax to require explanation blocks before votes and updates the parser, UI, fixtures, and tests to match that new format without adding comparable new functionality.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A implements a real new feature end-to-end (room creation RPC, CLI command, docs, tests) and simplifies the data model by removing dead ThreadVisibility complexity, yielding a cleaner and more capable system. Side B is a smaller, more cosmetic UX polish (auth form morphing instead of redirect) that is useful but narrower in scope and lasting impact compared to A's structural feature addition and simplification.
Side A adds the end-to-end `room create` CLI path and simplifies the core domain (drop ThreadVisibility/RoomState, rooms as HashSet, RPC/tests/docs aligned), which is lasting product and model work. Side B only improves auth choose-username UX via fragment morph instead of redirects—valuable polish, but narrower and UI-local versus A’s feature plus structural cleanup.
Side A adds a complete `room create` CLI command wired through the RPC path, updates the server to handle the simplified `RoomCreate { slug }` request, removes an unused visibility concept, converts room tracking to a simpler `HashSet`, and updates tests and documentation accordingly. Side B improves the authentication UX by returning HTML fragments and teaching the shared JS form handler to morph a form's `innerHTML` instead of redirecting, but its impact is primarily on user interaction rather than introducing a durable project capability.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_410d9361a866 (tommy-mor)
B adds a self-contained, tested feature (Reddit post thumbnails/full-image rendering with a new render module and fixture-based unit test) that improves real user-facing functionality without breaking existing APIs. A also adds a real feature (room create CLI) but simultaneously removes room visibility support (public/private distinction) from the data model and wire protocol, which is a functional regression/simplification with unclear justification, despite reasonable cleanup of rooms as a HashSet.
A lands a lasting core design: simplifies rooms to a HashSet of private ids, drops ThreadVisibility from events/reducer/RPC, and adds the real CLI `room create` path with docs and tests. B only extends Reddit entity parsing/UI (thumbs, image_url/link_url, render helpers, CSS)—useful polish for one import source, but not architectural.
Side A adds a new end-to-end `room create` CLI command wired through the RPC, including authentication handling, output, documentation, and tests, while also simplifying the data model by removing the unused room visibility field and replacing the room registry with a simpler `HashSet`. Side B improves Reddit presentation with thumbnails, full-image rendering, outbound links, CSS, and parsing/tests, but those are primarily UI enhancements rather than foundational project functionality.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_8c6a5e2e4a54 (tommy-mor)
Side A is a focused, coherent change: it adds a working `room create` CLI command wired to a simplified server-side RoomCreate RPC, removes now-unneeded ThreadVisibility plumbing, and updates docs/tests consistently across cli/server/types. Side B is much larger but noisier and riskier — it introduces cookie-based auth, new routes, and a substantial UI refactor while also committing an unrelated, out-of-place 'plan2.md' AI-chat transcript file that adds no real value and pollutes the repo.
B delivers lasting end-to-end product value by adding cookie sessions, web login/logout, /r/* room pages, thread listing/pagination under private scopes, and POST /post compose forms that rewrite the forum HTML layer for multi-room use. A is valuable but narrower: it mainly adds the CLI `room create` path and simplifies the model (drop ThreadVisibility, rooms HashMap→HashSet) plus test/docs updates, which is solid prep work rather than the broader usable feature surface in B.
Side B restores substantial end-user functionality by wiring browser authentication with session cookies, adding web posting, routing, and private-room UI with capability checks, enabling a complete web workflow instead of only CLI access. Side A adds a useful `room create` CLI command and simplifies the room model by removing unused visibility state, but much of the patch is API cleanup and documentation around a narrower feature.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_57453fc5c6c0 (tommy-mor)
Side A completes an actually missing capability (CLI `room create` calling RPC) end-to-end across CLI, RPC, reducer, and docs, and simultaneously simplifies the room model by removing the unused ThreadVisibility distinction (rooms→HashSet), reducing complexity and bug surface. Side B adds a well-tested but narrower UX convenience (clipboard copy of garden rankings) that, while polished with unit/integration/browser tests, is additive feature surface rather than closing a functional gap or simplifying existing design.
A lands the real room-create product path (CLI `room create` → RPC) and a lasting domain simplification: drop `ThreadVisibility`/`RoomState`, make `rooms` a `HashSet`, and treat public as the shared site only. B is a solid but peripheral QoL feature—clipboard markdown for garden rankings via a new `CopyGardenRank` UI action—useful polish that reuses existing copy patterns rather than core capability.
Side A adds a substantive new capability by introducing a first-class `room create` CLI command, wiring it through RPC, enforcing bearer authentication, updating documentation, and simplifying the underlying room model by removing the unused visibility concept (`ThreadVisibility`, room state, and RPC parameter) in favor of a simpler room registry. Side B delivers a polished UI feature—a garden ranking copy button with markdown generation, POST `/ui` handling, and browser/tests—but it is primarily a convenience feature rather than a foundational project capability.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_c124c217f89c (tommy-mor)
Side B replaces a no-op stub with a real, tested Reddit fetch worker including OAuth token handling, rate-limit/backoff logic, JSON parsing for subreddits and posts, and wiring into the item-fetch path plus unit tests for URL mapping and parsing. Side A mainly wires a new CLI room-create subcommand end-to-end and removes an unused room 'visibility' concept, which is useful cleanup and plumbing but smaller in scope and impact than the working external-integration feature added in B.
Commit A lands the end-to-end private room create path (CLI RoomCmd + RPC usage) and a lasting domain cleanup (drop ThreadVisibility, rooms as HashSet) with docs and tests aligned. Commit B is a large, well-structured Reddit fetch worker, but it is a peripheral import path still marked incomplete (rendering etc. in todo), so it adds less durable product core than A.
Side A delivers a complete user-facing capability by adding a `room create` CLI command wired through the existing RPC, improving documentation, and simplifying the room model by removing the unused visibility field and replacing the room registry with a `HashSet` of room IDs. Side B introduces substantial Reddit import infrastructure (background worker, OAuth, rate limiting, parsing, and fetch triggers), but it is a larger, partially integrated feature with placeholder/TODO elements and more implementation complexity, whereas Side A provides a cohesive, immediately usable feature and durable model cleanup.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_14dd365ffe22 (tommy-mor)
B introduces a real URL-structure improvement (path-based /~/ browse routes replacing query params) with new parsing logic, tests, and removes dead theme-switching machinery, simplifying the codebase while adding genuine functionality. A is a solid but narrower feature (room create RPC simplification, removing unused visibility field) that mostly strips an unused option rather than adding new capability, making B's net contribution slightly larger in lasting design value.
A ships the end-to-end room-create path (CLI command, RPC, docs) and a lasting domain simplify—dropping ThreadVisibility/RoomState so rooms are a HashSet of private ids—with matching tests. B’s useful browse `/~/` URL helpers are real, but much of the patch is theme/cookie/CSS deletion and routing cleanup, which is less core product value.
Side A adds a substantive new capability by exposing private room creation through the CLI, wiring a new `room create` command to the existing RPC, improving user guidance, and simplifying the server model by removing the unused room visibility field and replacing the room registry with a `HashSet`. Side B mainly removes theme support and switches browsing to cleaner `/~/...` URLs with related routing and helper refactors, which is useful but largely a UI/navigation cleanup compared with the new end-to-end functionality delivered in Side A.
comparison · c_8dc1a8119370 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side A removes a large, fragile, over-engineered keystroke-parsing graph (1800+ lines) and replaces it with a small, correct paste-and-go implementation plus matching tests/UI simplification, net reducing complexity while preserving functionality. Side B is a reasonable simplification (removing unused room visibility) and adds a room-create CLI path, but it's smaller in scope and mostly plumbing/cleanup rather than a substantive architectural fix.
A replaces an unreliable ~1.8k-line keystroke graph (parser_action, race mitigation, Playwright test) with a small paste-and-go Result-based URL parser and redirect, lasting design simplification. B mainly wires an existing RoomCreate RPC to the CLI and drops visibility/HashMap rooms to a HashSet—useful product plumbing, but narrower and more incremental than A’s rewrite.
Side B adds a durable new capability by exposing `room create` as a first-class CLI command, wiring it through the RPC path, updating documentation, and simplifying the room model by removing the unused visibility field and replacing the room registry with a `HashSet` of room IDs. Side A substantially simplifies the Reddit navigation flow by replacing a complex autocomplete graph with a paste-and-go URL parser and redirect, but it also removes a large amount of interactive parsing functionality in favor of a narrower workflow.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_477013996fa5 (tommy-mor)
Side B fixes a real bug (vote-compare preview morph was previously not actually populating #vote-compare-preview with the new post card, now wired via ingest_entry_markup) plus adds a genuinely useful UX improvement (sorted edge history, fullscreen layout) with accompanying test coverage and CSS across themes. Side A is a solid but smaller feature (room create) that mostly strips an unused visibility field and simplifies a HashMap to a HashSet, which is reasonable cleanup but lower-impact than B's bugfix plus feature work with tests.
A adds the CLI `room create` path and simplifies the domain model (drop ThreadVisibility/RoomState, rooms as a HashSet, wire/RPC/tests aligned), which is lasting product and design work. B improves one UI surface (chromeless fullscreen compare, edge-history sort/orientation, preview morph, CSS) with real but narrower UX value.
Side A adds a new end-user capability by implementing the `room create` CLI command end-to-end, wiring it to the existing RPC, handling authentication, JSON/text output, updating documentation, and simplifying the data model by removing the unused room visibility field and replacing the room registry with a `HashSet` of room IDs. Side B improves the vote-compare experience with a fullscreen layout, live preview morphing, and clearer edge-history ordering, but these are primarily UI refinements rather than a foundational project capability.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_509fc5155034 (tommy-mor)
B introduces a real architectural feature (a hierarchical ItemId/GlobalTree fractal-scope system replacing flat scope strings, with breadcrumbs, entity panels, and journal worker rename) backed by substantial new tests, whereas A mostly removes an unused visibility field from room creation (a minor simplification/cleanup) plus doc/CLI wiring for an existing feature. B's diff, while larger, represents genuine feature depth (URL canonicalization, tree traversal, UI rendering) rather than churn, though it also carries more risk/complexity that could be seen as scope creep in a single commit named vaguely 'reconfigure'.
B rebuilds the core data model from flat string scopes into a hierarchical ItemId/GlobalTree (path canonicalization, parent links, breadcrumbs, journaled votes on parent nodes), which is lasting architecture. A adds a real room-create CLI path and a useful simplification (drop ThreadVisibility; rooms as a HashSet), but it is incremental product surface on an existing private-room design rather than a foundational redesign.
Side B introduces a substantial architectural shift from flat per-scope rankings to a hierarchical `GlobalTree` of `ItemId` nodes, adding canonical URL parsing, breadcrumb navigation, node persistence (`NodeEnsured`), and a new journal worker while updating the UI and state management to use the new model. Side A adds a useful `room create` CLI command and simplifies room handling by removing unused visibility state, but it is a narrower feature and cleanup compared with B's broader, lasting redesign of core data structures and navigation.
comparison · c_06fce70179bc (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
A delivers a real feature (SSE-based entity fetch with proper job completion signaling via oneshot channels, richer tracing, and updated JS/CLI/integration tests), fixing a previously fire-and-forget fetch flow. B is a decent simplification (removing unused ThreadVisibility/RoomState complexity and adding a CLI room-create command) but is smaller in scope and mostly removes dead abstraction rather than adding new durable capability, plus it touches CLI/docs/tests for a fairly narrow feature.
Commit A delivers a real end-to-end capability: entity fetch becomes an SSE stream with fetching/complete/error events, oneshot FetchJobResult completion from the Reddit worker, a dedicated fetch module, and matching JS/client plus integration-test updates. Commit B is valuable lasting design (drop room visibility, rooms as a HashSet, wire CLI `room create` and docs), but it mostly simplifies an existing RoomCreate path rather than adding comparable multi-layer product behavior.
Side A introduces a substantive new asynchronous fetch flow: it adds an SSE-based entity import pipeline, streams fetch progress and completion to the UI, wires Reddit fetch completion through oneshot notifications, and updates the browser client to consume event streams instead of only JavaScript responses. Side B mainly exposes an existing room-creation capability through the CLI while simplifying the data model by removing room visibility, but most changes are API cleanup, documentation, and plumbing rather than adding comparable runtime functionality.
comparison · c_1c1c8e7a2de8 (tommy-mor) vs c_9608dc0d38ab (tommy-mor)
Side A implements a full, working feature: a new CLI `room create` subcommand wired to the server RPC, removes the unused/never-differentiated ThreadVisibility concept (simplifying RoomCreated events and the reducer's `rooms` map from HashMap to HashSet), and updates docs/tests consistently across cli, server, types, and test suites. Side B is mostly internal refactoring (splitting RwLock read guards to avoid deadlock, timeout additions, username normalization test fixes) which is useful defensive cleanup but adds no new user-facing capability and is narrower in scope/impact.
A lands the end-to-end room-create path (CLI `Room`/`room create`, RPC/types simplification, guide updates) and a lasting domain cleanup: drop `ThreadVisibility`/`RoomState`, store rooms as a `HashSet`, and treat private rooms as the only created scope. B’s scoped RwLock fix and test/harness hardening are real correctness wins, but narrower than A’s feature plus model simplification.
Side A delivers a substantive feature by adding a `room create` CLI command end-to-end, wiring it through RPC, documenting its use, and simplifying the server model by removing the unused room visibility concept and replacing the room registry with a `HashSet` of room IDs. Side B mainly fixes lock-scoping around `RwLock` reads to avoid potential deadlocks, adds one integration test, and improves test harness timeouts/logging, which are valuable but narrower in long-term impact than the new user-facing capability and associated design cleanup in Side A.
comparison · c_0c466eea1ed4 (tommy-mor) vs c_1c1c8e7a2de8 (tommy-mor)
Side B is a real, integrated change: it adds a working CLI `room create` command, simplifies the reducer's room model (removing dead ThreadVisibility complexity), updates RPC, events, docs, and multiple test suites consistently across the codebase. Side A adds a useful but purely additive dev-only tool (sorterc) that doesn't touch or improve existing production code paths, making its value more isolated and lower-stakes compared to B's cross-cutting simplification and feature completion.
B delivers lasting product and design value: a real CLI `room create` path plus simplifying the core model (drop ThreadVisibility/RoomState, rooms as HashSet, leaner RoomCreated/RPC), wired through server, types, tests, and GUIDE. A is solid offline tooling (offline.rs, sorterc binary, docs/tests) but is workspace-only developer ergonomics on existing compile/scan logic, not a core runtime feature.
Side A adds a substantial new offline development capability: a workspace tool (`sorterc`) with compile and JSONL scan commands, reusable server-side offline APIs (`offline.rs`), tests, and documentation, enabling validation, replay, and diagnostics without a running server. Side B usefully exposes room creation in the CLI and simplifies the room model by removing unused visibility state, but much of the patch is API cleanup and documentation updates rather than adding comparable long-term functionality.