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: [0bebe819] Unify kaocha test discovery to one auto-discovered suite. Replace the two hand-enumerated suites (:http-integration, :browser) with a single :all suite that picks up every test.* namespace under test/. New test files now run automatically without touching tests.edn — needed for the test.ranking namespace added alongside the #146 fix, and for any future tests. Both ./TEST.sh and CI (.github/workflows/ci.yml) invoke `clojure -M:kaocha`, so both pick up the new suite without changes. Co-Authored-By: Claude Opus 4.7 (1M context) Side A — unified diff (full patch): diff --git a/tests.edn b/tests.edn index 5e2b0433a66c51806d08ef38d691259cfccd1fe0..e51ffcc81eeae6f41c85d1bfc5ba32f592cc5818 100644 --- a/tests.edn +++ b/tests.edn @@ -1,30 +1,14 @@ #kaocha/v1 -{:tests - [{:id :http-integration - :test-paths ["test"] - :source-paths ["."] - :ns-patterns ["^test\\.integration$" - "^test\\.auth$" - "^test\\.grants$" - "^test\\.invites$" - "^test\\.room-list$"] - :kaocha.filter/skip-meta [:skip] - :parallel? false} - {:id :browser - :test-paths ["test"] - :source-paths ["."] - :ns-patterns ["^test\\.browser-sse$" - "^test\\.browser-ui-morph$" - "^test\\.browser-post-redact$" - "^test\\.browser-room-delete$" - "^test\\.browser-public-garden$" - "^test\\.browser-redact-thread-index$" - "^test\\.browser-garden-pin$" - "^test\\.browser-vote-compare$" - "^test\\.browser-github-resolver$"] - :kaocha.filter/skip-meta [:skip] - :parallel? false}] - :plugins [:kaocha.plugin/junit-xml] - :kaocha.plugin.junit-xml/target-file "target/kaocha-junit.xml" - :kaocha.plugin.junit-xml/add-location-metadata? true - :reporter kaocha.report.progress/report} + {:tests + [{:id :all + :test-paths ["test"] + :source-paths ["."] + ;; Pick up every test.* namespace under test/. New files don't need to be + ;; enumerated here — drop them in test/ with `(ns test.foo …)` and they run. + :ns-patterns ["^test\\..+"] + :kaocha.filter/skip-meta [:skip] + :parallel? false}] + :plugins [:kaocha.plugin/junit-xml] + :kaocha.plugin.junit-xml/target-file "target/kaocha-junit.xml" + :kaocha.plugin.junit-xml/add-location-metadata? true + :reporter kaocha.report.progress/report} 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()); }