comparison · c_c42f908efc44 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A performs a substantial type-safety refactor (introducing Deref for newtypes, threading CanonicalItemUrl through resolve_item/validate/rpc), reducing ad-hoc string keys and CanonicalItemUrl::parse calls, which lowers risk of subtle bugs across core ranking/validation logic. Side B is a focused UX improvement (auth form morphs in place instead of redirecting) that's useful but narrower in scope and touches less critical, more presentation-layer code.
A threads CanonicalItemUrl through resolve_item, validation HashSets, pair pools, connectivity stats, and rank-change maps, removing repeated String↔CanonicalItemUrl wrap/parse noise and adding Deref on href newtypes—core type-safety that sticks across the API. B only swaps auth choose-username redirects for HTML fragments plus a small poem JS morph path and CSS, a valuable but narrow UX tweak.
Side A replaces many raw `String` path usages with the `CanonicalItemUrl` type throughout validation, ranking, pair selection, and RPCs, changes `resolve_item` to return the typed value, and adds `Deref<str>` for URL newtypes to reduce conversions while improving type safety and API consistency. Side B improves the authentication flow by returning HTML fragments for inline form updates via the existing JS interceptor, but its impact is primarily user-interface behavior rather than a broad structural improvement to correctness and maintainability.
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_ebc883667d61 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A is a pure mechanical split/reorganization of forum.rs into submodules with no behavior change (net-zero functional value, mostly file-move churn). Side B implements a real UX/architecture improvement: it removes redirect-based auth flow in favor of AJAX form morphing, adds error/success fragment rendering, updates the shared poem JS to handle in-place form updates, and adds corresponding CSS — a genuine functional feature with lasting design impact.
B adds lasting product behavior: auth POSTs return Maud fragments (error form / signed-in message) and poem JS morphs non-empty bodies into the form, replacing redirect-based choose-username with inline success/error and shared layout. A’s huge diff mainly deletes leftover forum.rs and relocates the same thread HTML into forum/* with little logic change—useful module hygiene, but mostly structural churn versus B’s focused UX/API improvement.
Side B makes a lasting functional improvement: `post_choose_username` now returns HTML fragments for success/error instead of redirects, and the shared Poem JS reads non-empty responses to morph a form's `innerHTML`, enabling inline auth feedback while preserving existing empty-response behavior for other forms. Side A primarily removes the duplicate `server/src/html/forum.rs` and establishes `forum/mod.rs` with split modules to eliminate module-root ambiguity, which is valuable maintenance but mostly a structural cleanup rather than new user-facing behavior.
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_bc8c17a00ed7 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
B implements a coherent, tested-in-context UX flow change (fragment-based auth response, JS morph handling, layout unification, CSS across both themes) touching multiple coordinated files, representing meaningful feature work. A is a small, well-scoped bugfix with a unit test for skipping pinned Reddit posts, which is solid but narrower in scope and impact than B's cross-cutting improvement to the auth flow architecture.
B delivers a lasting auth UX redesign: POST responses become HTML fragments with poem-JS innerHTML morphing, unified layout usage, and inline success/error handling—structural product improvement across auth.rs, html, and themes. A is a correct, well-tested filter for pinned Reddit posts, but it is a narrow import tweak with far less systemic impact.
Side B redesigns the auth form flow to return HTML fragments instead of redirects, updates the shared Poem JavaScript to morph form contents from non-empty responses, refactors the auth templates for reuse, and adds supporting styling, enabling inline validation and success handling without page reloads. Side A is a solid targeted bug fix that filters stickied/pinned Reddit posts during import and includes a regression test, but its impact is narrower than the broader, reusable interaction infrastructure added in Side B.
comparison · c_64faa3bee86f (tommy-mor) vs c_f515f8a12d7a (tommy-mor)
Side A fixes a real architectural inconsistency (auth endpoints doing full redirects instead of participating in the poem-JS morph pattern used elsewhere), adding proper success/error fragments and matching CSS for both themes — a genuine, self-contained UX bugfix. Side B is a solid but narrower cleanup that removes a duplicate toolbar/action by SSRing initial state, reducing code but with less functional impact than A's fix.
A redesigns auth to return HTML fragments and extends the shared poem fetch interceptor to morph non-empty bodies, unifying layouts and giving lasting inline success/error UX without breaking empty-body ingest forms. B is worthwhile cleanup (SSR #new-thread-ui-slot on home, delete ExpandNewThreadForm + toolbar), but it mainly removes redundant indirection already solved on room pages rather than adding comparable capability.
Side A changes the authentication flow to return HTML fragments for inline success/error handling, updates the shared Poem JS form interceptor to morph non-empty responses, factors the auth form into reusable markup, and removes redirect-based error handling. This is a lasting behavioral improvement that simplifies UX and infrastructure for form submissions, whereas Side B mainly removes a specialized UI action and redundant toolbar by server-rendering the existing collapsed compose state, a useful but narrower cleanup.
comparison · c_a896b2dc05d5 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A performs a real data-model migration (Deque→List) with a schema version bump, correctly moves the cap logic to query time, and adds a dedicated test verifying capping/ordering behavior—demonstrating careful reasoning about durable storage semantics. Side B is a reasonable UX improvement (form morphing instead of redirects) but is smaller in scope, purely additive UI plumbing without tests, and lower architectural stakes than a storage schema change.
A redesigns core projection storage (Deque→append-only List, write-time trim→read-time cap, schema v4) and deletes projection_apply trim bookkeeping, with a concrete load-cap test—lasting data-path simplification. B improves auth UX via fragment morphs and shared layout, but is surface UI/JS plumbing without comparable structural impact.
Side A makes a substantive storage-model redesign by replacing the durable recent-votes deque with an append-only list, removing post-commit trimming, updating the reducer and load path to apply the cap at query time, bumping the schema version, and adding a regression test for the new behavior. Side B mainly improves authentication UX by returning HTML fragments for inline form updates and extending the generic form JavaScript, which is useful but more localized and less foundational than the persistence-layer change.
comparison · c_64faa3bee86f (tommy-mor) vs c_4ed2e2cca39b (tommy-mor)
Side B fixes a real bug (undefined variable causing a NameError in a live OAuth callback path) with a minimal, correct patch. Side A is a larger UI/UX refactor (inline form morphing instead of redirect) that adds functionality but is more speculative/stylistic and carries more risk of regressions across auth flows; it's valuable but less clearly a durable correctness fix than B's crash fix.
A redesigns auth to return HTML fragments and extend the shared poem form interceptor for inline success/error morphing, while collapsing a separate auth_layout back into the main layout—lasting UX and architecture. B only adds a missing GITHUB_API_BASE_URL default (three lines), a real but narrowly scoped NameError fix with far less surface impact.
Side A implements a lasting UX and architecture improvement for authentication by replacing redirect-based flows with HTML fragments, adding reusable rendering helpers, updating the shared form interception logic to morph non-empty responses, and integrating the auth pages back into the common layout. Side B is a valuable but narrowly scoped bug fix that defines a missing GITHUB_API_BASE_URL configuration with a sensible default to prevent a NameError in the OAuth callback.
comparison · c_3ff71f7eaeda (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A adds a concrete, tested UI improvement (vote-count badges, HUD 'unpin' turned into a proper POST action) with unit and browser-test coverage verifying the new behavior. Side B reworks the auth flow to rely on JS-only fragment morphing instead of redirects, removing the previous public_url-based redirect logic without adding any tests, which is a riskier architectural change with less verification of correctness.
B replaces redirect-based auth success/error with HTML fragments and extends the shared poem form handler to morph non-empty responses, a lasting flow design that unifies auth with the main layout and keeps existing empty-body forms working. A is solid garden UX (edge vote counts, HUD unpin via set_garden_pin clear, tests/CSS), but it is scoped feature polish rather than a core interaction-pattern fix.
Side B changes the auth flow from redirect-based responses to inline HTML fragments, extends the shared Poem form interceptor to morph returned HTML into the existing form, and factors reusable auth form rendering into fragments. This is a broader architectural improvement that enables smoother form interactions without affecting existing empty-body POST handlers, whereas Side A primarily enhances the garden UI with vote counts, HUD unpin behavior, styling, and related tests.
comparison · c_64faa3bee86f (tommy-mor) vs c_6a02ffb06a41 (tommy-mor)
B fixes an actual off-by-one/inconsistency bug (thread_post_index using different 0/1-based conventions between feed and rank-history/URLs), adds regression tests asserting the correct indices, and updates doc comments accordingly—concrete, verifiable correctness improvement. A is a reasonable UX feature (inline form morphing instead of redirect) but is more speculative UI churn without tests, and its value is harder to verify from the diff alone.
A redesigns auth to return HTML fragments and morph the form via poem JS, removing redirect churn and a parallel auth_layout in favor of the shared layout—lasting UX/architecture. B only aligns thread_post_index to 0-based paths (drop +1/unwrap_or(0), expect, tests), a precise correctness fix but narrower in scope.
Side A implements a substantive authentication UX change: the server returns HTML fragments instead of redirects, the shared Poem JS fetch handler now morphs form innerHTML when a response contains HTML, auth templates are refactored to support fragment rendering, and matching CSS is added. Side B mainly corrects thread post indexing semantics by replacing a fallback with an invariant-enforcing expect, updating links, comments, and tests; while useful, it is a comparatively narrow consistency fix rather than a broader, reusable feature.
comparison · c_66eb04076a98 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
B removes a real bug-prone redirect flow (env-var-based URLs, full page reloads) in favor of a consistent SPA-like fragment morph pattern, unifying auth pages with the shared layout() and reducing duplicated markup via form_inner(). A is a well-tested, focused fix to a visual gradient bug, which is valuable but narrower in scope than B's structural simplification and consistency improvement across auth flow and CSS themes.
B redesigns the auth POST path to return HTML fragments (error re-render and signed-in message) and extends poem JS to morph non-empty bodies, replacing redirects and the separate no-JS auth_layout with the shared layout—substantive flow and architecture for a core path. A is a precise, well-tested rank-color fix (score min–max vs ordinal) but only refines visualization within an existing list UI.
Side B makes a substantive architectural improvement to the authentication flow by replacing redirect-based form handling with inline HTML fragments, extending the existing Poem JS to morph form content from non-empty responses, and refactoring the auth templates to reuse shared form markup. Side A improves the ranking UI by basing row colors on per-group score ranges instead of list position and adds focused tests, but its impact is primarily presentational, whereas Side B changes user interaction and simplifies server/client behavior for auth.
comparison · c_b00c261f06c2 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side B fixes a real UX/architecture flaw (redirect-based auth flow) by unifying the auth form with the existing poem/fetch pattern, adding proper fragment responses and consistent layout reuse, which reduces special-casing and duplicated layout code. Side A is a solid, well-tested UI bugfix (vote highlighting/slider polarity) with good tests, but it's narrower in scope and mostly CSS/JS polish plus a per-group ranking fix, offering less structural improvement than B's consolidation of auth handling into the existing generic form-submission mechanism.
A fixes core vote/ranking UI correctness (per-group gradients, center-anchored winner fill, ratio→slider polarity) and locks it in with polarity and rank-style tests, replacing mismatched history bars with HUD-consistent sliders. B is a clean but narrower auth UX change (fragments + poem innerHTML morph instead of redirects) that mostly refactors the choose-username path without comparable invariant fixes.
Side B introduces a reusable interaction pattern by changing auth POST handling from redirect-based navigation to HTML fragments that the existing Poem JS morphs into the form, enabling inline success/error feedback and restoring the standard layout while adding fragment-rendering helpers. Side A fixes a real UI bug by making rank-row gradients apply per ranking group instead of globally and adds targeted tests, but much of the remaining patch is broader vote-history UI polish rather than the core bug fix.
comparison · c_11d6a0ec9839 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A fixes a real correctness bug (silent fallback to the full item pool instead of erroring when the sibling pool is too small), corrects the delegate/attribution plumbing, removes a dead UI button, and updates all affected tests/routes consistently. Side B is a reasonable UX improvement (fragment-based auth flow) but changes a global submit-handler behavior with more risk and no test coverage, making it a slightly less solid, well-verified change than A.
A fixes real correctness issues: vote attribution via out-of-band delegate_opt instead of stuffing WEB_BROWSER_AGENT into the DSL body, and refusing a bad all-items fallback when the sibling pool is < 2. B’s auth fragment/morph path is solid UX infrastructure, but it largely replaces working redirects rather than repairing broken behavior; A’s route rename/swap removal are lighter, yet the two logic fixes outweigh B’s polish.
Side B changes the auth flow to return HTML fragments and extends the shared Poem form interceptor to morph a form's innerHTML when the response contains HTML, enabling inline success/error handling without redirects while preserving existing empty-body POST behavior. Side A mixes a real bug fix (avoiding fallback to all items when the sibling pool is too small and passing delegate attribution out-of-band) with lower-impact cleanup such as removing the swap button and renaming `/vote/compare` to `/vote`, so its lasting design impact is somewhat smaller overall.
comparison · c_7ec4b410de02 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side B unifies the auth flow with the shared layout/JS pattern (removing a bespoke redirect-based layout, adding inline error/success fragments and generalizing the poem-JS morph behavior), which is a real architectural simplification with broader reuse. Side A is a solid, well-tested UX addition (unpin from ranked list) but is more narrowly scoped and mostly wiring/CSS/test changes rather than structural improvement.
B redesigns auth POST handling to return HTML fragments and extends the shared poem form interceptor to morph non-empty responses, replacing redirect round-trips with inline error/success—structural UX that affects the whole auth path. A only wires an existing set_garden_pin clear action onto ranked-child pin glyphs (plus CSS/tests), a useful but localized consistency fix.
Side B changes the auth flow architecture by returning HTML fragments instead of redirects, refactoring the username form into reusable rendering helpers, and extending the shared Poem JavaScript to morph a form's innerHTML when a POST returns HTML, enabling inline form updates without page reloads while preserving existing empty-response behavior. Side A is a solid UX improvement that makes ranked child-group pin icons submit the existing unpin action and adds browser coverage, but it is a narrower feature built on an existing flow rather than a reusable interaction pattern.
comparison · c_64faa3bee86f (tommy-mor) vs c_978e283f2229 (tommy-mor)
Side A is a small, precise UX/architecture fix: it replaces redirect-based auth flow with fragment responses and a JS morph, is correct, coherent, and consistent with the existing poem-JS pattern, with matching CSS additions. Side B is a large CLI restructuring (renaming ingest->forum post, forum->forum list/show) that is mostly churn/renaming across docs, main.rs, rpc.rs and tests, and even introduces a minor regression by removing the escape_xml helper in favor of unescaped body output.
B lastingly reshapes the primary agent interface: scoped `forum list|show|post` replaces ambiguous `ingest`/`forum` shapes, requires `--delegate` on CLI posts, and updates GUIDE/DSL, RPC next-move strings, and integration tests in lockstep. A is a solid, tighter UX fix (auth POSTs return morphable fragments and poem JS handles non-empty bodies) but is a narrower surface change than B’s command-model redesign.
Side A implements a substantive authentication UX improvement by changing the auth flow from redirects to HTML fragments, adding reusable fragment rendering, and updating the shared Poem JS form handler to morph returned HTML in place while preserving existing empty-response behavior for other forms. Side B is primarily a CLI command reorganization and documentation update (renaming `ingest` to `forum post`, splitting forum subcommands, updating help text and tests), which improves interface clarity but contributes less enduring functionality than the new inline auth behavior.
comparison · c_4a5c84c0a37b (tommy-mor) vs c_64faa3bee86f (tommy-mor)
B fixes a real UX/architecture bug (redirect-based auth flow replaced with in-page morphing, consistent with the app's poem JS pattern) and simplifies auth.rs by reusing the shared layout function, providing lasting design value across success/error paths. A is a solid but narrower fix (correcting href encoding to use display_path) plus a much stronger test rewrite, but the core code change is smaller in scope and the test, while thorough, is not itself product functionality.
A fixes a real consistency bug (vote hrefs encoding full storage URLs instead of display_path ~/… forms users see) and replaces a weak ≤15-iteration smoke loop with a full C(10,2)=45-pair vote run plus GetGardenRank assertions on connectivity and a→j order. B’s auth fragment/morph work is solid UX design (inline error/success, drop redirects and a special layout), but it is polish on an adjacent flow rather than core ranking correctness plus lasting regression coverage.
Side B changes the authentication flow to return HTML fragments instead of redirects and extends the shared Poem JS form handler to morph returned HTML into the existing form, enabling inline success/error feedback while preserving existing empty-body POST behavior. Side A fixes vote URLs to use display paths and substantially strengthens an integration test by exercising all 45 vote pairs and asserting the final ranking, but much of its impact is in test coverage rather than runtime behavior.
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_64faa3bee86f (tommy-mor) vs c_597d3f736194 (tommy-mor)
Side B fixes real, concrete bugs: str/split called with a plain string instead of a regex, .getInputStream instead of .getRequestBody, unguarded str/starts-with? on nil tokens, sendResponseHeaders misuse, and adds error handling so the mock OAuth server doesn't silently crash tests. Side A is a reasonable UX improvement (inline form morphing instead of redirects) but is more speculative feature work with less certain lasting necessity, whereas B restores broken E2E test infrastructure that other work depends on.
A delivers a lasting product design change: auth posts return HTML fragments, poem JS morphs form innerHTML for inline errors/success, and auth uses the shared layout instead of redirects/a separate layout. B is valuable but narrower—null-safety and HttpServer mock fixes (split regex, getRequestBody, sendResponseHeaders length, try/catch) that restore Clojure E2E auth tests without changing production behavior.
Side A makes a lasting application-level improvement by changing the auth flow from redirects to HTML fragments, adding reusable rendering helpers, and extending the shared Poem JS form handler to morph returned HTML for inline success/error feedback while preserving existing empty-response behavior. Side B primarily repairs test infrastructure and OAuth mocks (query parsing, request body reading, null handling, redirect responses, and exception handling), which is valuable for reliability but is confined to the test environment rather than the product's core behavior.
comparison · c_8c6a5e2e4a54 (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A implements a substantial, functional feature: cookie-based session auth, private room routing/permissions, a web-based posting endpoint reusing the RPC core, and refactored thread navigation supporting both public and room scopes — real, load-bearing architecture. Side B is a much smaller UX polish (inline form morphing instead of redirect) that's useful but narrow in scope, and both patches include some noise (A's odd plan2.md prose file; B's AI co-author tag), but A's changes deliver far more lasting functional value.
A delivers lasting product surface: browser session cookies, web login/logout, /post ingest, and full private-room UI (ThreadNav, room pages, ACL-gated thread/post/expand views, compose forms) wired into routes and RPC. B only swaps choose-username redirects for fragment + Idiomorph morph and minor auth CSS—a narrow UX polish on one form.
Side A restores substantial web UI functionality by adding browser session cookies, login/logout flows, authenticated web posting, room-aware routing and permissions, private room pages, and reusable thread/navigation abstractions wired into the router. Side B is a focused UX improvement that changes the username form to return HTML fragments and updates the client-side form handler to morph form contents instead of redirecting, plus minor CSS additions.
comparison · c_c25451965a7f (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A fixes a real, spreading bug: hardcoded hostnames (staging.sorter.social, InetAddress lookups) across six backend files that would break OAuth callbacks and redirects on custom hosts, consolidating them into a single reusable util.get-base-url with proper HOSTNAME/env fallback plus a matching frontend fix and CI staging trigger. Side B reworks an auth form to avoid a redirect via innerHTML morphing, which is a reasonable UX improvement but is narrower in scope, affects only one flow, and introduces added client-side complexity without fixing a correctness bug of comparable breadth.
A fixes real OAuth/callback breakage by replacing duplicated hardcoded host logic across linear/login/oauth/spotify/twitter/youtube with a single HOSTNAME-aware get-base-url (plus window.location.origin on the client) and aligns deploy to staging. B is a solid auth UX improvement (fragment responses + poem morph, layout unification, CSS), but it is polish on one flow rather than correcting broken multi-host redirects project-wide.
Side A introduces a shared `util/get-base-url` used across multiple OAuth/login modules, replacing inconsistent hardcoded hostnames and environment checks with `HOSTNAME`/origin-aware logic, which fixes redirect and callback behavior for custom deployments. It also updates the deployment workflow for the staging branch. Side B improves the auth UX by returning HTML fragments for inline form updates instead of redirects, but its impact is narrower and primarily affects interaction flow rather than deployment correctness or cross-environment reliability.
comparison · c_64faa3bee86f (tommy-mor) vs c_939729b4d9a6 (tommy-mor)
Side A is a focused, well-explained fix that replaces awkward redirect-based auth flow with in-place HTML fragment responses, consolidates layout code, and adds matching CSS — a clear, self-contained improvement. Side B, despite being labeled 'fix', bundles unrelated concerns (new dependencies, Cargo.lock churn, a new vote-compare feature, typed form-hole parsing, JS slider logic) into one vague commit, making it harder to evaluate as a coherent, necessary change even though it includes some useful tests.
B adds lasting product surface: typed $form:i32 template holes with tests, RecordVote next-navigation, a /vote route and vote CTA, plus the compare-page CSS/slider wiring that make voting usable. A is a focused auth UX win (fragment responses + poem innerHTML morph, shared layout), but it stays scoped to signup feedback and does not expand core sorter behavior the way B does.
Side A implements a coherent authentication UX improvement: the auth endpoint now returns HTML fragments instead of redirects, the shared form layout is refactored into reusable fragments, the client-side Poem JS morphs form contents when a non-empty response is returned, and matching success styling is added. Side B mixes dependency additions, UI scaffolding, typed form-template support, and CSS for a voting feature, but much of the visible functionality depends on code not present in the patch (such as the new vote module), making its standalone lasting contribution less substantial.
comparison · c_6f04dcb2e38c (tommy-mor) vs c_64faa3bee86f (tommy-mor)
Side A removes dual legacy/evidence code paths, simplifying the ledger/epoch/commit views to a single canonical source of truth and updating tests accordingly, which reduces long-term complexity and bug surface. Side B is a reasonable UX improvement (inline auth feedback via innerHTML morphing) but is smaller in scope and mostly localized to one feature, with less structural cleanup value.
A removes the entire legacy GitDiscovery/Emission projection path (_legacy_commit_row, dual epoch/commit rendering, optional Emission fields) so pages and APIs read only Evidence envelopes—a lasting schema/design simplification with matching test updates. B is a solid but narrower UX change: auth POSTs return HTML fragments and poem JS morphs form innerHTML instead of redirecting, plus minor CSS—valuable polish, not core model cleanup.
Side A makes a substantive architectural cleanup by removing legacy GitDiscovery projection paths and requiring evidence-backed metadata, simplifying epoch/commit views to rely only on Evidence events and updating tests to enforce the new model. Side B improves the authentication UX by replacing redirects with inline HTML fragments and extending the shared JS form handler, but its impact is more localized to the web interface than A's system-wide data model and maintenance simplification.