Skip to content

feat(delphi): poller-equivalence harness (goal condition 2) — PASSES live on vw + pc-meta-02 - #2657

Draft
jucor wants to merge 1 commit into
spr/edge/9467ac51from
spr/edge/1530cd63
Draft

feat(delphi): poller-equivalence harness (goal condition 2) — PASSES live on vw + pc-meta-02#2657
jucor wants to merge 1 commit into
spr/edge/9467ac51from
spr/edge/1530cd63

Conversation

@jucor

@jucor jucor commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

The GOAL_R1_PARITY.md condition-(2) harness (MATH_POLLER_EQUIV_SPEC.md):
one throwaway Postgres, the REAL Clojure container (clojure -M:run full,
MATH_ENV=clj-ref) and the py MathPollerService (MATH_ENV=py-shadow) fed
identical timed vote batches; written rows compared per batch with the
battery acceptance (StepComparer projection, Q7 subgroup exclusion) plus
a measured clj self-jitter envelope for floats (two independent clj runs;
threshold max(2x envelope, 1e-9); structural divergences never excused);
kill+restart seam mid-schedule; caching_tick MAX+1 per env, math_ticks
monotonic, watermark exactly-once coverage. Guards: NO-COVERAGE (0
aligned batches / ready:false / empty store => FAIL — a vacuous pass is
structurally impossible), fail-fast feeder with runner-log evidence
capture, startup gate closing the Q19 window (see below).

LIVE RESULTS (2026-07-24, stores + verdict JSONs under
real_data/.local/replays/poller_equiv/):

  • vw: verdict MATCH, 8/8 batches, seam after 4, ticks OK, 0
    envelope-excused divergences.
  • pc-meta-02: verdict MATCH, 6/6 batches, seam after 3, moderation
    stream live (146/146 mod events woven, matching clj).

Real bugs found & fixed by the harness arc:

  • py poller pid/tid/zid stringification at ingestion (postgres.py
    poll_votes/poll_votes_since/poll_moderation, service.py str(zid)) —
    native DB ints now flow end-to-end, matching Clojure; the
    poll_moderation fix also prevents a would-be regression (int vote-tids
    vs str mod-tids would silently disable comment moderation).
  • derive_ptptstats wrote conv.participant_info — a DIFFERENT STATISTIC
    from Clojure's prep-ptpt-stats; now the verbatim geometric port
    (repness.clj:383-413: centricness/coreness/extremeness in PCA space,
    columnized per conv_man.clj:79-88, group order via
    clojure_hash_map_key_order).
  • Q19 (CLOJURE_QUIRKS.md): GENUINE Clojure production bug — conv_man.clj
    queue-message-batch! races on new-zid discovery (two conv-actors, one
    orphaned, votes silently lost; reproduced 3x). Harness carve: wait for
    the container's first poll cycle before feeding (test-input sequencing;
    acceptance untouched). Flagged for an upstream fix.
  • Five harness-env findings (clj postgres:// URL regex,
    POLL_FROM_DAYS_AGO long parse, SSL mode, shared-millisecond cut ties
    vs strict > watermarks, per-row insert visibility) — fixed in the
    harness with the clj behaviors documented.

Tests: harness+poller 497 passed; full delphi suite 1134/22/46, zero
failures. Live protocol is opt-in (real services); unit surface covers
every pure decision point.

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

commit-id:1530cd63


Stack:


⚠️ Part of a stack created by spr. Do not merge manually using the UI - doing so may have unexpected results.

This was referenced Jul 24, 2026
…live on vw + pc-meta-02

The GOAL_R1_PARITY.md condition-(2) harness (MATH_POLLER_EQUIV_SPEC.md):
one throwaway Postgres, the REAL Clojure container (clojure -M:run full,
MATH_ENV=clj-ref) and the py MathPollerService (MATH_ENV=py-shadow) fed
identical timed vote batches; written rows compared per batch with the
battery acceptance (StepComparer projection, Q7 subgroup exclusion) plus
a measured clj self-jitter envelope for floats (two independent clj runs;
threshold max(2x envelope, 1e-9); structural divergences never excused);
kill+restart seam mid-schedule; caching_tick MAX+1 per env, math_ticks
monotonic, watermark exactly-once coverage. Guards: NO-COVERAGE (0
aligned batches / ready:false / empty store => FAIL — a vacuous pass is
structurally impossible), fail-fast feeder with runner-log evidence
capture, startup gate closing the Q19 window (see below).

LIVE RESULTS (2026-07-24, stores + verdict JSONs under
real_data/.local/replays/poller_equiv/):
- vw: verdict MATCH, 8/8 batches, seam after 4, ticks OK, 0
  envelope-excused divergences.
- pc-meta-02: verdict MATCH, 6/6 batches, seam after 3, moderation
  stream live (146/146 mod events woven, matching clj).

Real bugs found & fixed by the harness arc:
- py poller pid/tid/zid stringification at ingestion (postgres.py
  poll_votes/poll_votes_since/poll_moderation, service.py str(zid)) —
  native DB ints now flow end-to-end, matching Clojure; the
  poll_moderation fix also prevents a would-be regression (int vote-tids
  vs str mod-tids would silently disable comment moderation).
- derive_ptptstats wrote conv.participant_info — a DIFFERENT STATISTIC
  from Clojure's prep-ptpt-stats; now the verbatim geometric port
  (repness.clj:383-413: centricness/coreness/extremeness in PCA space,
  columnized per conv_man.clj:79-88, group order via
  clojure_hash_map_key_order).
- Q19 (CLOJURE_QUIRKS.md): GENUINE Clojure production bug — conv_man.clj
  queue-message-batch! races on new-zid discovery (two conv-actors, one
  orphaned, votes silently lost; reproduced 3x). Harness carve: wait for
  the container's first poll cycle before feeding (test-input sequencing;
  acceptance untouched). Flagged for an upstream fix.
- Five harness-env findings (clj postgres:// URL regex,
  POLL_FROM_DAYS_AGO long parse, SSL mode, shared-millisecond cut ties
  vs strict > watermarks, per-row insert visibility) — fixed in the
  harness with the clj behaviors documented.

Tests: harness+poller 497 passed; full delphi suite 1134/22/46, zero
failures. Live protocol is opt-in (real services); unit surface covers
every pure decision point.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

commit-id:1530cd63

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants