You are a constitutional council ranking individual git commits for ownership allocation. Compare these two commits. Decide which contributed more lasting value to the project. Judge substance, not spectacle: - Prefer correct, lasting design and real bugfixes over churn, formatting, renames, or generated noise. - Prefer clarity and necessity over sheer line count. A small precise change can beat a large diffuse one. - Do not favor a side merely because its patch is longer or noisier. - Weight what the change does for the project, not the contributor's name. Return ONLY a JSON object: {"winner": "A" or "B", "ratio": "N:M", "explanation": "..."} The explanation must cite concrete differences in the patches (1-3 sentences). Side A — contributor: tommy-mor Side A — commit message: [b5e9bc03] cleaner Side A — unified diff (full patch): diff --git a/server/src/html/forum.rs b/server/src/html/forum.rs index a173e7aea7a81c7cfab5f2f6a5549e0db560fb2b..670f5209c1e172b75156ef1b88ea382c70242062 100644 --- a/server/src/html/forum.rs +++ b/server/src/html/forum.rs @@ -465,41 +465,23 @@ fn new_thread_form_public(show: bool) -> Markup { return html! {}; } html! { - button - type="button" - class="form-toggle" - data-toggle-target="#public-new-thread-compose" - data-open-label="new public thread" - data-close-label="hide new public thread" - aria-expanded="false" - { - "new public thread" - } - section class="compose" id="public-new-thread-compose" hidden { - h3 { "new public thread" } - p class="muted" { "Set thread tag and body. Example: start with a title line or use the CLI-shaped DSL." } + section class="compose" id="public-new-thread-compose" { div id="public-new-thread-errors" {} form id="public-new-thread-form" method="POST" action="/ui" data-check-action="/ui" data-check-rpc=(template_json_compact(&json!({ "action": "check_ingest", "room": "public", "thread_tag": {"$form": "thread_tag"}, "text": {"$form": "text"}, - "error_target": "public-new-thread-errors", - "form_id": "public-new-thread-form", })).unwrap()) { input type="hidden" name=(UI_RPC_FIELD) value=(template_json_compact(&json!({ "action": "post_ingest", "room": "public", "thread_tag": {"$form": "thread_tag"}, "text": {"$form": "text"}, - "error_target": "public-new-thread-errors", - "form_id": "public-new-thread-form", })).unwrap()); - label for="new-thread-tag" { "thread tag" } - input type="text" id="new-thread-tag" name="thread_tag" pattern="[a-z0-9_\\-]{1,64}" placeholder="my-topic"; - label for="new-thread-text" { "text" } - textarea id="new-thread-text" name="text" rows="4" placeholder="#my-topic\n\nYour first post…" {} - p { button type="submit" { "create / post" } } + input type="text" id="new-thread-tag" name="thread_tag" pattern="[a-z0-9_\\-]{1,64}" placeholder="thread-title-slug-here"; + textarea id="new-thread-text" name="text" rows="4" placeholder="Hello threadgoers!! Behold my new thread!" {} + p { button type="submit" { "create thread / make first post" } } } } } Side B — contributor: tommy-mor Side B — commit message: [047b82bd] Remove redundant zero-ratio guard from reducer. Zeros are already rejected at the DSL parser and browser handler; the guard in apply_vote was dead code. The negative clamping stays since add_edge_weight already skips weight-0 edges correctly. Co-Authored-By: Claude Sonnet 4.6 Side B — unified diff (full patch): diff --git a/server/src/reducer.rs b/server/src/reducer.rs index 0e36979abe0f051493038ff7e652efc7f7a0ac80..efbf7f67ff24c7a2989102fe62879b2794a27c5f 100644 --- a/server/src/reducer.rs +++ b/server/src/reducer.rs @@ -112,11 +112,6 @@ impl GroupState { if vote.ratio_right < 0 { vote.ratio_right = 0; } - if vote.ratio_left == 0 || vote.ratio_right == 0 { - // Zero on either side produces no valid edge; drop before registering items or pair. - return; - } - let a_idx = self.ensure_item(&vote.a); let b_idx = self.ensure_item(&vote.b); diff --git a/server/tests/basic.rs b/server/tests/basic.rs index 08159f4a7f0850fd165817a4a1af4f31ced2ad76..1748769ccf7196b2d81cf556d5368c7e723f6a4e 100644 --- a/server/tests/basic.rs +++ b/server/tests/basic.rs @@ -533,7 +533,7 @@ fn dsl_parse_rejects_zero_zero_vote_ratio() { #[test] fn reducer_negative_ratio_clamped_to_zero() { let _state = ReducerState::default(); - // GroupState::apply_vote clamps negatives to 0; when either side is 0 the vote is dropped. + // apply_vote clamps negatives to 0; add_edge_weight skips zero-weight edges. let mut group = GroupState::new(); group.apply_vote(slugsocial_server::reducer::VoteData { ts: 1, @@ -546,10 +546,9 @@ fn reducer_negative_ratio_clamped_to_zero() { delegate: Some("00000000-0000-0000-0000-000000000000:test:local/test".to_string()), thread_tag: "t".to_string(), }); - // Nothing registered: zero-clamped vote is dropped before ensure_item. - assert!(group.idx_to_item.is_empty()); + // Items and pair are registered; edges are absent because weight 0 is skipped. + assert_eq!(group.idx_to_item.len(), 2); assert!(group.edges.is_empty()); - assert!(group.voted_pairs.is_empty()); }