Skip to content

python-math #2: fix(math): correct comment-extremity sign in pca_project_cmnts (D1b) - #2615

Open
jucor wants to merge 1 commit into
spr/edge/31321c47from
spr/edge/a6494735
Open

python-math #2: fix(math): correct comment-extremity sign in pca_project_cmnts (D1b)#2615
jucor wants to merge 1 commit into
spr/edge/31321c47from
spr/edge/a6494735

Conversation

@jucor

@jucor jucor commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

What was wrong

pca_project_cmnts — the function that projects each comment into the PCA opinion space to measure its extremity — computed coefs = -scale * (1.0 + center), a literal, untranslated copy of the Clojure engine's synthetic vote value -1 (pca.clj:167-178). Clojure stays in the raw-Postgres vote convention (AGREE = -1) throughout, so -1 is correct there. Delphi (the Python math engine) flips votes to its own convention at the Postgres ingress (postgres_vote_to_delphi) and fits PCA on AGREE = +1 data, so the untranslated -1 INVERTS comment extremity: the correct magnitude is scale*|1-center| but the code produced scale*|1+center| (equal only at center == 0). A near-unanimous-AGREE comment (center -> +1) read as maximally extreme (2*scale) instead of ~0; a near-unanimous-DISAGREE comment (center -> -1) read as ~0 instead of maximal.

The fix

coefs = scale * (AGREE - center) with AGREE = +1 (from utils.general) — the faithful Delphi-convention port of Clojure's synthetic-AGREE projection. The docstring is rewritten to document the convention translation.

Testing (TDD, RED -> GREEN)

  • Replaced the tautological test_pca_project_cmnts_formula (it re-derived the implementation's own buggy formula) with one that derives expected values independently from the AGREE constant.
  • Added a behavioral sign test: unanimous-agree -> extremity 0, unanimous-disagree -> maximal.
  • Added an integration test spying on the extremity E reaching priority_metric through _compute_comment_priorities, pinned to hand-derived values 0 and 2*sqrt(2). This works despite the Clojure math.repness: priority-metric meta detection treats 0 as truthy, assigning META_PRIORITY^2 to every comment #2571 mirror (priority_metric deliberately reproduces a Clojure bug by returning META_PRIORITY**2) because the test inspects the argument, not the return value.
  • Added a provenance comment in regression/utils.py: the regression CSVs are pre-flipped to Delphi convention by server/src/report.ts (~line 393, String(-row.vote)), so the regression path must NOT re-flip.

Full delphi suite: 406 passed / 17 skipped / 47 xfailed / 0 failed.

Impact

Output-inert today: priority_metric still returns META_PRIORITY**2 (the #2571 Clojure bug-mirror), so extremity affects no DynamoDB output yet and no golden snapshots move. This is the extremity/PCA-parity groundwork that fix D12 (un-mirroring priority_metric) is blocked on. Distinct from fix D1 (align_pca_signs, which handles temporal ±eigenvector stability).

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

commit-id:a6494735


Stack:


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

@jucor
jucor changed the base branch from spr/edge/31321c47 to edge July 18, 2026 13:27
@jucor
jucor force-pushed the spr/edge/a6494735 branch from c51b742 to 0552910 Compare July 18, 2026 13:28
@jucor
jucor changed the base branch from edge to spr/edge/31321c47 July 18, 2026 13:28
This was referenced Jul 25, 2026
@jucor
jucor force-pushed the spr/edge/31321c47 branch from 66b5323 to 873ee04 Compare July 28, 2026 00:11
@jucor
jucor force-pushed the spr/edge/a6494735 branch from c35986a to 0637380 Compare July 28, 2026 00:12
@jucor jucor changed the title fix(math): correct comment-extremity sign in pca_project_cmnts (D1b) python-math #2: fix(math): correct comment-extremity sign in pca_project_cmnts (D1b) Jul 28, 2026
…ect_cmnts (D1b)

## What was wrong

`pca_project_cmnts` — the function that projects each comment into the PCA opinion space to measure its extremity — computed `coefs = -scale * (1.0 + center)`, a literal, untranslated copy of the Clojure engine's synthetic vote value `-1` (`pca.clj:167-178`). Clojure stays in the raw-Postgres vote convention (AGREE = -1) throughout, so `-1` is correct there. Delphi (the Python math engine) flips votes to its own convention at the Postgres ingress (`postgres_vote_to_delphi`) and fits PCA on AGREE = +1 data, so the untranslated `-1` INVERTS comment extremity: the correct magnitude is `scale*|1-center|` but the code produced `scale*|1+center|` (equal only at `center == 0`). A near-unanimous-AGREE comment (`center -> +1`) read as maximally extreme (`2*scale`) instead of ~0; a near-unanimous-DISAGREE comment (`center -> -1`) read as ~0 instead of maximal.

## The fix

`coefs = scale * (AGREE - center)` with `AGREE = +1` (from `utils.general`) — the faithful Delphi-convention port of Clojure's synthetic-AGREE projection. The docstring is rewritten to document the convention translation.

## Testing (TDD, RED -> GREEN)

- Replaced the tautological `test_pca_project_cmnts_formula` (it re-derived the implementation's own buggy formula) with one that derives expected values independently from the AGREE constant.
- Added a behavioral sign test: unanimous-agree -> extremity 0, unanimous-disagree -> maximal.
- Added an integration test spying on the extremity `E` reaching `priority_metric` through `_compute_comment_priorities`, pinned to hand-derived values 0 and `2*sqrt(2)`. This works despite the #2571 mirror (`priority_metric` deliberately reproduces a Clojure bug by returning `META_PRIORITY**2`) because the test inspects the argument, not the return value.
- Added a provenance comment in `regression/utils.py`: the regression CSVs are pre-flipped to Delphi convention by `server/src/report.ts` (~line 393, `String(-row.vote)`), so the regression path must NOT re-flip.

Full delphi suite: 406 passed / 17 skipped / 47 xfailed / 0 failed.

## Impact

Output-inert today: `priority_metric` still returns `META_PRIORITY**2` (the #2571 Clojure bug-mirror), so extremity affects no DynamoDB output yet and no golden snapshots move. This is the extremity/PCA-parity groundwork that fix D12 (un-mirroring `priority_metric`) is blocked on. Distinct from fix D1 (`align_pca_signs`, which handles temporal ±eigenvector stability).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

commit-id:a6494735
@jucor
jucor force-pushed the spr/edge/a6494735 branch from 0637380 to a566884 Compare July 28, 2026 01:10
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