You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A 0.00 hit rate across 2067 alerts with positive hypothetical PnL is impossible under the stated model (PnL = mirroring every alert; if every resolved alert missed, total PnL cannot be positive). Most likely the upstream resolution join produced 0 resolved alerts and 0/0 collapsed to 0. The schema (src/content/statement-schema.ts) happily accepts it — hit_rate: z.number().min(0).max(1).
Today this is fenced only by draft: true + human review. One distracted merge-and-flip and the site headline becomes "hit rate 0.00", which would be a credibility incident for a site whose entire product is credibility.
TDD plan (failing tests first)
Consumer-side cross-field sanity checks, as schema refinements or a separate statement-sanity.ts lint run over all non-draft entries (mirror statements.body.test.ts mechanics):
Tests FIRST for a findDataInconsistencies(data): string[]:
monthly: net_usd !== revenue_usd + opex_usd (mind sign convention — decide whether opex is stored negative; current draft uses 0/0/0 so pick and document) → inconsistent
wallet-level top_wallets[].hypothetical_pnl_usd present on some entries and orders-of-magnitude above bankroll_usd → inconsistent
Wire into a vitest content lint over src/content/statements/*.md for non-draft entries (drafts exempt so upstream PRs can land as drafts and be fixed before flipping).
Keep these out of the Zod schema itself if the cross-repo contract shouldn't narrow (see docs/statement-schema.md protocol); a consumer-side lint avoids a SCHEMA_VERSION discussion while still failing CI at flip-time.
Acceptance criteria
AC
Test
The exact PR #26 frontmatter, with draft: false, fails the lint
unit + content-lint test
Current published statements pass
content-lint green on main
Drafts are exempt
unit test
Follow-ups (not this issue)
Do not flip PR Add weekly statement for 2026-06-09 #26 to draft: false as-is; fix the upstream extractor in poly-track (likely resolved-outcome join) and regenerate. The Tue 14:00 UTC cadence for the Jun 9 weekly is already missed — regenerating beats publishing broken numbers.
Evidence
Open PR #26 (
lp-publish/weekly/2026-06-09-...) carries internally inconsistent data:A 0.00 hit rate across 2067 alerts with positive hypothetical PnL is impossible under the stated model (PnL = mirroring every alert; if every resolved alert missed, total PnL cannot be positive). Most likely the upstream resolution join produced 0 resolved alerts and
0/0collapsed to0. The schema (src/content/statement-schema.ts) happily accepts it —hit_rate: z.number().min(0).max(1).Today this is fenced only by
draft: true+ human review. One distracted merge-and-flip and the site headline becomes "hit rate 0.00", which would be a credibility incident for a site whose entire product is credibility.TDD plan (failing tests first)
Consumer-side cross-field sanity checks, as schema refinements or a separate
statement-sanity.tslint run over all non-draft entries (mirrorstatements.body.test.tsmechanics):findDataInconsistencies(data): string[]:alert_count > 0 && hit_rate === 0 && hypothetical_pnl_usd > 0→ inconsistent (the PR Add weekly statement for 2026-06-09 #26 case)hit_rate > 0 && alert_count === 0→ inconsistentnet_usd !== revenue_usd + opex_usd(mind sign convention — decide whether opex is stored negative; current draft uses 0/0/0 so pick and document) → inconsistenttop_wallets[].hypothetical_pnl_usdpresent on some entries and orders-of-magnitude abovebankroll_usd→ inconsistentsrc/content/statements/*.mdfor non-draft entries (drafts exempt so upstream PRs can land as drafts and be fixed before flipping).docs/statement-schema.mdprotocol); a consumer-side lint avoids a SCHEMA_VERSION discussion while still failing CI at flip-time.Acceptance criteria
draft: false, fails the lintFollow-ups (not this issue)
draft: falseas-is; fix the upstream extractor in poly-track (likely resolved-outcome join) and regenerate. The Tue 14:00 UTC cadence for the Jun 9 weekly is already missed — regenerating beats publishing broken numbers.