fix(blog): remove test-post.md, fix blog index slug links

- Delete extra test-post.md (scope creep from F4)
- Fix EN blog index: strip 'en/' prefix from post.id in links
- Fix RU blog index: strip 'ru/' prefix from post.id in links
- Fix schema URLs in both blog indices to use clean slugs
This commit is contained in:
emil
2026-05-14 03:28:08 +03:00
parent 25fd24d236
commit ea77828094
6 changed files with 123 additions and 26 deletions
+8 -10
View File
@@ -157,7 +157,7 @@
"plan_name": "seo-blog-categories",
"status": "active",
"started_at": "2026-05-13T23:32:06.345Z",
"updated_at": "2026-05-14T00:06:43.314Z",
"updated_at": "2026-05-14T00:24:58.610Z",
"session_ids": [
"ses_1de6ede59ffexUwt5C0sddEWwR"
],
@@ -183,12 +183,11 @@
"task_key": "todo:7",
"task_label": "7",
"task_title": "Update generatorSchema.ts with category field",
"session_id": "ses_1dc34addfffegfOdNPOQJJYU66",
"agent": "Sisyphus-Junior",
"category": "visual-engineering",
"session_id": "ses_1dc25691cffe0lapEubAagS3AK",
"agent": "oracle",
"started_at": "2026-05-13T23:42:40.563Z",
"status": "running",
"updated_at": "2026-05-14T00:06:43.315Z"
"updated_at": "2026-05-14T00:24:58.611Z"
}
}
}
@@ -196,7 +195,7 @@
"active_plan": "/home/emil/Desktop/Coding/AI/Randify.pro/.sisyphus/plans/seo-blog-categories.md",
"started_at": "2026-05-13T23:32:06.345Z",
"status": "active",
"updated_at": "2026-05-14T00:06:43.314Z",
"updated_at": "2026-05-14T00:24:58.610Z",
"session_ids": [
"ses_1de6ede59ffexUwt5C0sddEWwR"
],
@@ -222,12 +221,11 @@
"task_key": "todo:7",
"task_label": "7",
"task_title": "Update generatorSchema.ts with category field",
"session_id": "ses_1dc34addfffegfOdNPOQJJYU66",
"agent": "Sisyphus-Junior",
"category": "visual-engineering",
"session_id": "ses_1dc25691cffe0lapEubAagS3AK",
"agent": "oracle",
"started_at": "2026-05-13T23:42:40.563Z",
"status": "running",
"updated_at": "2026-05-14T00:06:43.315Z"
"updated_at": "2026-05-14T00:24:58.611Z"
}
},
"agent": "atlas"
+69
View File
@@ -0,0 +1,69 @@
# Final QA Verdict — Wave F3
## Build Status
- 93 pages built, 0 errors
- No Zod validation errors
## Per-Task QA Results
| Task | Description | Status |
|------|-------------|--------|
| 1 | Build passes, no Zod errors | PASS |
| 2 | `<main>` in about/privacy | PASS |
| 3 | Ad block after `<main>` | PASS |
| 4 | `hreflang="x-default"` | PASS |
| 5 | `<xhtml:link>` in sitemap | PASS |
| 6 | OG tags on index + dice | PASS |
| 7 | category field in schema | PASS |
| 8 | All 28 JSONs have category | PASS |
| 9 | Organization schema | PASS |
| 10 | dist/404.html exists | PASS |
| 11 | @astrojs/rss in package.json | PASS |
| 12 | BlogPosting schema in posts | PASS |
| 13 | dist/blog/*/index.html exists (9 EN) | PASS |
| 14 | dist/ru/blog/*/index.html exists (8 RU) | PASS |
| 15 | Blog index pages exist | PASS |
| 16 | RSS feeds exist | PASS |
| 17 | Gaming category has dice content | PASS |
| 18 | Category links on homepage | PASS |
| 19 | `aria-label="Breadcrumb"` | PASS |
| 20 | Related generators on dice | PASS |
| 21 | RelatedPosts on blog pages | PASS |
| 22-23 | 9 EN + 8 RU blog posts | PASS |
| 24 | Blog link in homepage | PASS |
| 25-26 | Breadcrumbs on generator/blog | PASS |
## Integration Tests
| Test | Status |
|------|--------|
| Homepage loads with category pills + generator grid | PASS |
| Category page filters correctly (gaming has dice, no password) | PASS |
| Blog index lists posts | PASS (but links broken — see bugs) |
| Blog post renders with BlogPosting schema | PASS |
| RSS feed contains posts | PASS |
| Prev/next navigation on blog posts | PASS |
| Related posts show on blog pages | PASS |
| Related generators show on generator pages | PASS |
| 404 page renders | PASS |
## Edge Cases
| Test | Status |
|------|--------|
| RU locale on all pages | PASS |
| Empty blog collection | N/A (collection has posts) |
| Category with excluded generators | PASS (gaming=6, security=3, etc.) |
## Bugs Found
### CRITICAL: Blog Index Broken Links
- **EN blog index** links to `/blog/en/<slug>/` but posts exist at `/blog/<slug>/`
- **RU blog index** links to `/ru/blog/ru/<slug>/` but posts exist at `/ru/blog/<slug>/`
- **Impact**: All blog index links are 404s
- **Root cause**: `post.slug` includes locale prefix (e.g. `en/color-theory-palettes`) in the blog collection
- **Isolated to**: Blog index pages only. Individual post prev/next and RelatedPosts links are correct.
## Score
Scenarios 26/26 pass | Integration 8/9 pass | Edge Cases 2/2 tested | VERDICT: CONDITIONAL PASS
@@ -197,3 +197,45 @@
- Body content is 3 paragraphs of placeholder text ("This article will explore... Stay tuned for the full guide.") per instructions.
- Build passes with 85 pages (up from 77), confirming 8 new static blog post pages were generated.
- Existing `test-post.md` remains untouched; total EN blog collection now has 9 posts.
---
## F1 Plan Compliance Audit — $(date -Iseconds)
### Build & Lint
- `npm run build` → 93 pages, 0 errors ✓
- `npm run lint` → 0 errors, 1 pre-existing warning ✓
### Must Have Verification [12/12]
1. **OG + Twitter Card meta tags** — Verified in dist/ (property="og:" present across built pages) ✓
2. **x-default hreflang** — Verified in dist/ (hreflang="x-default" present) ✓
3. **Sitemap with hreflang alternates** — Verified in dist/sitemap-0.xml (`<xhtml:link rel="alternate" hreflang="...">` for all pages) ✓
4. **Blog content collections with Zod schema** — Verified src/content/config.ts (generators + blog collections, strict Zod schema) ✓
5. **RSS feeds EN/RU** — Verified dist/rss.xml and dist/ru/rss.xml (valid RSS 2.0 with `<language>` tags) ✓
6. **5 category pages** — Verified dist/generators/category/{gaming,security,decision-making,creative,utility}/ ✓
7. **Visual breadcrumbs** — Verified aria-label="Breadcrumb" in dist/ generator and blog pages ✓
8. **Related generators** — Verified in dist/generators/dice/index.html and dist/generators/password/index.html ✓
9. **Custom 404 page** — Verified dist/404.html exists ✓
10. **Fixed duplicate JSON keys** — All 28 generator JSON files parse successfully with Python json.load (no duplicate keys) ✓
11. **`<main>` landmarks** — Verified exactly 1 `<main>` on dist/about/index.html, dist/privacy/index.html, and RU mirrors ✓
12. **Blog post templates with correct frontmatter** — Verified 8 EN + 8 RU posts with valid frontmatter matching schema ✓
### Must NOT Have Verification [6/6]
1. **YandexRTB not removed** — Still present in GeneratorLayout.astro and index pages ✓
2. **AdBanner not removed** — File src/components/AdBanner.astro exists (was never referenced in codebase pre-work) ✓
3. **Generator behavior unchanged** — 0 generator component files modified between Wave 1 commit and HEAD ✓
4. **No external SEO tools/services** — No google-analytics, gtag, facebook-pixel, ahrefs, semrush found ✓
5. **No full blog content** — All posts contain placeholder Lorem-style paragraphs only ✓
6. **No dynamic [slug].astro for generators** — No such file in src/pages/generators/ ✓
### Evidence Files [24/26]
Present: task-1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26
Missing: task-7-schema.txt, task-25-related.txt
Note: Both missing tasks are verifiable in build output (schema updated → all 28 JSONs have category; related generators → present on generator pages).
### Minor Observations
- EN blog directory contains 9 files (including test-post.md) vs. 8 specified in plan. Harmless scope creep.
- AdBanner.astro file exists but has never been imported/referenced in the codebase (pre-existing condition, not changed by this work).
### Verdict
**Must Have [12/12] | Must NOT Have [6/6] | Tasks [24/26] | VERDICT: APPROVE**
-12
View File
@@ -1,12 +0,0 @@
---
title: "Test Post"
description: "A test blog post for verification."
pubDate: 2025-01-15
modDate: 2025-01-15
draft: false
lang: en
category: guide
tags: ["test"]
---
This is a test blog post.
+2 -2
View File
@@ -27,7 +27,7 @@ const blogSchema = {
headline: post.data.title,
description: post.data.description,
datePublished: post.data.pubDate.toISOString(),
url: `https://randify.pro/blog/${post.slug}/`,
url: `https://randify.pro/blog/${post.id.replace(/^en\//, "").replace(/\.md$/, "")}/`,
})),
};
---
@@ -69,7 +69,7 @@ const blogSchema = {
{posts.map((post) => (
<li>
<a
href={`/blog/${post.slug}/`}
href={`/blog/${post.id.replace(/^en\//, "").replace(/\.md$/, "")}/`}
class="group block rounded-xl border border-zinc-800/60 bg-zinc-900/40 p-6 hover:border-accent/40 hover:bg-zinc-900/60 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950"
>
<div class="flex flex-wrap items-center gap-2 mb-3">
+2 -2
View File
@@ -27,7 +27,7 @@ const blogSchema = {
headline: post.data.title,
description: post.data.description,
datePublished: post.data.pubDate.toISOString(),
url: `https://randify.pro/ru/blog/${post.slug}/`,
url: `https://randify.pro/ru/blog/${post.id.replace(/^ru\//, "").replace(/\.md$/, "")}/`,
})),
};
---
@@ -69,7 +69,7 @@ const blogSchema = {
{posts.map((post) => (
<li>
<a
href={`/ru/blog/${post.slug}/`}
href={`/ru/blog/${post.id.replace(/^ru\//, "").replace(/\.md$/, "")}/`}
class="group block rounded-xl border border-zinc-800/60 bg-zinc-900/40 p-6 hover:border-accent/40 hover:bg-zinc-900/60 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950"
>
<div class="flex flex-wrap items-center gap-2 mb-3">