Side B removes a substantial amount of legacy dual-path projection code (GitDiscovery-based fallback rendering) across constitution.py, simplifying the evidence page logic to a single source of truth and updating tests/schema accordingly, which is a meaningful architectural cleanup with lasting maintainability benefit. Side A is a small, well-tested but narrow bugfix (skip pinned Reddit posts) that is useful but far more limited in scope and impact.
constitution · epochs · watch · epoch 3
c_bc8c17a00ed7 (tommy-mor) vs c_6f04dcb2e38c (tommy-mor)
download prompt · raw event · cmp_1422558185bfab
council reasoning
B removes the dual legacy/Evidence code paths (_legacy_commit_row, projected GitDiscovery UI, optional Emission fields) so epoch/commit pages and the schema only trust Evidence envelopes— lasting architectural simplification with matching test updates. A is a correct, well-tested filter for stickied/pinned Reddit children, but it is a narrow import tweak with far less project-wide impact.
Side B removes the legacy GitDiscovery projection path across epoch, commit, and patch views, making the application rely solely on Evidence envelopes, tightening required Emission metadata, and updating integration/tests to match the current schema. Side A is a solid targeted bug fix that skips stickied/pinned Reddit posts during subreddit import and adds regression tests, but its impact is narrower than the project-wide simplification and consistency introduced by Side B.
sides
A — c_bc8c17a00ed7 (tommy-mor)
message
[03cd8f2e] Skip pinned Reddit posts when importing subreddit listings. Co-authored-by: Cursor <cursoragent@cursor.com>
diff preview
diff --git a/server/src/reddit.rs b/server/src/reddit.rs
index f409764c1e1f36216f1b08107043c2eab905694c..fa5577f8ee0a8c53ff4dbec988a90a5d2fc3cdee 100644
--- a/server/src/reddit.rs
+++ b/server/src/reddit.rs
@@ -661,6 +661,7 @@ pub fn map_children_url(id: &ItemId, api_base: &str) -> String {
/// Parse a subreddit listing payload into `(child_id, child_payload)` entries.
/// Each child id is the post's permalink under `reddit.com/…`, and the payload
/// is the raw `{kind, data}` listing element (persisted per child).
+/// Pinned / stickied posts are skipped.
fn parse_children(_parent: &ItemId, payload: &Value) -> Vec<(ItemId, Value)> {
let mut out = Vec::new();
let children = match payload.pointer("/data/children").and_then(|c| c.as_array()) {
@@ -668,6 +669,9 @@ fn parse_children(_parent: &ItemId, payload: &Value) -> Vec<(ItemId, Value)> {
None => return out,
};
for child in children {
+ if child_is_pinned(child) {
+ continue;
+ }
let permalink = match child.pointer("/data/permalink").and_then(|p| p.as_str()) {
Some(p) if !p.is_empty() => p,
_ => continue,
@@ -680,6 +684,15 @@ fn parse_children(_parent: &ItemId, payload: &Value) -> Vec<(ItemId, Value)> {
out
}
+fn child_is_pinned(child: &Value) -> bool {
+ let data = match child.get("data") {
+ Some(d) => d,
+ None => return false,
+ };
+ data.get("stickied").and_then(|v| v.as_bool()) == Some(true)
+ || data.get("pinned").and_then(|v| v.as_bool()) == Some(true)
+}
+
fn parse_reddit_view(id: &ItemId, v: &Value) -> Option<crate::reducer::EntityData> {
let segments: Vec<&str> = id.as_str().split('/').collect();
@@ -853,4 +866,46 @@ mod tests {
Some("http://v3.redgifs.com/watch/impossibleprestigioushedgehog")
);
}
+
+ #[test]
+ fn parse_children_skips_pinned_posts() {
+ let payload = serde_json::json!({
+ "kind": "Listing",
+ "data": {
+ "children": [
+ {
+ "kind": "t3",
+ "data": {
+ "title": "Official rules (pinned)",
+ "permalink": "/r/rust/comments/pin/official_rules/",
+ "stickied": true
+ }
+ },
+ {
+ "kind": "t3",
+ "data": {
+ "title": "Also pinned via pinned field",
+ "permalink": "/r/rust/comments/pin2/also_pinned/",
+ "pinned": true
+ }
+ },
+ {
+ "kind": "t3",
+ "data": {
+ "title": "Normal post",
+ "permalink": "/r/rust/comments/aaa/normal_post/",
+ "stickied": false
+ }
+ }
+ ]
+ }
+ });
+ let parent = ItemId::from_url("https://reddit.com/r/rust").unwrap();
+ let children = parse_children(&parent, &payload);
+ assert_eq!(children.len(), 1);
+ assert_eq!(
+ children[0].0.as_str(),
+ "https://reddit.com/r/rust/comments/aaa"
+ );
+ }
}
B — c_6f04dcb2e38c (tommy-mor)
message
[bda5f8aa] Remove legacy evidence projection; Evidence envelopes only. Epoch and commit pages no longer invent history from bare GitDiscovery rows. Production ledger will be wiped to re-emit under the current schema. Co-authored-by: Cursor <cursoragent@cursor.com>
diff preview
diff --git a/constitution.py b/constitution.py
index 4dd5b9dfbba231d46289c490f91b1dd5b1018bcf..26ba130e885e0e69fb7874ca5c3f07f42100a150 100644
--- a/constitution.py
+++ b/constitution.py
@@ -210,10 +210,10 @@ class Emission:
distributions: dict # author -> amount str
ranking: dict # author -> score str
models_used: list
- discovery_snapshot_id: str = "" # empty only for pre-discovery ledger history
- evidence_schema_version: int = 1
- ranking_run_id: str = ""
- ranking_event_id: str = ""
+ discovery_snapshot_id: str
+ evidence_schema_version: int
+ ranking_run_id: str
+ ranking_event_id: str
@event
@@ -502,26 +502,6 @@ def _epochs_in_ledger() -> list[int]:
return sorted(epochs)
-def _legacy_commit_row(commit_id: str) -> tuple[GitDiscovery | None, dict | None]:
- for discovery in store.read():
- if not isinstance(discovery, GitDiscovery):
- continue
- for commit in discovery.commits:
- if commit_id_for_oid(commit["oid"]) == commit_id:
- return discovery, commit
- return None, None
-
-
-def _legacy_observation(commit_id: str) -> tuple[GitDiscovery | None, dict | None]:
- for discovery in store.read():
- if not isinstance(discovery, GitDiscovery):
- continue
- for obs in discovery.observations:
- if commit_id_for_oid(obs["oid"]) == commit_id:
- return discovery, obs
- return None, None
-
-
def build_pairwise_prompt(side_a: dict, side_b: dict) -> str:
return f"""You are ranking contributions to an open source project.
Compare these two sides (each may be one or more commits). Decide which side contributed more.
@@ -2040,7 +2020,7 @@ def _strip_heavy_fields(obj: dict) -> dict:
@app.get("/api/ledger")
async def get_ledger(offset: int = 0, limit: int = 100, full: int = 0):
- """List of ledger dicts (backward-compatible). Heavy blobs stripped unless full=1."""
+ """List of ledger dicts. Heavy blobs stripped unless full=1."""
limit = max(1, min(limit, 500))
rows = []
for e in store.read()[offset:offset + limit]:
@@ -2274,23 +2254,25 @@ async def epochs_index():
epochs = _epochs_in_ledger()
rows = []
for epoch in epochs:
- discovery = _discovery_for_epoch(epoch)
emission = _emission_for_epoch(epoch)
- evidence_n = sum(
- 1 for e in evidence_by_kind() if e.epoch == epoch
+ evidence_n = sum(1 for e in evidence_by_kind() if e.epoch == epoch)
+ disc = next(
+ (
+ e for e in evidence_by_kind("git.discovery_completed")
+ if e.epoch == epoch
+ ),
+ None,
)
detail = []
- if discovery:
+ if disc:
detail.append(
- f"{len(discovery.commits)} eligible / "
- f"{len(discovery.observations)} observed"
+ f"{disc.payload.get('eligible_count', 0)} eligible / "
+ f"{disc.payload.get('observation_count', 0)} observed"
)
if emission:
detail.append(f"emitted {emission.total_emitted}")
if evidence_n:
detail.append(f"{evidence_n} evidence events")
- elif discovery or emission:
- detail.append("legacy (no Evidence envelopes)")
rows.append(["li",
_a(_evidence_path("epoch", str(epoch)), f"epoch {epoch}"),
" — ",
@@ -2307,37 +2289,37 @@ async def epochs_index():
@app.get("/epochs/{epoch}")
async def epoch_detail(epoch: int):
- discovery = _discovery_for_epoch(epoch)
emission = _emission_for_epoch(epoch)
evidence_rows = [e for e in evidence_by_kind() if e.epoch == epoch]
+ if not evidence_rows and emission is None:
+ return _evidence_page(f"epoch {epoch}", [
+ _evidence_nav(),
+ ["h1", f"epoch {epoch}"],
+ ["p.note", "No evidence for this epoch."],
+ ])
+
commit_evs = [e for e in evidence_rows if e.kind == "git.commit"]
comparison_evs = [e for e in evidence_rows if e.kind == "comparison.input"]
judgment_evs = [e for e in evidence_rows if e.kind == "llm.judgment"]
+ discovery_ev = next(
+ (e for e in evidence_rows if e.kind == "git.discovery_completed"), None
+ )
ranking_started = next(
(e for e in evidence_rows if e.kind == "ranking.started"), None
)
ranking_completed = next(
(e for e in evidence_rows if e.kind == "ranking.completed"), None
)
- legacy = not evidence_rows and (discovery is not None or emission is not None)
-
- commit_links: list[tuple[str, str]] = []
- if commit_evs:
- for e in commit_evs:
- cid = e.payload.get("commit_id") or ""
- label = (
- f"{e.payload.get('oid', cid)[:24]} "
- f"({e.payload.get('contributor', '?')})"
- )
- commit_links.append((label, _evidence_path("commit", cid)))
- elif discovery:
- for c in discovery.commits:
- cid = commit_id_for_oid(c["oid"])
- commit_links.append((
- f"{c['oid'][:24]} ({c.get('contributor', '?')})",
- _evidence_path("commit", cid),
- ))
+ commit_links = [
+ (
+ f"{e.payload.get('oid', e.payload.get('commit_id', ''))[:24]} "
+ f"({e.payload.get('contributor', '?')})",
+ _evidence_path("commit", e.payload["commit_id"]),
+ )
+ for e in commit_evs
+ if e.payload.get("commit_id")
+ ]
comparison_links = [
(
e.payload.get("summary") or e.payload.get("comparison_id", e.event_id),
@@ -2360,16 +2342,13 @@ async def epoch_detail(epoch: int):
]
excluded = []
- if discovery:
- for obs in discovery.observations:
+ if discovery_ev:
+ for obs in discovery_ev.payload.get("observations") or []:
if obs.get("eligible"):
continue
oid = obs.get("oid", "?")
reason = obs.get("exclusion_reason") or "excluded"
- excluded.append(["li",
- f"{oid[:28]} — {reason} — ",
- ["span.note", "legacy evidence unavailable"],
- ])
+ excluded.append(["li", f"{oid[:28]} — {reason}"])
ranking_nodes: list = []
if ranking_completed:
@@ -2388,21 +2367,10 @@ async def epoch_detail(epoch: int):
indent=2, sort_keys=True,
)],
]
- elif emission:
- if legacy and len(emission.ranking or {}) <= 1:
- ranking_nodes.append(["p.note",
- "Single-contributor epoch — no LLM judgments."
- ])
- ranking_nodes.extend([
- ["p", "Projected from Emission (no ranking Evidence event)."],
- ["pre.blob", json.dumps(emission.ranking, indent=2, sort_keys=True)],
- ])
+ elif ranking_started:
+ ranking_nodes = [["p.note", f"Ranking started: {ranking_started.event_id}"]]
else:
- ranking_nodes = [["p.note", "No ranking recorded."]]
- if ranking_started and not ranking_completed:
- ranking_nodes.insert(0, ["p.note",
- f"Ranking started: {ranking_started.event_id}"
- ])
+ ranking_nodes = [["p.note", "No ranking evidence."]]
if emission:
emission_node = _dl_rows([
@@ -2411,44 +2379,41 @@ async def epoch_detail(epoch: int):
("pool_after", emission.pool_after),
("discovery_snapshot_id", emission.discovery_snapshot_id),
("ranking_run_id", emission.ranking_run_id or None),
+ ("ranking_event_id", emission.ranking_event_id or None),
("models_used", ", ".join(emission.models_used or [])),
("distributions", json.dumps(emission.distributions, sort_keys=True)),
])
else:
emission_node = ["p.note", "No emission for this epoch."]
- single_contributor = False
- if discovery:
- single_contributor = len({c.get("contributor") for c in discovery.commits}) <= 1
- elif emission:
- single_contributor = len(emission.ranking or {}) <= 1
+ contributors = {
+ e.payload.get("contributor")
+ for e in commit_evs
+ if e.payload.get("contributor")
+ }
+ no_comparisons_note = "No comparisons."
+ if len(contributors) <= 1:
+ no_comparisons_note += " Single-contributor — no LLM judgments."
body = [
_evidence_nav(),
["div.eyebrow", f"epoch {epoch}"],
["h1", f"epoch {epoch}"],
]
- if legacy:
- body.append(["p.note",
- "Legacy epoch: projected from GitDiscovery/Emission without Evidence "
- "envelopes. Eligible commits use discovery patches; discarded observation "
- "metadata is marked legacy evidence unavailable. Single-contributor "
- "epochs have no LLM judgments."
- ])
- if discovery:
+ if discovery_ev:
body.extend([
["h2", "discovery"],
_dl_rows([
- ("snapshot_id", discovery.snapshot_id),
- ("config_digest", discovery.config_digest),
- ("initial_snapshot", discovery.initial_snapshot),
- ("observations", len(discovery.observations)),
- ("eligible", len(discovery.commits)),
+ ("snapshot_id", discovery_ev.payload.get("snapshot_id")),
+ ("config_digest", discovery_ev.payload.get("config_digest")),
+ ("observations", discovery_ev.payload.get("observation_count")),
+ ("eligible", discovery_ev.payload.get("eligible_count")),
+ ("event", _a(
+ _evidence_path("event", discovery_ev.event_id),
+ discovery_ev.event_id,
+ )),
]),
])
- no_comparisons_note = "No comparisons."
- if single_contributor:
- no_comparisons_note += " Single-contributor — no LLM judgments."
body.extend([
["h2", "commits"],
_link_list(commit_links),
@@ -2471,92 +2436,42 @@ async def epoch_detail(epoch: int):
@app.get("/commits/{commit_id}")
async def commit_detail(commit_id: str):
ev = find_evidence_payload("git.commit", "commit_id", commit_id)
- discovery, legacy_row = (None, None)
if not ev:
- discovery, legacy_row = _legacy_commit_row(commit_id)
- if not ev and not legacy_row:
- discovery, obs = _legacy_observation(commit_id)
- if obs is not None:
- epoch = discovery.epoch if discovery else "?"
- return _evidence_page(f"commit {commit_id[:24]}", [
- _evidence_nav(
- _a(_evidence_path("epoch", str(epoch)), f"epoch {epoch}")
- ),
- ["div.eyebrow", "commit"],
- ["h1", commit_id],
- ["p.note", "legacy evidence unavailable"],
- _dl_rows([
- ("oid", obs.get("oid")),
- ("eligible", obs.get("eligible")),
- ("exclusion_reason", obs.get("exclusion_reason")),
- ("epoch", str(epoch)),
- ]),
- ])
return _evidence_page("commit not found", [
_evidence_nav(),
["h1", "commit not found"],
["p", commit_id],
])
- if ev:
- p = ev.payload
- epoch = ev.epoch
- oid = p.get("oid", "")
- contributor = p.get("contributor", "")
- message = _blob_text(p.get("message"))
- patch = _blob_text(p.get("patch"))
- meta = _dl_rows([
+ p = ev.payload
+ epoch = ev.epoch
+ return _evidence_page(f"commit {commit_id[:24]}", [
+ _evidence_nav(_a(_evidence_path("epoch", str(epoch)), f"epoch {epoch}")),
+ ["div.eyebrow", "commit"],
+ ["h1", commit_id],
+ _dl_rows([
("commit_id", commit
… preview truncated; 7,279 characters omittedHardlinks — judgments / attempts / prompt
judgments
attempts
Prompt text is loaded only by the download route.