fix(blog): add generator links, sync dates to 2026-05-14

- Add back-to-generators link on EN and RU blog index pages
- Update all 16 blog post dates to 2026-05-14 with staggered times
- Sync EN and RU post dates so matching topics have identical timestamps
This commit is contained in:
emil
2026-05-14 10:32:53 +03:00
parent ea77828094
commit db09f493e9
22 changed files with 130 additions and 66 deletions
+36 -26
View File
@@ -155,9 +155,9 @@
"work_id": "seo-blog-categories-9c7476b9",
"active_plan": "/home/emil/Desktop/Coding/AI/Randify.pro/.sisyphus/plans/seo-blog-categories.md",
"plan_name": "seo-blog-categories",
"status": "active",
"status": "completed",
"started_at": "2026-05-13T23:32:06.345Z",
"updated_at": "2026-05-14T00:24:58.610Z",
"updated_at": "2026-05-14T00:35:49.637Z",
"session_ids": [
"ses_1de6ede59ffexUwt5C0sddEWwR"
],
@@ -169,33 +169,38 @@
"todo:1": {
"task_key": "todo:1",
"task_label": "1",
"task_title": "Fix duplicate JSON keys in 3 generator files",
"session_id": "ses_1dc4ed5ddffe54aNbdrrVGPkpI",
"task_title": "test-post.md — extra 9th EN blog post (scope creep)",
"session_id": "ses_1dc1d5043ffeFR7r3vy15aTFmv",
"agent": "Sisyphus-Junior",
"category": "quick",
"updated_at": "2026-05-13T23:40:09.780Z",
"category": "deep",
"started_at": "2026-05-13T23:36:41.704Z",
"ended_at": "2026-05-14T00:33:08.868Z",
"elapsed_ms": 3387164,
"status": "completed",
"ended_at": "2026-05-13T23:40:09.780Z",
"elapsed_ms": 208076
"updated_at": "2026-05-14T00:33:08.868Z"
},
"todo:7": {
"task_key": "todo:7",
"task_label": "7",
"task_title": "Update generatorSchema.ts with category field",
"session_id": "ses_1dc25691cffe0lapEubAagS3AK",
"agent": "oracle",
"session_id": "ses_1dc1d7618ffeRpk0nnIfvvISQH",
"agent": "Sisyphus-Junior",
"category": "unspecified-high",
"started_at": "2026-05-13T23:42:40.563Z",
"status": "running",
"updated_at": "2026-05-14T00:24:58.611Z"
"status": "completed",
"updated_at": "2026-05-14T00:34:58.498Z",
"ended_at": "2026-05-14T00:34:58.498Z",
"elapsed_ms": 3137935
}
}
},
"ended_at": "2026-05-14T00:35:49.637Z",
"elapsed_ms": 3823292
}
},
"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:24:58.610Z",
"status": "completed",
"updated_at": "2026-05-14T00:35:49.637Z",
"session_ids": [
"ses_1de6ede59ffexUwt5C0sddEWwR"
],
@@ -207,26 +212,31 @@
"todo:1": {
"task_key": "todo:1",
"task_label": "1",
"task_title": "Fix duplicate JSON keys in 3 generator files",
"session_id": "ses_1dc4ed5ddffe54aNbdrrVGPkpI",
"task_title": "test-post.md — extra 9th EN blog post (scope creep)",
"session_id": "ses_1dc1d5043ffeFR7r3vy15aTFmv",
"agent": "Sisyphus-Junior",
"category": "quick",
"updated_at": "2026-05-13T23:40:09.780Z",
"category": "deep",
"started_at": "2026-05-13T23:36:41.704Z",
"ended_at": "2026-05-14T00:33:08.868Z",
"elapsed_ms": 3387164,
"status": "completed",
"ended_at": "2026-05-13T23:40:09.780Z",
"elapsed_ms": 208076
"updated_at": "2026-05-14T00:33:08.868Z"
},
"todo:7": {
"task_key": "todo:7",
"task_label": "7",
"task_title": "Update generatorSchema.ts with category field",
"session_id": "ses_1dc25691cffe0lapEubAagS3AK",
"agent": "oracle",
"session_id": "ses_1dc1d7618ffeRpk0nnIfvvISQH",
"agent": "Sisyphus-Junior",
"category": "unspecified-high",
"started_at": "2026-05-13T23:42:40.563Z",
"status": "running",
"updated_at": "2026-05-14T00:24:58.611Z"
"status": "completed",
"updated_at": "2026-05-14T00:34:58.498Z",
"ended_at": "2026-05-14T00:34:58.498Z",
"elapsed_ms": 3137935
}
},
"agent": "atlas"
"agent": "atlas",
"ended_at": "2026-05-14T00:35:49.637Z",
"elapsed_ms": 3823292
}
@@ -237,5 +237,13 @@ Note: Both missing tasks are verifiable in build output (schema updated → all
- 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).
## Quick Fixes: Blog Back Links + Post Dates (2026-05-14)
- Added `backToGenerators` translation key to both EN (`"← All Generators"`) and RU (`"← Все генераторы"`) objects in `src/i18n/translations.ts`.
- Added back-link `<nav>` to `src/pages/blog/index.astro` (href `/`) and `src/pages/ru/blog/index.astro` (href `/ru/`), styled as `inline-flex` with chevron-left SVG, `text-sm text-zinc-400 hover:text-accent`.
- Updated `pubDate` and `modDate` in all 16 blog posts to `2026-05-14` with staggered times (05:00–12:00) to preserve newest-first sort order.
- EN and RU posts with matching topics share identical timestamps (e.g., both `what-is-cryptographically-secure-randomness` files → `2026-05-14T12:00:00`).
- `npm run build` → 92 pages, 0 errors ✓
### Verdict
**Must Have [12/12] | Must NOT Have [6/6] | Tasks [24/26] | VERDICT: APPROVE**
+8 -8
View File
@@ -459,7 +459,7 @@ Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5)
**Commit**: YES (Wave 1)
- [ ] 7. Update generatorSchema.ts with category field
- [x] 7. Update generatorSchema.ts with category field
**What to do**:
- Add `category` field to `generatorSchema` in `src/lib/generator-schema.ts`
@@ -503,7 +503,7 @@ Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5)
**Commit**: YES (Wave 2)
- [ ] 8. Update all 28 generator JSON files with categories
- [x] 8. Update all 28 generator JSON files with categories
**What to do**:
- Add `"category"` field to ALL 28 files in `src/content/generators/*.json`
@@ -550,7 +550,7 @@ Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5)
**Commit**: YES (Wave 2)
- [ ] 9. Add Organization schema to BaseLayout
- [x] 9. Add Organization schema to BaseLayout
**What to do**:
- Add `Organization` JSON-LD schema to `src/layouts/BaseLayout.astro`
@@ -592,7 +592,7 @@ Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5)
**Commit**: YES (Wave 2)
- [ ] 10. Create custom 404 page
- [x] 10. Create custom 404 page
**What to do**:
- Create `src/pages/404.astro` with BaseLayout, friendly message, link to homepage, link to blog
@@ -1452,19 +1452,19 @@ Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5)
## Final Verification Wave
- [ ] F1. **Plan Compliance Audit** — `oracle`
- [x] F1. **Plan Compliance Audit** — `oracle`
Read the plan end-to-end. For each "Must Have": verify implementation exists (read file, curl endpoint, run command). For each "Must NOT Have": search codebase for forbidden patterns — reject with file:line if found. Check evidence files exist in .sisyphus/evidence/. Compare deliverables against plan.
Output: `Must Have [N/N] | Must NOT Have [N/N] | Tasks [N/N] | VERDICT: APPROVE/REJECT`
- [ ] F2. **Code Quality Review** — `unspecified-high`
- [x] F2. **Code Quality Review** — `unspecified-high`
Run `tsc --noEmit` + `npm run lint` + `npm run test` + `npm run build`. Review all changed files for: `as any`/`@ts-ignore`, empty catches, console.log in prod, commented-out code, unused imports. Check AI slop: excessive comments, over-abstraction, generic names.
Output: `Build [PASS/FAIL] | Lint [PASS/FAIL] | Tests [N pass/N fail] | Files [N clean/N issues] | VERDICT`
- [ ] F3. **Real Manual QA** — `unspecified-high`
- [x] F3. **Real Manual QA** — `unspecified-high`
Start from clean state. Execute EVERY QA scenario from EVERY task — follow exact steps, capture evidence. Test cross-task integration (blog + categories + generators). Test edge cases: empty blog, category with no generators, 404 page. Save to `.sisyphus/evidence/final-qa/`.
Output: `Scenarios [N/N pass] | Integration [N/N] | Edge Cases [N tested] | VERDICT`
- [ ] F4. **Scope Fidelity Check** — `deep`
- [x] F4. **Scope Fidelity Check** — `deep`
For each task: read "What to do", read actual diff (git log/diff). Verify 1:1 — everything in spec was built (no missing), nothing beyond spec was built (no creep). Check "Must NOT do" compliance. Detect cross-task contamination.
Output: `Tasks [N/N compliant] | Contamination [CLEAN/N issues] | Unaccounted [CLEAN/N files] | VERDICT`
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Color Theory: How to Generate Harmonious Palettes"
description: "Learn the basics of color theory and how to create beautiful, harmonious color palettes for your projects."
pubDate: 2025-01-09
modDate: 2025-01-09
pubDate: 2026-05-14T06:00:00
modDate: 2026-05-14T06:00:00
draft: false
lang: en
category: guide
@@ -1,8 +1,8 @@
---
title: "Dice Notation Explained: From d4 to Exploding Dice"
description: "Everything you need to know about dice notation for D&D, Pathfinder, and tabletop RPGs."
pubDate: 2025-01-13
modDate: 2025-01-13
pubDate: 2026-05-14T10:00:00
modDate: 2026-05-14T10:00:00
draft: false
lang: en
category: guide
@@ -1,8 +1,8 @@
---
title: "How to Create Strong Passwords: A Complete Guide"
description: "Master the art of creating unbreakable passwords with our comprehensive guide to password security."
pubDate: 2025-01-14
modDate: 2025-01-14
pubDate: 2026-05-14T11:00:00
modDate: 2026-05-14T11:00:00
draft: false
lang: en
category: guide
@@ -1,8 +1,8 @@
---
title: "The Psychology of Randomness: Why Humans Are Bad at Being Random"
description: "Discover the fascinating psychology behind why humans struggle to generate truly random choices and numbers."
pubDate: 2025-01-12
modDate: 2025-01-12
pubDate: 2026-05-14T09:00:00
modDate: 2026-05-14T09:00:00
draft: false
lang: en
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "How to Use a Random Team Picker for Sports and Events"
description: "Make team selection fair and fun with random team pickers for sports, workshops, and group activities."
pubDate: 2025-01-10
modDate: 2025-01-10
pubDate: 2026-05-14T07:00:00
modDate: 2026-05-14T07:00:00
draft: false
lang: en
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Random Number Generators in Gaming: Fairness and Algorithms"
description: "How RNG works in video games and casinos, and why fairness matters for player trust."
pubDate: 2025-01-11
modDate: 2025-01-11
pubDate: 2026-05-14T08:00:00
modDate: 2026-05-14T08:00:00
draft: false
lang: en
category: guide
@@ -1,8 +1,8 @@
---
title: "UUID vs Sequential IDs: When to Use What"
description: "Compare UUIDs and sequential IDs to choose the right identifier strategy for your application."
pubDate: 2025-01-08
modDate: 2025-01-08
pubDate: 2026-05-14T05:00:00
modDate: 2026-05-14T05:00:00
draft: false
lang: en
category: guide
@@ -1,8 +1,8 @@
---
title: "What is Cryptographically Secure Randomness and Why It Matters"
description: "Learn why cryptographically secure random number generators are essential for passwords, gaming, and security."
pubDate: 2025-01-15
modDate: 2025-01-15
pubDate: 2026-05-14T12:00:00
modDate: 2026-05-14T12:00:00
draft: false
lang: en
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Теория цвета: как создавать гармоничные палитры"
description: "Изучите основы теории цвета и научитесь создавать красивые, гармоничные цветовые палитры для ваших проектов."
pubDate: 2025-01-22
modDate: 2025-01-22
pubDate: 2026-05-14T06:00:00
modDate: 2026-05-14T06:00:00
draft: false
lang: ru
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Нотация кубиков: от d4 до взрывающихся кубиков"
description: "Всё, что нужно знать о нотации кубиков для D&D, Pathfinder и настольных RPG."
pubDate: 2025-01-18
modDate: 2025-01-18
pubDate: 2026-05-14T10:00:00
modDate: 2026-05-14T10:00:00
draft: false
lang: ru
category: guide
@@ -1,8 +1,8 @@
---
title: "Как создавать надёжные пароли: полное руководство"
description: "Освойте искусство создания невзламываемых паролей с нашим подробным руководством по безопасности."
pubDate: 2025-01-17
modDate: 2025-01-17
pubDate: 2026-05-14T11:00:00
modDate: 2026-05-14T11:00:00
draft: false
lang: ru
category: guide
@@ -1,8 +1,8 @@
---
title: "Психология случайности: почему люди плохо справляются со случайностью"
description: "Откройте для себя увлекательную психологию того, почему люди не могут генерировать по-настоящему случайные выборы."
pubDate: 2025-01-19
modDate: 2025-01-19
pubDate: 2026-05-14T09:00:00
modDate: 2026-05-14T09:00:00
draft: false
lang: ru
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Как использовать случайный выбор команд для спорта и мероприятий"
description: "Сделайте выбор команд честным и весёлым с помощью случайных распределений для спорта и групповых активностей."
pubDate: 2025-01-21
modDate: 2025-01-21
pubDate: 2026-05-14T07:00:00
modDate: 2026-05-14T07:00:00
draft: false
lang: ru
category: guide
+2 -2
View File
@@ -1,8 +1,8 @@
---
title: "Генераторы случайных чисел в играх: честность и алгоритмы"
description: "Как работает RNG в видеоиграх и казино, и почему честность важна для доверия игроков."
pubDate: 2025-01-20
modDate: 2025-01-20
pubDate: 2026-05-14T08:00:00
modDate: 2026-05-14T08:00:00
draft: false
lang: ru
category: guide
@@ -1,8 +1,8 @@
---
title: "UUID против последовательных ID: когда что использовать"
description: "Сравните UUID и последовательные идентификаторы, чтобы выбрать правильную стратегию для вашего приложения."
pubDate: 2025-01-23
modDate: 2025-01-23
pubDate: 2026-05-14T05:00:00
modDate: 2026-05-14T05:00:00
draft: false
lang: ru
category: guide
@@ -1,8 +1,8 @@
---
title: "Что такое криптографически стойкая случайность и почему это важно"
description: "Узнайте, почему криптографически стойкие генераторы случайных чисел необходимы для паролей, игр и безопасности."
pubDate: 2025-01-16
modDate: 2025-01-16
pubDate: 2026-05-14T12:00:00
modDate: 2026-05-14T12:00:00
draft: false
lang: ru
category: guide
+2
View File
@@ -69,6 +69,7 @@ export const translations = {
brandLabel: "randify",
backToAll: "All generators",
backToHome: "Back to home",
backToGenerators: "← All Generators",
blog: "Blog",
blogDesc: "Tips, guides, and news about randomness and our generators.",
readMore: "Read more",
@@ -179,6 +180,7 @@ export const translations = {
brandLabel: "randify",
backToAll: "Все генераторы",
backToHome: "Вернуться на главную",
backToGenerators: "← Все генераторы",
blog: "Блог",
blogDesc: "Советы, руководства и новости о случайности и наших генераторах.",
readMore: "Читать далее",
+22
View File
@@ -39,6 +39,28 @@ const blogSchema = {
slot="head"
/>
<div class="max-w-4xl mx-auto px-4 py-12 sm:py-20">
<nav aria-label="Breadcrumb" class="mb-6">
<a
href="/"
class="inline-flex items-center gap-1.5 text-sm text-zinc-400 hover:text-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950 rounded"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
aria-hidden="true"
>
<path d="m15 18-6-6 6-6"></path>
</svg>
{T.backToGenerators}
</a>
</nav>
<header class="mb-12">
<div class="relative flex items-center gap-2 mb-6">
<div
+22
View File
@@ -39,6 +39,28 @@ const blogSchema = {
slot="head"
/>
<div class="max-w-4xl mx-auto px-4 py-12 sm:py-20">
<nav aria-label="Breadcrumb" class="mb-6">
<a
href="/ru/"
class="inline-flex items-center gap-1.5 text-sm text-zinc-400 hover:text-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-zinc-950 rounded"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2.5"
stroke-linecap="round"
stroke-linejoin="round"
aria-hidden="true"
>
<path d="m15 18-6-6 6-6"></path>
</svg>
{T.backToGenerators}
</a>
</nav>
<header class="mb-12">
<div class="relative flex items-center gap-2 mb-6">
<div