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:
+36
-26
@@ -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**
|
||||
|
||||
@@ -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`
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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: "Читать далее",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user