Substantive content (addresses partner Jimmy's 2026-04-27 review of v3.19.1):
Must-fix items (6/6):
- §III-F SSIM/pixel rejection rewritten from first principles (design-level
argument from luminance/contrast/structure local-window product, not the
prior empirical 0.70 result)
- Table VI restructured by population × method; added missing Firm A
logit-Gaussian-2 0.999 row; KDE marked undefined (unimodal), BD/McCrary
marked bin-unstable (Appendix A)
- Tables IX / XI / §IV-F.3 dHash 5/8/15 inconsistency resolved: ≤8 demoted
from "operational dual" to "calibration-fold-adjacent reference"; the
actual classifier rule cos>0.95 AND dH≤15 = 92.46% added throughout
- New Fig. 4 (yearly per-firm best-match cosine, 5 lines, 2013-2023, Firm A
on top); script 30_yearly_big4_comparison.py
- Tables XIV / XV extended with top-20% (94.8%) and top-30% (81.3%) brackets
- §III-K reframed P7.5 from "round-number lower-tail boundary" to operating
point; new Table XII-B (cosine-FAR-capture tradeoff at 5 thresholds:
0.9407 / 0.945 / 0.95 / 0.977 / 0.985)
Nice-to-have items (3/3):
- Table XII expanded to 6-cut classifier sensitivity grid (0.940-0.985)
- Defensive parentheticals (84,386 vs 85,042; 30,226 vs 30,222) moved to
table notes; cut "invite reviewer skepticism" and "non-load-bearing"
Codex 3-pass verification cleanup:
- Stale 0.973/0.977/0.979 references unified on canonical 0.977 (Firm A
Beta-2 forced-fit crossing from beta_mixture_results.json)
- dHash≤8 wording corrected to P95-adjacent (P95 = 9, ≤8 is the integer
immediately below) instead of misleading "rounded down"
- Table XII-B prose corrected: per-segment qualification of "non-Firm-A
capture falls faster" (true on 0.95→0.977 segment but contracts on
0.977→0.985 segment); arithmetic now from exact counts
Within-year analyses removed:
- Within-year ranking robustness check (Class A) was added in nice-to-have
pass but contradicts v3.14 A2-removal stance; removed from §IV-G.2 + the
Appendix B provenance row
- Within-CPA future-work disclosures (Class B) removed from Discussion
limitation #5 and Conclusion future-work paragraph; subsequent limitations
renumbered Sixth → Fifth, Seventh → Sixth
DOCX rendering pipeline overhaul (paper/export_v3.py):
Critical fix - every v3 DOCX since v3.0 was shipping WITHOUT TABLES:
strip_comments() was wholesale-deleting HTML comments, but every numerical
table is wrapped in <!-- TABLE X: ... -->, so the table body was deleted
alongside the wrapper. Now unwraps TABLE comments (emit synthetic
__TABLE_CAPTION__: marker + table body) while still stripping non-TABLE
editorial comments. Result: 19 tables now render in the DOCX.
Other rendering fixes:
- LaTeX → Unicode conversion (50+ token replacements: Greek alphabet, ≤≥,
×·≈, →↔⇒, etc.); \frac/\sqrt linearisation; TeX brace tricks ({=}, {,})
- Math-context-scoped sub/superscript via PUA sentinels (/):
no more underscore-eating in identifiers like signature_analysis
- Display equations rendered via matplotlib mathtext to PNG (3 equations:
cosine sim, mixture crossing, BD/McCrary Z statistic), embedded as
numbered equation blocks (1), (2), (3); content-addressed cache at
paper/equations/ (gitignored, regenerable)
- Manual numbered/bulleted list rendering with hanging indent (replaces
python-docx style="List Number" which silently drops the number prefix
when no numbering definition is bound)
- Markdown blockquote (> ...) defensively stripped
- Pandoc footnote ([^name]) markers no longer leak (inlined at source)
- Heading text cleaned of LaTeX residue + PUA sentinels
- File paths in body text (signature_analysis/X.py, reports/Y.json)
trimmed to "(reproduction artifact in Appendix B)" pointers
New leak linter: paper/lint_paper_v3.py - two-pass markdown source +
rendered DOCX leak detector; auto-runs at end of export_v3.py.
Script changes:
- 21_expanded_validation.py: added 0.9407, 0.977, 0.985 to canonical FAR
threshold list so Table XII-B is reproducible from persisted JSON
- 30_yearly_big4_comparison.py: NEW; generates Fig. 4 + per-firm yearly
data (writes to reports/figures/ and reports/firm_yearly_comparison/)
- 31_within_year_ranking_robustness.py: NEW; supports the within-year
robustness check (no longer cited in paper but kept as repo-internal
due-diligence artifact)
Partner handoff DOCX shipped to
~/Downloads/Paper_A_IEEE_Access_Draft_v3.20.0_20260505.docx (536 KB:
19 tables + 4 figures + 3 equation images).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>