comparison · c_ed5070da05a1 (tommy-mor) vs c_f8f31c680ca4 (tommy-mor)
Side A extracts duplicated, panic-prone thread-index logic into well-documented reducer helper methods, fixes a real bug (garden 404 fallback for empty private rooms), and adds substantial regression tests (integration test + browser test) proving correctness after redaction. Side B merely moves a single div element in markup with no functional or test impact, offering negligible lasting value.
A extracts shared thread-index helpers, fixes empty private-room gardens falling back to public content (with an integration test), documents tombstone stability in the reducer, and adds a full browser regression for PostRedact vs chronological indices—plus aligning FeedPost indexing to 0-based. B only relocates an errors div in new-thread HTML, a trivial presentation nit with no lasting design or correctness impact.
Side A introduces reusable reducer helpers for chronological thread indices, fixes multiple call sites to use them consistently, adds guards so empty private room gardens return 404 instead of falling back to public content, documents important reducer invariants, and adds regression/integration tests covering these behaviors. Side B only moves the error container element within the new-thread form markup, a minor UI/layout adjustment with far less lasting impact.
comparison · c_f8f31c680ca4 (tommy-mor) vs c_97611919bf0b (tommy-mor)
Side A is a trivial one-line DOM reorder (moving the errors div), whereas Side B performs a substantial, load-bearing refactor: it removes CanonicalItemUrl entirely in favor of a structural ItemId enum, splits wire normalization into a new item_wire module to avoid cycles, updates the reducer, ranking, RPC, and HTML layers consistently, and updates/extends the test suite accordingly. Side B is riskier but represents real architectural progress toward the stated ItemId/RouteContext migration goal, while Side A contributes negligible lasting value.
B introduces a structural ItemId enum (with parse/parent/display, wire split, and Opaque/Root/Local/Web variants), deletes CanonicalItemUrl, and propagates the type through reducer, ranking, RPC, HTML, and tests—real lasting architecture. A only moves one errors div in new_thread markup (cosmetic DOM order nit with negligible permanence).
Side B performs a substantial architectural refactor by introducing a first-class `ItemId` type, extracting item normalization into `item_wire`, and migrating reducer, ranking, routing, RPC, validation, HTML, and tests away from `CanonicalItemUrl`. This changes the project's core identity model and link-generation APIs with broad, lasting impact, whereas Side A only moves the placement of the `div id=(ERRORS_ID)` within the HTML form without changing functionality.