diff --git a/content/articles/how-streaks-lie.md b/content/articles/how-streaks-lie.md index 4539276..2503c3a 100644 --- a/content/articles/how-streaks-lie.md +++ b/content/articles/how-streaks-lie.md @@ -1,9 +1,10 @@ --- title: How Streaks Lie slug: how-streaks-lie +date: '2026-07-17' excerpt: Most hot streaks are soft schedules wearing a costume. How to read a streak against what it was built on, the way the VYNDR lens does. tags: [streaks, the-read-room] -status: draft +status: published --- Most hot streaks are soft schedules wearing a costume. diff --git a/content/articles/how-vyndr-grades-a-prop.md b/content/articles/how-vyndr-grades-a-prop.md index beb1010..ba1fc3d 100644 --- a/content/articles/how-vyndr-grades-a-prop.md +++ b/content/articles/how-vyndr-grades-a-prop.md @@ -1,9 +1,10 @@ --- 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: draft +status: published --- Most grading products are a vibe wearing a letter. Here is what ours actually does. diff --git a/content/articles/the-vyndr-originals.md b/content/articles/the-vyndr-originals.md index 6eb118c..e6c7c2f 100644 --- a/content/articles/the-vyndr-originals.md +++ b/content/articles/the-vyndr-originals.md @@ -1,9 +1,10 @@ --- title: "The VYNDR Originals: 41 Archetypes and Why They Exist" slug: the-vyndr-originals +date: '2026-07-17' excerpt: TORCH, BOMBER, GHOST, CONDUCTOR. What the archetype system is, how a player earns one, and why it changes which props you should trust. tags: [archetypes, the-read-room] -status: draft +status: published --- Every player profile on VYNDR carries a word like TORCH or BOMBER. This is not decoration. It is the compressed answer to a question the box score never asks: how does this player produce, and which of his props can you actually trust. diff --git a/content/articles/what-clv-is.md b/content/articles/what-clv-is.md index 99dd284..9f97ebc 100644 --- a/content/articles/what-clv-is.md +++ b/content/articles/what-clv-is.md @@ -1,9 +1,10 @@ --- title: "CLV: The Only Number That Proves an Edge" slug: what-clv-is +date: '2026-07-17' excerpt: Closing line value in plain language. Why beating the close matters more than winning the bet, and how VYNDR captures it on every grade. tags: [clv, methodology, the-read-room] -status: draft +status: published --- You can win a bet with a bad read and lose one with a great read. That is variance, and it is why the win-loss column — the number everyone stares at — is the slowest, noisiest possible way to judge a model. There is a faster, cleaner number. The industry calls it CLV: closing line value. diff --git a/content/articles/why-our-misses-are-public.md b/content/articles/why-our-misses-are-public.md index 0bded94..ed4a6f0 100644 --- a/content/articles/why-our-misses-are-public.md +++ b/content/articles/why-our-misses-are-public.md @@ -1,9 +1,10 @@ --- title: Why Our Misses Are Public slug: why-our-misses-are-public +date: '2026-07-17' excerpt: Every miss stays on the Ledger, by name, in the same format as the wins, permanently. The two reasons, and why nobody else in the industry can copy this. tags: [the-ledger, methodology] -status: draft +status: published --- Open the VYNDR Ledger on any morning and you will find last night's misses listed by name, in the same format, the same placement, and the same energy as the wins. Wilson over 23.5 settled at 19. It is on the record. It stays on the record. diff --git a/web/next.config.ts b/web/next.config.ts index 3d992b8..478716b 100644 --- a/web/next.config.ts +++ b/web/next.config.ts @@ -45,6 +45,14 @@ const nextConfig: NextConfig = { }, poweredByHeader: false, reactStrictMode: true, + async redirects() { + return [ + // Truth-Everywhere Part 2 (item 8) — the backdated 2026-03-22 + // "line-movement-guide" orphan is retired. Any inbound link 301s to the + // real blog index (the 5 committed articles). + { source: '/blog/line-movement-guide', destination: '/blog', permanent: true }, + ]; + }, async headers() { return [ { diff --git a/web/src/app/blog/[slug]/page.tsx b/web/src/app/blog/[slug]/page.tsx index ed6e530..9a3f309 100644 --- a/web/src/app/blog/[slug]/page.tsx +++ b/web/src/app/blog/[slug]/page.tsx @@ -1,4 +1,4 @@ -import { getAllPosts, getPostBySlug } from '@/lib/blog'; +import { getAllPosts, getPostBySlug, renderMarkdown } from '@/lib/blog'; import { notFound } from 'next/navigation'; import type { Metadata } from 'next'; @@ -48,9 +48,10 @@ export default async function BlogPost({ params }: { params: Promise<{ slug: str ))} )} -
- {post.content} -
+