Item 8 fix: articles live in web/content (the runtime content root), orphan deleted
The blog showed "Posts coming soon" live: the app reads process.cwd()/content = web/content at runtime (that's where the old orphan lived and rendered), but the 5 articles were committed to REPO-ROOT content/articles — which the deployed app never reads. Moved them to web/content/articles (verified getAllPosts finds all 5 from cwd=web) and deleted the orphan file web/content/blog/line-movement-guide.mdx (the route already 301s). Test paths updated to web/content/articles. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
---
|
||||
title: How VYNDR Grades a Prop
|
||||
slug: how-vyndr-grades-a-prop
|
||||
date: '2026-07-17'
|
||||
excerpt: From the line feed to the letter. What actually happens inside the pipeline, including the part where the model refuses.
|
||||
tags: [methodology, the-read-room]
|
||||
status: published
|
||||
---
|
||||
|
||||
Most grading products are a vibe wearing a letter. Here is what ours actually does.
|
||||
|
||||
## The pipeline, start to finish
|
||||
|
||||
Grades on VYNDR are produced by a scheduled pipeline, several times a day. Nothing is graded on demand, and nothing is graded twice at two different lines without both showing on the record.
|
||||
|
||||
The run starts with the current prop lines from sportsbook feeds — real numbers, captured with a timestamp. For each prop, the system builds a feature vector: recent form (last-5 and last-20 averages, and the variance between them), opponent strength against that exact stat, pace, home or away, rest days, schedule density, batter-versus-pitcher history for MLB, per-90 rates and expected-goals context for soccer.
|
||||
|
||||
Then the engine does the only thing that matters: it compares the model's projection to the posted line. In both directions. The over and the under are graded separately, and the side with more conviction survives. The output is an 11-step letter, F through A+, with a confidence score behind it.
|
||||
|
||||
## What a letter means
|
||||
|
||||
A letter grade is a probabilistic assessment of one side of one line at one moment. An A does not mean the bet wins. It means the gap between our projection and the book's number was wide, in our favor, at the timestamp on the entry.
|
||||
|
||||
The model is wrong regularly. Our public ledger shows exactly how regularly, misses listed by name in the same format as the wins. That is not a disclaimer we were forced to write. It is the design.
|
||||
|
||||
## The part nobody else advertises: refusals
|
||||
|
||||
If the pipeline cannot build a real projection — not enough recent games, no baseline rate, a data source down — the model refuses to grade. No letter renders. The prop shows an absent state, and a free read is not consumed.
|
||||
|
||||
This matters more than it sounds. A grade with nothing behind it still looks like a grade. It would fill the page, and it would be a lie with good typography. So the rule across the whole platform is simple: market numbers are captured, never computed. Model numbers are labeled as model output. Where the data is missing, the surface says less. Absent beats wrong.
|
||||
|
||||
## After the grade
|
||||
|
||||
Every grade is locked to the ledger at the moment it is made — line, odds, timestamp. After the games end, it settles against the real box score. Hit, miss, or push, recorded once. Alongside the result we track closing line value: whether the market moved toward our side or away from it between our timestamp and the close. That number, not the win-loss column, is the standard evidence of real edge.
|
||||
|
||||
And no percentage renders anywhere on VYNDR until at least 20 grades have settled. Below that the surface says RECORD BUILDING, because a percentage on 6 settles is a marketing number, and we do not publish marketing numbers.
|
||||
|
||||
The full methodology lives at vyndr.app/methodology. The record lives at vyndr.app/ledger. Draw your own conclusion.
|
||||
Reference in New Issue
Block a user