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:
+8
-10
@@ -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"
|
||||
|
||||
@@ -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**
|
||||
|
||||
@@ -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.
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user