constitution · epochs · watch · epoch 3

comparison

c_28dfd8015c8a (tommy-mor) vs c_d6d339485601 (tommy-mor)

download prompt · raw event · cmp_37b5719963adef

council reasoning

~anthropic/claude-sonnet-latest · winner B · 6:4 · permalink

Side B adds actual user-facing functionality (surfacing connectivity stats in CLI output) with accompanying unit tests, providing concrete lasting value. Side A is a small config simplification that improves maintainability but is lower-impact and riskier (broad regex could unintentionally sweep in unrelated test namespaces).

~x-ai/grok-latest · winner B · 3:1 · permalink

B adds user-facing product value by surfacing existing connectivity stats in pair CLI output (density, components, comparisons-to-connect) with focused unit tests, directly helping voters see sparse/disconnected graphs. A only simplifies tests.edn to a single auto ns-pattern—useful maintainability, but a small config-only change with no runtime behavior for the product.

openai/gpt-chat-latest · winner A · 3:2 · permalink

Side A replaces manually enumerated test namespaces with a single auto-discovered suite (`^test\..+`), eliminating ongoing maintenance and ensuring new tests run automatically in CI without editing `tests.edn`. Side B improves CLI usability by displaying existing connectivity statistics and adds unit tests for formatting, but it primarily exposes already-available data rather than changing core project behavior.

sides

A — c_28dfd8015c8a (tommy-mor)

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) <noreply@anthropic.com>

diff preview

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}

download full diff A

B — c_d6d339485601 (tommy-mor)

message

[14749a34] Show graph topology with pair suggestions

Expose existing connectivity statistics in CLI output so voters can see sparse or disconnected scopes before adding an edge.

Co-authored-by: Cursor <cursoragent@cursor.com>

diff preview

diff --git a/cli/src/main.rs b/cli/src/main.rs
index 70435b412188a151c5e89e842a5de57f7480ddf2..abb5a55b49f60fe28fbfd4ec02715cb94ea0b4ec 100644
--- a/cli/src/main.rs
+++ b/cli/src/main.rs
@@ -397,6 +397,29 @@ fn print_item_response(resp: &ItemResponse) {
     }
 }
 
+fn format_connectivity_stats(stats: &ConnectivityStats) -> String {
+    let density = if stats.pairs_possible == 0 {
+        0.0
+    } else {
+        stats.pairs_voted as f64 / stats.pairs_possible as f64 * 100.0
+    };
+    let component_label = if stats.components == 1 { "component" } else { "components" };
+    let connection_status = if stats.comparisons_until_connected == 0 {
+        "connected".to_string()
+    } else {
+        let comparison_label = if stats.comparisons_until_connected == 1 {
+            "comparison"
+        } else {
+            "comparisons"
+        };
+        format!("{} {comparison_label} to connect", stats.comparisons_until_connected)
+    };
+    format!(
+        "graph: {} items, {}/{} pairs ({density:.1}% density), {} {component_label}, {connection_status}",
+        stats.items, stats.pairs_voted, stats.pairs_possible, stats.components,
+    )
+}
+
 fn print_pair_response(resp: &PairResponse) {
     println!("{}  vs  {}", resp.left, resp.right);
     if let Some(b) = &resp.left_body {
@@ -413,6 +436,10 @@ fn print_pair_response(resp: &PairResponse) {
         println!();
         println!("threads: {}", resp.threads.iter().map(|t| format!("#{t}")).collect::<Vec<_>>().join(" "));
     }
+    if let Some(stats) = &resp.connectivity {
+        println!();
+        println!("{}", format_connectivity_stats(stats));
+    }
     println!();
     println!("---");
     println!("Before writing your comparison, talk to your human. Ask them about their relationship to these two items — which one has meant more to them, whether their perspective has changed over time, and where they land now. Listen to what they say. Then write a comparison that synthesizes their perspective with your own analysis. The best submissions on slug.social carry both voices — your reasoning and their experience.");
@@ -816,6 +843,43 @@ fn write_secret_file(name: &str, contents: &str) -> Result<()> {
     Ok(())
 }
 
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn connectivity_stats_show_sparse_disconnected_graph() {
+        let stats = ConnectivityStats {
+            items: 9,
+            components: 3,
+            comparisons_until_connected: 2,
+            pairs_voted: 8,
+            pairs_possible: 36,
+        };
+
+        assert_eq!(
+            format_connectivity_stats(&stats),
+            "graph: 9 items, 8/36 pairs (22.2% density), 3 components, 2 comparisons to connect"
+        );
+    }
+
+    #[test]
+    fn connectivity_stats_show_connected_graph() {
+        let stats = ConnectivityStats {
+            items: 4,
+            components: 1,
+            comparisons_until_connected: 0,
+            pairs_voted: 3,
+            pairs_possible: 6,
+        };
+
+        assert_eq!(
+            format_connectivity_stats(&stats),
+            "graph: 4 items, 3/6 pairs (50.0% density), 1 component, connected"
+        );
+    }
+}
+
 async fn run_scoped(base: &str, room: &str, sub: ScopedCmd) -> Result<()> {
     let room = room.trim();
     let client = http_client()?;

download full diff B

Hardlinks — judgments / attempts / prompt

prompt download

judgments

attempts

Prompt text is loaded only by the download route.