comparison · c_64faa3bee86f (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side B implements a substantive, cross-cutting DSL syntax change (block-first vote explanations) with corresponding parser logic, error-message updates, and comprehensive test/fixture/documentation updates across Rust, Clojure browser tests, and docs, reflecting real design work with backward-incompatibility handled deliberately. Side A is a smaller, single-feature UX tweak (auth form morphing) that's useful but narrower in scope and impact compared to B's language-level change touching the core parsing engine.
B redesigns the project's core sorter DSL (explanation-first votes, clearer item/vote parse paths in dsl.rs) and lands it across parser, docs, UI payloads, and the full test/fixture surface—lasting product syntax. A is a real but narrower auth UX win: fragment responses + poem JS innerHTML morph and layout unification, without changing the system's primary language or data model.
Side A implements a functional UX improvement: the auth flow now returns HTML fragments instead of redirects, the shared Poem JS can morph a form with non-empty responses for inline success/error handling, and the auth templates are refactored to reuse form rendering while restoring the standard layout. Side B is a broad but largely mechanical DSL syntax migration—updating the parser, documentation, fixtures, and tests to require explanation-first vote syntax—which changes conventions more than it adds enduring capability.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_b6adf338f405 (tommy-mor)
Side A implements a substantive DSL redesign (title-first items, explanation-first votes) with real parser logic changes, updated documentation, and extensive test/fixture updates across Rust and Clojure suites, representing meaningful lasting functionality. Side B merely deletes an unused file with no functional change, which is minor housekeeping (though safe removal of dead code has some value, it is far less significant than A's feature work).
A redesigns the core sorter DSL (explanation-first votes, stricter item body placement) with real parser changes in dsl.rs plus docs/UI/fixture updates, which reshape how users write and how the system parses forever. B only deletes an unused timeline.rs module—helpful cleanup, but no lasting product or design contribution.
Side A makes a substantial functional change by redesigning the DSL syntax for items and votes, updating the parser to support block-prefixed vote explanations, enforcing the new grammar with explicit errors, adapting UI generation, and revising documentation and extensive tests/fixtures. Side B only deletes an apparently unused timeline module without introducing new behavior or demonstrating a corresponding architectural replacement, so its lasting project impact is much smaller.
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_bc8c17a00ed7 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side B implements a real DSL redesign (explanation-first vote syntax, block-prefix parsing logic) with corresponding parser changes, error handling, and updates across many test fixtures, docs, and browser tests, representing substantial lasting design work. Side A is a small, focused bugfix (skip pinned Reddit posts) with a test, which is valuable but far narrower in scope and impact than B's language-level change.
B redesigns the core sorter DSL so vote explanations lead and items stay title-then-body, with real parser/API/UI changes plus fixture updates—lasting product/language design. A is a correct, tested Reddit import filter for stickied/pinned posts, but it is a narrow integration tweak versus B’s central syntax and ingest model.
Side B implements a substantive DSL redesign by changing vote syntax to use leading explanation blocks, refactoring the parser (`parse_block_prefixed_statement` vs. item parsing), updating UI generation, documentation, fixtures, and adding parser tests for the new semantics and error cases. Side A is a valuable targeted bug fix that skips stickied/pinned Reddit posts during import with a helper and regression test, but its impact is much narrower than the cross-cutting language and parser change in Side B.
comparison · c_3f420a1f5aa1 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Commit B implements a real, cross-cutting DSL syntax change (explanation-first votes) with new parser logic, updated grammar rules, and extensive test/fixture/docs updates ensuring correctness across the codebase, representing genuine language-level design work. Commit A is a UI feature (theme cookie persistence) that's useful but more localized and lower-stakes, mostly threading a jar/uri parameter through many handler signatures rather than solving a deeper correctness problem.
B redesigns the core sorter DSL (explanation-before-verdict votes, stricter item body placement) with a real parser rewrite, rejection of legacy syntax, and coordinated updates across docs, fixtures, UI vote payloads, and tests—lasting product semantics. A mainly swaps client localStorage theme cycling for cookie/POST /theme plumbing plus room-prefixed wire URL helpers in RPC; useful UX/API correctness, but more peripheral than B’s language-level change.
Side A delivers lasting functional improvements across the application: it implements persistent server-backed theme selection (including cookie handling across authentication redirects), propagates theme state through page rendering, and fixes private-room URL generation by introducing room-aware item/thread URL helpers used throughout the RPC API with dedicated tests. Side B makes a substantial parser redesign by changing the DSL to require block-first vote explanations and updates documentation and tests accordingly, but much of the patch is migration churn for the new syntax rather than new end-user capability.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_c6f5afec1d36 (tommy-mor)
Side B adds a genuinely new, self-contained capability (pool-scoped voting) with clean, well-scoped code changes and modest test touch-ups, providing real user-facing value with low churn. Side A is a large syntax overhaul (explanation-first votes) that, while intentional, is dominated by mechanical reformatting across dozens of test fixtures and docs, making its value density lower despite the larger diff.
A rewrites the core DSL so votes are explanation-first (leading `{...}` then the comparison), with a real parser split (`parse_block_prefixed_statement` / `parse_item_definition_statement`), docs, and end-to-end fixture updates—that is lasting language surface area. B adds useful pool-scoped `/vote?pool=` navigation and a “vote on children” entry point, but it is a contained HTML/vote-flow feature on top of existing compare logic, not a foundational design change.
Side B adds a substantive new capability: pool-scoped voting, including `pool` query handling, automatic pair selection from a parent's children, preservation of pool context across vote navigation, and UI entry points ('vote on children'). Side A primarily refactors the DSL syntax by moving vote explanations before comparisons and updates the parser, documentation, fixtures, and tests to enforce that new format; while extensive, it is largely a syntax migration rather than adding new project functionality.
comparison · c_552f408ae0da (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side B implements a real DSL syntax change (explanation-first votes) with careful parser rework, backward-compat rejection logic, and updates across docs, fixtures, server tests, and browser tests, showing broad, consistent propagation of a design decision. Side A adds a useful but narrow RPC/CLI feature (RoomList) with good test coverage, but it's a smaller, more contained addition compared to B's cross-cutting language/parser change that touches core DSL semantics used throughout the system.
B redesigns the core sorter DSL so vote explanations lead and verdicts trail, with real parser/UI changes (dsl.rs, ui_html vote formatting, editor placeholder) that redefine how judgments are authored. A adds a useful RoomList RPC/CLI path with solid isolation tests, but it is incremental surface API work versus B’s lasting language-level design shift (even though much of B’s diff is fixture propagation).
Side A adds a new end-to-end capability: a RoomList RPC, CLI `room list` subcommand, shared request/response types, server implementation that filters rooms by authenticated principal's grants, and integration tests verifying per-user isolation and grant behavior. Side B primarily changes DSL syntax from trailing to leading vote explanations, updating the parser, UI generation, documentation, and many fixtures/tests to match; while substantial, it is largely a syntax migration rather than introducing comparable new functionality.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_48edc893c5b0 (tommy-mor)
A implements a coherent, well-reasoned syntax change (explanation-first votes, title-first items) with a real parser rewrite, updated error messages, and exhaustive updates across docs, fixtures, unit tests, and browser tests to keep everything consistent and correct. B adds a generic JSON-template-with-holes UI plumbing layer (form_template.rs, ui_action.rs) that is more speculative infrastructure—useful for reducing duplication but introduces indirection and an explicitly acknowledged security caveat, and its vague 'progress' commit message reflects a less finished, less validated change than A's deliberate, tested DSL redesign.
A lands a real product/language design change: votes become explanation-first and items stay path-then-body, with a genuine parser rewrite (block-prefixed votes, pending blocks, rejection of legacy trailing explanations) plus matching docs and call sites. B adds useful browser infrastructure (form_template holes, HtmlUiAction, unified POST /ui, shared web_post runners) but is more plumbing/UX wiring than a lasting core semantic shift.
Side A implements a substantive DSL redesign by changing the parser to support leading explanation blocks for votes, enforcing item-body placement, updating UI generation, validation, documentation, fixtures, and adding parser tests that reject legacy syntax and malformed inputs. Side B adds a useful browser UI dispatch layer (`POST /ui`), form-template infrastructure, and refactors shared handlers, but it is largely architectural plumbing for the web interface rather than a project-wide language and parsing change.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_45dfa34511fe (tommy-mor)
Side A is a coherent, well-tested DSL redesign (explanation-first votes) that updates the parser, docs, and every fixture/test consistently across CLI, server, and browser tests, with a clear rationale in the message. Side B bundles a questionable, unexplained room-route change that removes a path separator (arguably reducing readability, e.g. '9ab12cdmy-room') together with a genuinely useful but narrowly-scoped YouTube URL normalization feature, making its overall value more mixed and less clearly justified.
A changes the core sorter language: votes become explanation-first (`{reason}` then comparison) with a real parser split (block-prefixed votes vs path-then-body items), docs, UI payloads, and fixtures updated to match—lasting product/DSL design. B is valuable infra (collapse `/r/{short}/{slug}` to one segment via `room_route_segment`, plus YouTube/query URL normalization) but is mostly routing/identity cleanup rather than a domain-model shift.
Side B introduces reusable infrastructure by centralizing private-room route encoding/decoding (`room_route_segment`, `room_id_from_route_segment`, `ROOM_SHORT_ID_LEN`) and updating routing, URL generation, and tests to use it consistently, while also improving URL canonicalization for external identities (including YouTube normalization and query normalization). Side A makes a sweeping DSL syntax change requiring vote explanations to precede comparisons and updates the parser, UI, documentation, and many fixtures, but much of the patch is mechanical migration to a new syntax rather than adding broadly reusable functionality.
comparison · c_e57094c6229a (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side A introduces a real, self-contained feature (explicit Reddit entity import with event-sourced raw payload storage, configurable API base for testing, dotenv support, and new tests/fixtures), adding lasting architectural capability. Side B is a large but mechanical DSL syntax migration (trailing to leading explanation blocks) touching many files/tests with churn but no new functional capability, and its value is more about internal consistency than new lasting design.
A adds a durable subsystem: explicit FetchEntity UI, EntityImported event-log persistence of full payloads, tree replay via apply_entity_raw, configurable Reddit API/OAuth bases, and a mock end-to-end import test—lasting product architecture beyond dependency noise. B’s explanation-first vote grammar is a real design change in dsl.rs, but most of the patch is cascading fixture/doc/test rewrites of the same reorder, so the lasting delta is narrower than A’s feature work.
Side A adds substantial new functionality: explicit user-triggered Reddit entity fetching, persistent `EntityImported` events with replay support, storage of raw API payloads plus derived views, configurable API/OAuth endpoints, dotenv loading, and integration/UI tests. Side B primarily changes the DSL syntax from trailing to leading vote explanations, updating the parser, documentation, UI formatting, and a large number of fixtures/tests to match; while cohesive, it is largely a syntax migration rather than adding comparable long-term capability.
comparison · c_ca9169f732b8 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side A fixes a concrete production bug (silent fallback to a blocked public Reddit endpoint), adds real retry-on-401/403 logic with tests, and improves error diagnostics — a focused, verifiable improvement. Side B is a large DSL syntax reshuffle (moving explanations before votes) whose diff is dominated by mechanical test/fixture rewrites across many files, which is churn-heavy relative to the core logic change in dsl.rs and lacks the same clear bugfix payoff for users in production today.
B redesigns the project’s core user-facing DSL (explanation-first votes, stricter block placement) with real parser/API/UI changes and coordinated fixture updates, so it shapes how content is authored going forward. A is a solid, necessary Reddit OAuth reliability fix (no public API fallback when creds exist, 401/403 refresh, error truncation) plus a fly.toml pin, but it is narrower infrastructure glue rather than lasting product surface.
Side A fixes a production reliability issue by requiring OAuth when credentials are configured, preventing fallback to blocked public Reddit endpoints, adding automatic token refresh/retry on 401/403, improving error propagation, and testing truncated error handling. Side B primarily changes the DSL syntax from trailing to leading explanation blocks and updates the parser, documentation, UI, and a large number of fixtures/tests to match; while substantial, much of the patch is migration and syntax churn rather than a clear functional improvement.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_8c6a5e2e4a54 (tommy-mor)
Side A is a focused, well-tested DSL redesign (explanation-first votes) with consistent parser changes, updated tests, fixtures, and docs across CLI/server/browser tests — a coherent, lasting change to the language's syntax and semantics. Side B is a large feature addition (room UI, cookie auth, web posting) that is plausible but includes an out-of-place LLM-generated 'plan2.md' essay, no new tests, and more speculative/less validated surface area, making its lasting value harder to assess despite its size.
B restores lasting product surface area: cookie sessions, /login|/logout, web POST ingest, public+private room/thread routes, compose forms, and ACL-gated room pages in forum.rs/auth/web_post. A is a real DSL grammar flip (explanation-first votes, parser split into block-prefixed vs item-definition paths) but most of the diff is cascading fixture/test/doc rewrites rather than new capability.
Side B adds substantial end-user functionality by wiring up browser login via session cookies, adding web posting (`/post`), room-aware forum routes, authentication helpers, and integrating these into the application's router. Side A thoroughly redesigns the DSL to require block-first vote explanations and updates the parser, UI, docs, and tests accordingly, but it is primarily a syntax migration rather than adding new user-facing capabilities.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_cd965c070df3 (tommy-mor)
Side B fixes a concrete functional bug (Reddit child imports bypassing ensure_path and mislabeled unranked children) with a small, well-targeted change plus new test coverage validating the corrected behavior. Side A is a large, backward-incompatible DSL syntax rework (trailing to leading explanation blocks) that adds real parser complexity but the bulk of its diff is mechanical fixture/test reformatting rather than fixing a defect, making its net lasting value less clear-cut than B's targeted correctness fix.
A redesigns the core sorter DSL (parser split into block-prefixed votes vs path-then-body items, pending-block handling, legacy rejection) so explanation-first votes become the lasting language contract project-wide. B is a real, precise fix—Reddit children attach via apply_entity_under_parent without ensure_path segment pollution, and unranked labels use entity titles—but it is scoped to import/UI wiring rather than the product’s primary syntax.
Side B fixes concrete functional issues: Reddit child imports now attach entities directly under the fetched parent via a new `apply_entity_under_parent` path instead of incorrectly invoking path expansion, and the ranking panel now displays imported child titles by consulting the global tree rather than raw path labels. Side A performs a sweeping DSL syntax redesign (moving vote explanations before comparisons and updating parser, UI, docs, and many tests), but much of the patch is ecosystem-wide migration and breaking syntax changes rather than an isolated correctness improvement.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_c124c217f89c (tommy-mor)
Side B implements a substantial, self-contained new feature: an async Reddit fetch broker with OAuth handling, rate-limit backoff, caching, JSON parsing for subreddits/posts, and tests, wired cleanly into AppState and the browse handler. Side A is a large, mostly mechanical DSL syntax reshuffle (trailing to leading explanation blocks) touching many tests/fixtures/docs, which is a real but narrower, more churn-heavy change with less net new capability despite its size.
A redesigns the core sorter DSL (block/explanation-first votes, clearer item bodies) with real parser changes in dsl.rs plus coordinated docs/UI/fixture updates, which shapes how every ingest works. B adds a solid Reddit fetch worker (OAuth, rate limits, URL mapping) but it is a peripheral, still-incomplete integration on a placeholder path rather than a lasting core-language change.
Side A implements a substantive DSL redesign by changing vote syntax to use leading explanation blocks, refactoring the parser to support pending block parsing, adding validation and error cases, updating UI generation, and comprehensively updating tests and documentation to match the new grammar. Side B adds a useful but incomplete Reddit background fetch pipeline and request hooks, but much of it is new integration code without equivalent end-to-end validation and includes placeholder planning, making its lasting project impact smaller than the coordinated language and parser change in Side A.
comparison · c_55666fe32c48 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side A fixes a real logic bug (zero-ratio votes silently defaulted to 1:1 instead of being rejected/dropped) and adds sensible bounds with focused, well-tested changes across parser, handler, and reducer. Side B is a large syntax-reordering refactor (moving explanation blocks before votes/items) that touches many files and fixtures but is mostly mechanical churn with no functional bugfix, and even changes the DSL in a way that could be seen as a regression in ergonomics (losing adjacent-body syntax).
B redesigns the core DSL so vote explanations lead and item bodies trail paths, rewriting the parser (block-prefixed votes, pending-block handling) and aligning docs, UI emit paths, and fixtures—lasting product grammar. A only tightens ratio bounds (≥1, ≤100) in parser/UI/reducer with tests; correct and useful, but a narrow validation fix atop existing semantics.
Side A introduces substantive validation by enforcing vote ratios of 1–100 in the DSL parser, browser POST handler, and reducer, preventing invalid zero-weight edges and unbounded ratios while adding focused regression and integration tests. Side B primarily performs a sweeping DSL syntax migration (moving vote explanations before comparisons) and updates documentation, fixtures, UI formatting, and tests to match, with comparatively little new functional behavior beyond the syntax change.
comparison · c_5e9a63e9d276 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side B introduces a real, user-facing DSL semantic change (explanation-first vote syntax) with corresponding parser rework, updated docs, and broad test-fixture migration across server, CLI, and browser integration tests, demonstrating a functional language change with wide validation. Side A is a large but purely internal refactor (moving path/URL types into a shared crate) that improves code organization but changes no external behavior and carries higher risk of regressions without adding new capability.
B changes the core DSL so votes are explanation-first (leading `{…}` then the comparison), with parser, UI payloads, docs, and fixtures updated to match—a lasting product/language design. A is a solid consolidation of path/URL identity into slug-types with wire newtypes (GardenItemUrl, ForumThreadUrl), but it largely relocates existing helpers and retypes JSON fields without changing user-facing behavior.
Side A consolidates canonical path normalization and URL construction into shared `slug_types::paths` newtypes (`GardenItemUrl`, `ForumThreadUrl`, `TildeOntologyPath`) and updates API/RPC types to use those strongly typed representations instead of scattered string helpers. This removes duplicated logic, centralizes canonicalization across crates, and makes many interfaces correct-by-construction, whereas Side B primarily changes the DSL syntax for vote explanations and updates the parser, documentation, fixtures, and tests to match that new format.
comparison · c_4772ee88dbe3 (tommy-mor) vs c_2f5d9e0370f8 (tommy-mor)
Side B implements a substantive, deliberate DSL redesign (block-first explanations/items) with corresponding parser rewrite, extensive test/fixture updates, and documentation changes across the whole codebase, representing real, lasting feature work. Side A is largely cleanup/removal of a demo feature plus an async settlement worker refactor for ranking caching, which is useful but smaller in scope and partly removes rather than adds durable functionality.
B permanently reshapes the core user-facing sorter DSL (explanation-first votes, stricter block-vs-item parsing) with real parser work in dsl.rs and consistent product/docs/test updates. A’s settlement worker and ranking cache are solid systems improvements plus demo-counter cleanup, but they are internal scaffolding compared with B’s lasting language/design change.
Side A makes substantive architectural improvements by introducing a settlement worker that batches vote persistence and ranking recomputation, adds cached ranking reads (`ranked_items_cached`) to avoid recomputing on every HTTP request, switches ranking access from write to read locks, and removes the obsolete demo-counter feature. Side B consistently migrates the DSL to a new explanation-first vote syntax and updates the parser, UI emission, documentation, and tests, but much of the patch is a project-wide syntax conversion rather than adding new runtime capability.
comparison · c_2f5d9e0370f8 (tommy-mor) vs c_fbeec5c4ad18 (tommy-mor)
Side B changes the core ranking semantics from author-level to commit-level pairwise comparison, a substantive architectural fix (fair per-commit attribution, contributor rollups, updated UI/evidence pages) with accompanying test updates validating the new behavior. Side A is a large but mechanical DSL syntax reshuffle (moving explanation blocks before votes) that touches many files/tests but is mostly repetitive fixture/test churn rather than a fundamentally new capability.
A redesigns the core sorter DSL (explanation-first votes, path-then-body items) with a real parser split, multi-line pending-block handling, and consistent updates across docs, UI emit paths, and the full test/fixture surface—lasting product behavior. B improves ranking fairness by pairwise-scoring each commit and rolling up, plus epoch UI, but is a narrower infrastructure change confined mostly to constitution.py and its tests.
Side B changes the ranking algorithm itself from contributor-level comparisons to pairwise ranking of every eligible commit, adds commit-level evidence and rollup logic, updates UI/evidence pages to expose per-commit rankings, and fixes the short-circuit so multiple commits by one contributor are still evaluated. Side A is a broad DSL syntax migration (leading explanation blocks and title-first items) with parser rewrites and widespread fixture updates, but it primarily changes input format rather than adding comparable lasting system capability.