comparison · c_94135a1c4c58 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A delivers a coherent, security-focused change (fail-closed vote auth, mock-OAuth gating, Secure cookies, open-redirect hardening) with tests and doc updates, directly closing real vulnerabilities. Side B is a large architectural rewrite (scope->fractal tree/ItemId) that is plausible but riskier, less focused, and its terse 'reconfigure' message and broad renames (settlement->journal, groups->tree) suggest unreviewed churn without the same clear safety payoff.
B replaces flat scope maps with a hierarchical ItemId/GlobalTree model (path canonicalization, breadcrumbs, journaled tree votes, NodeEnsured), which is lasting core-domain design. A’s fail-closed voting, mock-OAuth gate, Secure cookies, and open-redirect hardening are real security fixes, but they tighten an existing auth layer rather than reshaping the ranking architecture.
Side A delivers concrete security and correctness improvements: voting now fails closed instead of silently falling back to an anonymous actor, auth cookies gain the Secure flag when appropriate, mock OAuth is gated behind an environment flag, open-redirect sanitization is strengthened, and these behaviors are covered by new tests. Side B is a broad architectural refactor toward hierarchical ItemId/tree support, breadcrumbs, and a journal rename, but much of it lays infrastructure or UI changes rather than fixing an immediate correctness or security issue, making A the more durable high-impact change.
comparison · c_509fc5155034 (tommy-mor) vs c_fdb136513896 (tommy-mor)
Side A is a substantial, working refactor: it introduces a generalized ItemId path/tree model (GlobalTree, NodeState), replaces the old settlement module with a journal worker, updates parser/state/html/UI code accordingly, and adds new unit/integration tests validating the behavior. Side B is a one-line, unbuilt idea note appended to a seed/notes file with no code, tests, or functional change, offering negligible lasting engineering value.
Side A is a full architectural rework: fractal ItemId tree, GlobalTree/NodeState, journal worker, URL canonicalization, breadcrumbs/entity UI, and event replay migration. Side B only appends one unimplemented product note to seed.tdsl with no code or design impact.
Side A fundamentally restructures the project around hierarchical ItemId-based nodes and a GlobalTree, replacing flat scope-based rankings, adds canonical Reddit URL parsing, breadcrumb navigation, node persistence, and a journaled vote pipeline, with corresponding tests and UI updates. Side B only appends a single planning note ('have index be sorted by viewcount') to a seed ideas file and does not change application behavior.
comparison · c_bc8c17a00ed7 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A is a small, focused, correct bugfix (skip pinned/stickied Reddit posts) with a clear test verifying the exact behavior, adding real lasting value with minimal risk. Side B is a sprawling, vague 'reconfigure' commit that reworks the entire ID/scope/state model (renaming settlement->journal, scope->ItemId tree, new files) with much higher risk of regressions and no clear single purpose, making it harder to attribute clean ownership value despite its size.
B is a foundational redesign: ItemId path model, GlobalTree/NodeState, journal worker replacing settlement scopes, breadcrumbs/entity UI, and parser/state migration—core lasting architecture. A is a small, correct filter (skip stickied/pinned children) plus one test, valuable but narrow against B’s structural contribution.
Side B introduces a substantial architectural shift from flat subreddit scopes to a hierarchical `ItemId`/`GlobalTree` model, updating parsing, state management, UI navigation (breadcrumbs and item links), vote recording, event handling, and tests to support canonical item identities and per-node rankings. Side A is a correct, targeted bug fix that skips `stickied`/`pinned` Reddit posts during import and adds a regression test, but its impact is much narrower than the persistent data model and UI capabilities added in Side B.
comparison · c_28dfd8015c8a (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side B is a substantial architectural refactor (settlement -> journal, flat scope map -> hierarchical GlobalTree, ItemId path parsing/canonicalization, breadcrumb UI, entity data) with corresponding tests and real feature capability additions. Side A is a small, useful but minor kaocha config simplification (two suites -> one glob pattern) with no code or behavioral change beyond test discovery.
B replaces flat string scopes with a hierarchical ItemId/GlobalTree model (path canonicalization, breadcrumbs, journaled votes, NodeEnsured events, UI/entity panels)—core lasting domain architecture. A only collapses hand-listed kaocha suites into one ns-pattern in tests.edn, a useful but narrow test-runner convenience.
Side B implements a substantial architectural shift from flat subreddit scopes to a hierarchical `ItemId`/`GlobalTree` model, updating vote recording, event replay, URL parsing, UI navigation (breadcrumbs, entity panels, links), and persistence with new journal and tree infrastructure. Side A improves maintainability by replacing manually enumerated Kaocha test namespaces with automatic `^test\..+` discovery, but it is limited to test configuration rather than core project behavior or architecture.
comparison · c_509fc5155034 (tommy-mor) vs c_c6beb77e8e71 (tommy-mor)
Side A introduces a genuinely new architecture (GlobalTree/NodeState hierarchical model, canonical ItemId URL parsing/normalization, breadcrumb navigation) with accompanying unit tests, replacing the flat scope-based ranking system — a substantial, lasting design shift that the codebase clearly builds on later (fetch/render modules in B depend on this tree). Side B is a smaller, useful cleanup (fixing duplicate-id morph targets, deduplicating vote-card rendering by reusing entity_section) but is narrower in scope and fixes a bug introduced by prior work rather than establishing new capability, and even contains a stray formatting glitch in the match arm indentation.
A replaces flat scope maps with a hierarchical GlobalTree/ItemId model, path canonicalization, journaled votes, breadcrumbs, and event replay—foundational design the app still sits on. B only switches entity morph targets to data-attribute selectors and reuses entity_section in vote cards (plus CSS cleanup), a useful but local UI DRY fix with far less lasting structural impact.
Side A introduces a substantial architectural shift from flat subreddit-scoped rankings to a hierarchical ItemId-based tree, adding GlobalTree/NodeState, canonical URL parsing, breadcrumb navigation, journaled vote handling, and compatibility for replaying legacy events. Side B is mainly a UI refactor that reuses the existing entity section for vote comparison and switches DOM morph targets to item-specific selectors, which improves maintainability but is much narrower in lasting impact.
comparison · c_57453fc5c6c0 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A adds a well-scoped, clearly-motivated feature (garden ranking clipboard copy) that follows existing patterns (CopyThread), and ships with unit tests, an integration test, a browser test, and doc updates. Side B is a sprawling, vaguely-described ('reconfigure') architectural pivot that rewrites the ranking data model (scope->tree), renames/removes settlement.rs, rewrites the URL parser, and touches many files at once, making its lasting value and correctness far harder to assess despite some added tests.
B replaces flat string scopes with a hierarchical ItemId/GlobalTree model, journaled votes, path canonicalization, and breadcrumb navigation—core lasting architecture. A adds a useful but incremental clipboard UX (CopyGardenRank) that mostly reuses existing ranking/JsBuilder patterns and does not reshape the system.
Side B introduces a substantial architectural shift from flat scope-based rankings to a hierarchical `ItemId`/`GlobalTree` model, adding canonical URL parsing, breadcrumb navigation, per-node rankings, event replay for tree nodes, and a journal worker while updating vote handling and integration tests accordingly. Side A is a well-implemented user-facing feature that adds a garden ranking copy button with markdown generation, `/ui` action handling, permissions, and tests, but it primarily extends existing UI behavior rather than changing the project's core data model.
comparison · c_597d3f736194 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side B is a substantial, structural refactor introducing a generalized ItemId/tree model (path_types, reducer's GlobalTree/NodeState, journal.rs replacing settlement.rs, breadcrumb rendering, reddit.rs) that changes the core data model to support hierarchical ranking beyond just subreddits, backed by new unit/integration tests. Side A is a narrower, useful but low-risk test-infrastructure fix (correcting regex usage, HttpExchange methods, exception handling in mock OAuth server) that restores E2E test reliability but adds no new product capability.
B replaces flat scope/group ranking with a hierarchical ItemId/GlobalTree model, journaled votes, breadcrumbs, and URL canonicalization—core lasting product design. A only repairs test OAuth mocks (query split, request body, null-safety) and selector helpers so E2E auth runs again, valuable but confined to test plumbing.
Side B introduces a substantial architectural shift from string-based scopes to hierarchical `ItemId`/`GlobalTree` state, adds persistent node registration, canonical Reddit URL parsing, breadcrumb navigation, entity support scaffolding, and rewires voting and UI around the new model. Side A is a valuable bugfix that restores OAuth end-to-end tests by fixing mock HTTP handling (`getRequestBody`, redirect responses, null checks, query parsing) and improving test selectors, but its impact is primarily limited to test infrastructure rather than the project's core design.
comparison · c_a896b2dc05d5 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side B is a substantial feature commit introducing a hierarchical ItemId/fractal-tree model (parent/child, breadcrumbs, URL canonicalization), rewiring state/journal/reducer/UI to use it, replacing the flat scope-based GroupMap, with new tests and CSS support—clearly lasting architectural work. Side A is a small, focused refactor (Deque -> List with query-time capping) that removes a write-amplifying trim step, which is a solid but narrow correctness/perf improvement compared to B's broad structural redesign.
B reshapes the product around a hierarchical ItemId/GlobalTree model (path canonicalization, parent/child wiring, NodeEnsured, journal-backed votes, breadcrumbs/UI), a lasting architectural shift; A only swaps recent_votes Deque/VecDeque for append-only List/Vec with read-time capping and drops write-time trim—a correct but narrow storage simplification.
Side B introduces a substantial architectural evolution from flat string-scoped rankings to a hierarchical ItemId/GlobalTree model, adds canonical URL parsing, breadcrumb navigation, node registration events, and a journal worker while updating state, UI, and tests to support the new design. Side A mainly replaces a deque with an append-only list, removes write-time trimming in favor of query-time capping, bumps the schema version, and adds a targeted test; useful, but much narrower in long-term impact.
comparison · c_410d9361a866 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side B lays down the actual foundational architecture (ItemId path canonicalization/breadcrumbs, GlobalTree replacing the flat GroupMap, journal worker, parser rewrite) that Side A's commit builds directly on top of (rank_list/tree signature, entity_panel, reddit render module). Side A is a nice incremental feature (reddit post thumbnails/images) but is smaller in scope and depends on B's tree/ItemId infrastructure to even function; B's changes are more foundational and broadly enabling despite being messier/larger.
B replaces flat per-scope GroupMap/settlement with a hierarchical GlobalTree, canonical ItemId paths (parent/breadcrumbs/from_url), journal replay including NodeEnsured, and UI wired to ?item= nodes—core lasting architecture. A only extends that surface with Reddit-specific markup (thumb/image/link fields, render/reddit cards, CSS) and a fixture test, valuable polish but dependent and narrower.
Side B introduces a substantial architectural shift from string-based subreddit scopes to a hierarchical `GlobalTree` keyed by canonical `ItemId`s, updating state management, event replay, URL parsing, voting, breadcrumbs, and persistence to support per-node rankings and navigation. Side A adds valuable Reddit-specific rendering (thumbnails, entity cards, image/link extraction, and tests), but it is primarily a presentation and metadata enhancement layered on top of the existing model, whereas B establishes broader lasting infrastructure used across the application.
comparison · c_c124c217f89c (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A implements a real, working feature: a background Reddit fetch worker with OAuth, rate-limit handling, backoff, JSON parsing into EntityData, and unit tests, wired into the UI to actually populate node data. Side B is largely a structural refactor (settlement->journal rename, scope->ItemId tree plumbing, path canonicalization) that is valuable groundwork but leaves reddit.rs as an unchanged placeholder (fetch_reddit_entity still returns None), so it delivers less concrete end-user functionality than A's completed fetch pipeline.
B replaces flat string scopes/GroupMap/settlement with the hierarchical GlobalTree, rich ItemId canonicalization/parents/breadcrumbs, NodeEnsured events, journal worker, and UI wired to tree nodes—core lasting design. A adds a solid RedditBroker (OAuth, rate limits, JSON parse, tests) on that stub, but it is feature work that depends on B’s model rather than reshaping the project.
Side A turns the Reddit integration from a placeholder into a working subsystem: it adds a background fetch broker, OAuth support, rate-limit handling, request deduplication/caching, JSON parsing into EntityData, automatic fetch triggering from navigation and node creation, and tests. Side B mainly restructures the application around hierarchical ItemId/GlobalTree concepts, updates the UI to use breadcrumbs and node-based rankings, and renames the settlement worker to a journal, but much of it is architectural refactoring and scaffolding, whereas Side A delivers substantial new functionality that persists in the project.
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_0c466eea1ed4 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A adds a self-contained, well-tested dev tool (offline compiler/linter) with clear docs and no risk to production code paths, reusing existing server logic cleanly via a new offline.rs module. Side B is a large, invasive refactor (scope->tree, settlement->journal rename, ItemId overhaul) that touches many core files simultaneously with a vague 'reconfigure' message, increasing risk despite adding real tree/breadcrumb functionality; its scope creep and rename churn (settlement->journal) reduce clarity of lasting value compared to A's precise, additive tool.
B rewrites the core domain from flat scope maps to a hierarchical GlobalTree/ItemId model (canonical URL paths, parent/child wiring, journal worker, UI breadcrumbs, vote/event replay), which permanently changes product behavior. A adds solid but auxiliary workspace tooling (offline.rs compile/scan + sorterc CLI) that validates DSL/JSONL without altering the runtime architecture.
Side A adds a substantial new offline tooling capability by introducing a reusable `offline` module plus a new `sorterc` workspace binary that compiles `.sorter` files, replays reducer state from JSONL, scans event logs for malformed ingests, and includes tests and documentation. Side B is a broad architectural reconfiguration toward hierarchical `ItemId`/tree-based state and UI changes, but much of it is scaffolding (placeholder Reddit fetch, renames, structural migration) whose completed value depends on later work, whereas A delivers immediately usable developer functionality built on existing server logic.
comparison · c_8dc1a8119370 (tommy-mor) vs c_509fc5155034 (tommy-mor)
B builds substantial lasting architecture (a fractal ItemId/GlobalTree model, breadcrumb navigation, parent-child ranking, journal worker replacing settlement) that generalizes the app beyond flat subreddit scopes, while A merely replaces an over-engineered but self-contained autocomplete graph with a simpler paste-and-go parser. However, B's diff also carries real risk/incompleteness (renamed settlement->journal with duplicated logic, legacy scope shims, less test coverage of new tree semantics), so it's not a clean sweep, but its net design contribution outweighs A's more isolated simplification and deletion of test infrastructure.
A’s lasting value is a correct simplification: ripping out the unreliable ~1.8k-line keystroke graph, parser_action, race harness, and live-autocomplete JS in favor of paste-and-go plus a small URL parser. B goes further with durable product architecture—hierarchical ItemId canonicalization, GlobalTree/NodeState with parent-scoped rankings, journaled NodeEnsured events, breadcrumbs/entity panel, and item-based navigation—so the app’s core model, not only one UI entrypoint, becomes hierarchical and extensible.
Side B introduces a durable architectural shift from flat subreddit scopes to canonical `ItemId`-based hierarchical nodes, adding `GlobalTree`, breadcrumb navigation, parent-child rankings, canonical URL parsing, and a journal-backed persistence path. By contrast, Side A mainly simplifies the UI by replacing the fragile autocomplete parser with a paste-and-go flow and a much smaller parser, which is a valuable cleanup but narrower in long-term project impact.
comparison · c_509fc5155034 (tommy-mor) vs c_6f04dcb2e38c (tommy-mor)
Side A implements a substantial new feature (fractal ItemId tree, journal worker replacing settlement, breadcrumb navigation, reddit entity scaffolding) with new tests and coherent architecture across many files, delivering real forward-looking capability. Side B is a cleanup commit removing legacy projection code paths in a meta/governance codebase, which is valuable for simplifying maintenance but is narrower in scope and mostly deletes/adjusts existing logic rather than building new lasting functionality.
Commit A replaces flat string scopes with a hierarchical ItemId/GlobalTree model, path canonicalization, journaled tree votes, breadcrumbs, and related UI—foundational product architecture. Commit B mainly deletes legacy GitDiscovery/Emission projection shims so epoch/commit pages read Evidence envelopes only, plus matching test/fixture cleanup; valuable schema hygiene but narrower and largely subtractive.
Side A introduces a substantial architectural shift from flat scope-based rankings to a hierarchical `ItemId`/`GlobalTree` model, adds canonical URL parsing, breadcrumb navigation, node persistence, and a journal worker while updating UI and state handling to support tree-structured rankings. Side B mainly removes legacy compatibility paths and requires evidence-only records in the ledger/UI, simplifying code and tests but primarily deleting fallback behavior rather than adding new core capabilities.
comparison · c_509fc5155034 (tommy-mor) vs c_8c6a5e2e4a54 (tommy-mor)
B ships a coherent, working feature set (cookie-based web login/logout, a generic POST /post handler wired through the existing RPC/ACL pipeline, and room-scoped thread pages reusing a new ThreadNav abstraction) that visibly increases end-user functionality and route coverage. A is a substantial internal refactor (ItemId/tree/journal rename plus reddit-url canonicalization) that is well-tested but mostly repackages existing scope logic without adding end-user-visible capability, and it also includes an unrelated, unpolished plan2.md prose file that adds no code value.
A replaces flat string scopes with a lasting hierarchical domain model (ItemId/GlobalTree/NodeState, path ensure/vote replay, journal worker, breadcrumbs/entity panel), which is core design rather than glue. B restores valuable room/web surfaces (session cookie auth, /r/* views, compose/post), but much of the diff is route/UI wiring plus a large unused plan2.md, so it is less foundational than A’s model change.
Side A introduces a substantive shift from flat string scopes to a canonical hierarchical `ItemId`/`GlobalTree` model, updates vote recording and replay to use that structure, adds path normalization, breadcrumbs, node persistence, and adapts the UI and parser around the new design. Side B mainly reconnects and expands the web UI (cookie-based browser sessions, room routes, posting forms, and routing), which is useful, but it is largely wiring on top of existing capabilities rather than introducing a comparably foundational data model and persistence change.
comparison · c_509fc5155034 (tommy-mor) vs c_effff18688f9 (tommy-mor)
Side B consolidates three duplicated endpoints (/post, /post/check, /post/redact) into the single /ui RPC dispatch path, removing ~350 lines of near-duplicate handler code and unifying session resolution, which is a real architectural simplification with test/fixture updates to match. Side A introduces a large new hierarchical ItemId/tree model (also substantial and well-tested), but it's a bigger, less proven refactor with more speculative surface (breadcrumbs, entity panels, reddit.rs stub) versus B's more contained, verifiably correct consolidation.
Commit A replaces flat string scopes with a hierarchical GlobalTree/ItemId model, path canonicalization, breadcrumbs, journaled votes, and node ensure events—core lasting domain design. Commit B mainly consolidates existing /post* handlers into POST /ui (delete web_post.rs, rewire forms/tests), which cleans the API but mostly relocates behavior without comparable architectural depth.
Side A introduces a substantive new hierarchical data model centered on `ItemId` and `GlobalTree`, migrates voting from flat scope strings to parent-node rankings, adds canonical Reddit URL parsing, breadcrumb navigation, node persistence (`NodeEnsured`), and a journal worker that updates the tree after durable event logging. Side B is primarily a refactor that consolidates existing `/post` endpoints into the `/ui` RPC flow, factors out shared session resolution, and rewires forms and tests; while it reduces duplication and simplifies routing, it mostly reorganizes existing behavior rather than adding comparable long-term functionality.
comparison · c_5e9a63e9d276 (tommy-mor) vs c_509fc5155034 (tommy-mor)
Side A is a focused, well-tested refactor that consolidates path/URL logic into a shared types crate with correct-by-construction newtypes, removing duplicated string-based helpers while preserving behavior (tests carried over and passing). Side B is a much larger, riskier architectural rewrite (scope→fractal-tree, settlement→journal, subreddit-only parser→generic ItemId) that touches many core modules with less certainty of correctness and a vague commit message ('reconfigure'), making it harder to trust as durable, reviewed value versus A's clear, incremental centralization.
B replaces flat string scopes with a real hierarchical domain model (ItemId parent/breadcrumbs, GlobalTree/NodeState, journaled NodeEnsured, tree-scoped votes and UI), which changes how rankings and navigation work permanently. A is a strong hygiene refactor—moving canonicalize_* and CanonicalItemUrl into slug-types and wrapping wire hrefs as GardenItemUrl/ForumThreadUrl—but it mostly relocates and type-wraps existing URL rules without introducing comparable new behavior.
Side A performs a substantial architectural consolidation by moving canonical path normalization and URL construction into a shared `types::paths` module, replacing ad hoc string helpers with typed wrappers (`GardenItemUrl`, `ForumThreadUrl`, `TildeOntologyPath`) throughout the server and API models. This centralizes path identity, reduces duplication, and makes RPC/serialization use correct-by-construction types, whereas Side B is a broad reconfiguration introducing a new tree/journal architecture and UI changes but also many placeholders (e.g. stubbed Reddit fetch), renames, and incomplete infrastructure whose lasting value is less clearly realized in the patch itself.
comparison · c_abd68b5e771a (tommy-mor) vs c_509fc5155034 (tommy-mor)
Commit A is a small, precise, verifiable bugfix that closes a real correctness gap (ghost items/pairs being registered before the zero-ratio guard) and updates the test to assert the corrected behavior. Commit B is a large speculative refactor ('reconfigure') introducing a whole new tree/journal/reddit-import architecture with no tests demonstrating it fixes a real bug, higher risk of regressions, and no clear necessity established beyond feature expansion.
B lands lasting core design: hierarchical ItemId/GlobalTree, path canonicalization, journaled tree votes, and UI (breadcrumbs/entity panel) that replace flat string scopes—foundational product capability. A is a correct, necessary ordering fix (zero-ratio return before ensure_item/voted_pairs) with tight tests, but it is a localized guard versus B’s structural model change.
Side A fixes a real correctness bug by moving the zero-ratio early return before `ensure_item` and `voted_pairs.insert`, preventing ghost items and incorrectly marked voted pairs. It also updates the test to verify that no items, edges, or voted pairs are registered, whereas Side B is a large architectural reconfiguration with broad feature changes but no clearly demonstrated targeted bug fix or validated lasting correctness improvement in the patch itself.