diff --git a/.sisyphus/boulder.json b/.sisyphus/boulder.json index aed56da..357c6ba 100644 --- a/.sisyphus/boulder.json +++ b/.sisyphus/boulder.json @@ -1,6 +1,6 @@ { "schema_version": 2, - "active_work_id": "critical-refactor-f063daf0", + "active_work_id": "seo-blog-categories-9c7476b9", "works": { "critical-refactor-f063daf0": { "work_id": "critical-refactor-f063daf0", @@ -150,152 +150,59 @@ }, "ended_at": "2026-05-13T18:03:08.059Z", "elapsed_ms": 5868793 + }, + "seo-blog-categories-9c7476b9": { + "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", + "started_at": "2026-05-13T23:32:06.345Z", + "updated_at": "2026-05-13T23:36:41.704Z", + "session_ids": [ + "ses_1de6ede59ffexUwt5C0sddEWwR" + ], + "session_origins": { + "ses_1de6ede59ffexUwt5C0sddEWwR": "direct" + }, + "agent": "atlas", + "task_sessions": { + "todo:1": { + "task_key": "todo:1", + "task_label": "1", + "task_title": "Fix duplicate JSON keys in 3 generator files", + "session_id": "ses_1dc4ed5ddffe54aNbdrrVGPkpI", + "agent": "Sisyphus-Junior", + "category": "quick", + "updated_at": "2026-05-13T23:36:41.704Z", + "started_at": "2026-05-13T23:36:41.704Z", + "status": "running" + } + } } }, - "active_plan": "/home/emil/Desktop/Coding/AI/Randify.pro/.sisyphus/plans/critical-refactor.md", - "started_at": "2026-05-13T16:25:19.266Z", - "status": "completed", - "updated_at": "2026-05-13T18:03:08.059Z", + "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-13T23:36:41.704Z", "session_ids": [ "ses_1de6ede59ffexUwt5C0sddEWwR" ], "session_origins": { "ses_1de6ede59ffexUwt5C0sddEWwR": "direct" }, - "plan_name": "critical-refactor", + "plan_name": "seo-blog-categories", "task_sessions": { "todo:1": { "task_key": "todo:1", "task_label": "1", - "task_title": "Add missing dependencies to package.json", - "session_id": "ses_1ddd57501ffeO4NlJDKb2pwLz2", + "task_title": "Fix duplicate JSON keys in 3 generator files", + "session_id": "ses_1dc4ed5ddffe54aNbdrrVGPkpI", "agent": "Sisyphus-Junior", - "category": "writing", - "started_at": "2026-05-13T16:27:48.876Z", - "status": "completed", - "updated_at": "2026-05-13T16:33:52.668Z", - "ended_at": "2026-05-13T16:33:52.668Z", - "elapsed_ms": 363792 - }, - "todo:4": { - "task_key": "todo:4", - "task_label": "4", - "task_title": "Create ResultBox.astro shared component", - "session_id": "ses_1ddce8961ffeoaXaB2Rxgt684X", - "agent": "Sisyphus-Junior", - "category": "visual-engineering", - "updated_at": "2026-05-13T16:42:05.595Z", - "started_at": "2026-05-13T16:40:57.448Z", - "status": "completed", - "ended_at": "2026-05-13T16:42:05.595Z", - "elapsed_ms": 68147 - }, - "todo:6": { - "task_key": "todo:6", - "task_label": "6", - "task_title": "Refactor CardGenerator.astro", - "session_id": "ses_1ddc76889ffe240ehScl9taAza", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T16:47:10.433Z", - "started_at": "2026-05-13T16:44:57.812Z", - "status": "completed", - "ended_at": "2026-05-13T16:47:10.433Z", - "elapsed_ms": 132621 - }, - "todo:10": { - "task_key": "todo:10", - "task_label": "10", - "task_title": "Refactor DateGenerator.astro", - "session_id": "ses_1ddc380cbffe0YA1da3ew6QlNf", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T17:16:10.363Z", - "started_at": "2026-05-13T16:49:43.859Z", - "status": "completed", - "ended_at": "2026-05-13T17:16:10.363Z", - "elapsed_ms": 1586504 - }, - "todo:13": { - "task_key": "todo:13", - "task_label": "13", - "task_title": "Refactor GradientGenerator.astro", - "session_id": "ses_1dda85f21ffeEGeOWrbqmWAk02", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T17:22:16.123Z", - "started_at": "2026-05-13T17:19:45.020Z", - "status": "completed", - "ended_at": "2026-05-13T17:22:16.123Z", - "elapsed_ms": 151103 - }, - "todo:17": { - "task_key": "todo:17", - "task_label": "17", - "task_title": "Refactor LoremGenerator.astro", - "session_id": "ses_1dda37bf2ffexATCZ3W4Z6EDu1", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T17:25:32.173Z", - "started_at": "2026-05-13T17:25:11.269Z", - "status": "completed", - "ended_at": "2026-05-13T17:25:32.173Z", - "elapsed_ms": 20904 - }, - "todo:20": { - "task_key": "todo:20", - "task_label": "20", - "task_title": "Refactor MealGenerator.astro", - "session_id": "ses_1dda01e38ffeVc6AUwAlt7lQXl", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T17:31:02.031Z", - "started_at": "2026-05-13T17:30:26.005Z", - "status": "completed", - "ended_at": "2026-05-13T17:31:02.031Z", - "elapsed_ms": 36026 - }, - "todo:24": { - "task_key": "todo:24", - "task_label": "24", - "task_title": "Refactor PasswordGenerator.astro", - "session_id": "ses_1dd9b7bb1ffez3Q0aayg7PZUIF", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "updated_at": "2026-05-13T17:34:08.166Z", - "started_at": "2026-05-13T17:32:34.652Z", - "status": "completed", - "ended_at": "2026-05-13T17:34:08.166Z", - "elapsed_ms": 93514 - }, - "todo:27": { - "task_key": "todo:27", - "task_label": "27", - "task_title": "Refactor TeamsGenerator.astro", - "session_id": "ses_1dd94b493ffemX2z2dEFdh8W7R", - "agent": "Sisyphus-Junior", - "category": "unspecified-high", - "started_at": "2026-05-13T17:37:23.881Z", - "status": "completed", - "updated_at": "2026-05-13T17:41:13.262Z", - "ended_at": "2026-05-13T17:41:13.262Z", - "elapsed_ms": 229381 - }, - "final-wave:f1": { - "task_key": "final-wave:f1", - "task_label": "F1", - "task_title": "**Plan Compliance Audit** — `oracle`", - "session_id": "ses_1dd81d9e1ffeclA0rP510AXfNB", - "agent": "Sisyphus-Junior", - "category": "deep", - "started_at": "2026-05-13T17:47:58.486Z", - "status": "completed", - "updated_at": "2026-05-13T18:02:13.341Z", - "ended_at": "2026-05-13T18:02:13.341Z", - "elapsed_ms": 854855 + "category": "quick", + "updated_at": "2026-05-13T23:36:41.704Z", + "started_at": "2026-05-13T23:36:41.704Z", + "status": "running" } }, - "agent": "atlas", - "ended_at": "2026-05-13T18:03:08.059Z", - "elapsed_ms": 5868793 + "agent": "atlas" } \ No newline at end of file diff --git a/.sisyphus/evidence/task-1-build.txt b/.sisyphus/evidence/task-1-build.txt new file mode 100644 index 0000000..f39447f --- /dev/null +++ b/.sisyphus/evidence/task-1-build.txt @@ -0,0 +1,185 @@ + +> randify@0.0.1 build +> astro build + +02:36:15 [types] Generated 342ms +02:36:15 [build] output: "static" +02:36:15 [build] directory: /home/emil/Desktop/Coding/AI/Randify.pro/dist/ +02:36:15 [build] Collecting build info... +02:36:15 [build] ✓ Completed in 368ms. +02:36:15 [build] Building static entrypoints... +02:36:17 [vite] ✓ built in 2.10s +02:36:17 [build] ✓ Completed in 2.15s. + + building client (vite) +02:36:17 [vite] transforming... +02:36:17 [vite] ✓ 71 modules transformed. +02:36:17 [vite] rendering chunks... +02:36:17 [vite] computing gzip size... +02:36:17 [vite] dist/_astro/hoisted.BKKrxAht.js 0.16 kB │ gzip: 0.15 kB +02:36:17 [vite] dist/_astro/animations.JKmio82t.js 0.19 kB │ gzip: 0.13 kB +02:36:17 [vite] dist/_astro/validation.plcuGzaj.js 0.20 kB │ gzip: 0.16 kB +02:36:17 [vite] dist/_astro/clipboard.v9BZgIeL.js 0.43 kB │ gzip: 0.22 kB +02:36:17 [vite] dist/_astro/random.PhfdigkC.js 0.50 kB │ gzip: 0.31 kB +02:36:17 [vite] dist/_astro/hoisted.B5m2ZYh6.js 0.90 kB │ gzip: 0.56 kB +02:36:17 [vite] dist/_astro/hoisted.CdG8uTdI.js 1.23 kB │ gzip: 0.61 kB +02:36:17 [vite] dist/_astro/hoisted.CT9HX5_Y.js 1.38 kB │ gzip: 0.72 kB +02:36:17 [vite] dist/_astro/hoisted.Cb7Tv2oN.js 1.48 kB │ gzip: 0.83 kB +02:36:17 [vite] dist/_astro/hoisted.D82rtlIG.js 1.54 kB │ gzip: 0.84 kB +02:36:17 [vite] dist/_astro/hoisted.uArMeWBD.js 1.63 kB │ gzip: 0.81 kB +02:36:17 [vite] dist/_astro/hoisted.CwDo-_-Z.js 1.64 kB │ gzip: 0.73 kB +02:36:17 [vite] dist/_astro/hoisted.j6ibv0wb.js 1.65 kB │ gzip: 0.81 kB +02:36:17 [vite] dist/_astro/hoisted.BEwWV8JC.js 1.73 kB │ gzip: 0.90 kB +02:36:17 [vite] dist/_astro/hoisted.6rLeMLDm.js 1.74 kB │ gzip: 0.86 kB +02:36:17 [vite] dist/_astro/hoisted.DOtqogeQ.js 1.76 kB │ gzip: 0.99 kB +02:36:17 [vite] dist/_astro/hoisted.CHG7AXVP.js 1.89 kB │ gzip: 1.05 kB +02:36:17 [vite] dist/_astro/hoisted.DnGtBYme.js 1.99 kB │ gzip: 0.95 kB +02:36:17 [vite] dist/_astro/hoisted.hrxZZFEF.js 2.19 kB │ gzip: 1.07 kB +02:36:17 [vite] dist/_astro/hoisted.CjZD7f2g.js 2.33 kB │ gzip: 1.15 kB +02:36:17 [vite] dist/_astro/hoisted.qLZXl1Do.js 2.88 kB │ gzip: 1.70 kB +02:36:17 [vite] dist/_astro/hoisted.BKosNXxl.js 2.91 kB │ gzip: 1.41 kB +02:36:17 [vite] dist/_astro/hoisted.CpSL7HYx.js 3.94 kB │ gzip: 1.95 kB +02:36:17 [vite] dist/_astro/hoisted.DmqdUAAB.js 4.10 kB │ gzip: 1.70 kB +02:36:17 [vite] dist/_astro/hoisted.COsV1Syq.js 4.30 kB │ gzip: 1.96 kB +02:36:17 [vite] dist/_astro/hoisted.Ftg8tUcf.js 4.53 kB │ gzip: 1.97 kB +02:36:17 [vite] dist/_astro/hoisted.3XDY-7Px.js 4.79 kB │ gzip: 1.97 kB +02:36:17 [vite] dist/_astro/hoisted.mRfAHLMS.js 5.27 kB │ gzip: 2.20 kB +02:36:17 [vite] dist/_astro/hoisted.B7vaoHN9.js 7.19 kB │ gzip: 2.54 kB +02:36:17 [vite] dist/_astro/hoisted.DU8tsC8l.js 9.71 kB │ gzip: 3.84 kB +02:36:17 [vite] dist/_astro/i18n.DYCg5-VL.js 10.76 kB │ gzip: 5.53 kB +02:36:17 [vite] dist/_astro/hoisted.ChvQAxmv.js 10.92 kB │ gzip: 3.89 kB +02:36:17 [vite] dist/_astro/hoisted.DdCnpAKh.js 11.83 kB │ gzip: 2.76 kB +02:36:17 [vite] dist/_astro/hoisted.CvjQ9xHL.js 35.55 kB │ gzip: 17.46 kB +02:36:17 [vite] dist/_astro/hoisted.Bdx021zL.js 45.26 kB │ gzip: 14.58 kB +02:36:17 [vite] ✓ built in 438ms + + generating static routes +02:36:18 ▶ src/pages/about.astro +02:36:18 └─ /about/index.html (+11ms) +02:36:18 ▶ src/pages/generators/cards.astro +02:36:18 └─ /generators/cards/index.html (+6ms) +02:36:18 ▶ src/pages/generators/coin.astro +02:36:18 └─ /generators/coin/index.html (+4ms) +02:36:18 ▶ src/pages/generators/colors.astro +02:36:18 └─ /generators/colors/index.html (+3ms) +02:36:18 ▶ src/pages/generators/country.astro +02:36:18 └─ /generators/country/index.html (+4ms) +02:36:18 ▶ src/pages/generators/date.astro +02:36:18 └─ /generators/date/index.html (+2ms) +02:36:18 ▶ src/pages/generators/dice.astro +02:36:18 └─ /generators/dice/index.html (+3ms) +02:36:18 ▶ src/pages/generators/emoji.astro +02:36:18 └─ /generators/emoji/index.html (+3ms) +02:36:18 ▶ src/pages/generators/fontpair.astro +02:36:18 └─ /generators/fontpair/index.html (+3ms) +02:36:18 ▶ src/pages/generators/gradient.astro +02:36:18 └─ /generators/gradient/index.html (+2ms) +02:36:18 ▶ src/pages/generators/hash.astro +02:36:18 └─ /generators/hash/index.html (+2ms) +02:36:18 ▶ src/pages/generators/letter.astro +02:36:18 └─ /generators/letter/index.html (+2ms) +02:36:18 ▶ src/pages/generators/list.astro +02:36:18 └─ /generators/list/index.html (+2ms) +02:36:18 ▶ src/pages/generators/lorem.astro +02:36:18 └─ /generators/lorem/index.html (+2ms) +02:36:18 ▶ src/pages/generators/lottery.astro +02:36:18 └─ /generators/lottery/index.html (+2ms) +02:36:18 ▶ src/pages/generators/magic8ball.astro +02:36:18 └─ /generators/magic8ball/index.html (+2ms) +02:36:18 ▶ src/pages/generators/meal.astro +02:36:18 └─ /generators/meal/index.html (+2ms) +02:36:18 ▶ src/pages/generators/names.astro +02:36:18 └─ /generators/names/index.html (+3ms) +02:36:18 ▶ src/pages/generators/numbers.astro +02:36:18 └─ /generators/numbers/index.html (+2ms) +02:36:18 ▶ src/pages/generators/palette.astro +02:36:18 └─ /generators/palette/index.html (+2ms) +02:36:18 ▶ src/pages/generators/password.astro +02:36:18 └─ /generators/password/index.html (+2ms) +02:36:18 ▶ src/pages/generators/rps.astro +02:36:18 └─ /generators/rps/index.html (+2ms) +02:36:18 ▶ src/pages/generators/shuffler.astro +02:36:18 └─ /generators/shuffler/index.html (+2ms) +02:36:18 ▶ src/pages/generators/teams.astro +02:36:18 └─ /generators/teams/index.html (+2ms) +02:36:18 ▶ src/pages/generators/time.astro +02:36:18 └─ /generators/time/index.html (+2ms) +02:36:18 ▶ src/pages/generators/uuid.astro +02:36:18 └─ /generators/uuid/index.html (+2ms) +02:36:18 ▶ src/pages/generators/weighted.astro +02:36:18 └─ /generators/weighted/index.html (+2ms) +02:36:18 ▶ src/pages/generators/wheel.astro +02:36:18 └─ /generators/wheel/index.html (+2ms) +02:36:18 ▶ src/pages/generators/yesno.astro +02:36:18 └─ /generators/yesno/index.html (+2ms) +02:36:18 ▶ src/pages/privacy.astro +02:36:18 └─ /privacy/index.html (+2ms) +02:36:18 ▶ src/pages/ru/about.astro +02:36:18 └─ /ru/about/index.html (+3ms) +02:36:18 ▶ src/pages/ru/generators/cards.astro +02:36:18 └─ /ru/generators/cards/index.html (+3ms) +02:36:18 ▶ src/pages/ru/generators/coin.astro +02:36:18 └─ /ru/generators/coin/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/colors.astro +02:36:18 └─ /ru/generators/colors/index.html (+3ms) +02:36:18 ▶ src/pages/ru/generators/country.astro +02:36:18 └─ /ru/generators/country/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/date.astro +02:36:18 └─ /ru/generators/date/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/dice.astro +02:36:18 └─ /ru/generators/dice/index.html (+3ms) +02:36:18 ▶ src/pages/ru/generators/emoji.astro +02:36:18 └─ /ru/generators/emoji/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/fontpair.astro +02:36:18 └─ /ru/generators/fontpair/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/gradient.astro +02:36:18 └─ /ru/generators/gradient/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/hash.astro +02:36:18 └─ /ru/generators/hash/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/letter.astro +02:36:18 └─ /ru/generators/letter/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/list.astro +02:36:18 └─ /ru/generators/list/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/lorem.astro +02:36:18 └─ /ru/generators/lorem/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/lottery.astro +02:36:18 └─ /ru/generators/lottery/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/magic8ball.astro +02:36:18 └─ /ru/generators/magic8ball/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/meal.astro +02:36:18 └─ /ru/generators/meal/index.html (+3ms) +02:36:18 ▶ src/pages/ru/generators/names.astro +02:36:18 └─ /ru/generators/names/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/numbers.astro +02:36:18 └─ /ru/generators/numbers/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/palette.astro +02:36:18 └─ /ru/generators/palette/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/password.astro +02:36:18 └─ /ru/generators/password/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/rps.astro +02:36:18 └─ /ru/generators/rps/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/shuffler.astro +02:36:18 └─ /ru/generators/shuffler/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/teams.astro +02:36:18 └─ /ru/generators/teams/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/time.astro +02:36:18 └─ /ru/generators/time/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/uuid.astro +02:36:18 └─ /ru/generators/uuid/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/weighted.astro +02:36:18 └─ /ru/generators/weighted/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/wheel.astro +02:36:18 └─ /ru/generators/wheel/index.html (+2ms) +02:36:18 ▶ src/pages/ru/generators/yesno.astro +02:36:18 └─ /ru/generators/yesno/index.html (+2ms) +02:36:18 ▶ src/pages/ru/privacy.astro +02:36:18 └─ /ru/privacy/index.html (+2ms) +02:36:18 ▶ src/pages/ru/index.astro +02:36:18 └─ /ru/index.html (+4ms) +02:36:18 ▶ src/pages/index.astro +02:36:18 └─ /index.html (+3ms) +02:36:18 ✓ Completed in 381ms. + +02:36:18 [@astrojs/sitemap] `sitemap-index.xml` created at `dist` +02:36:18 [build] 62 page(s) built in 3.40s +02:36:18 [build] Complete! diff --git a/.sisyphus/evidence/task-2-main.txt b/.sisyphus/evidence/task-2-main.txt new file mode 100644 index 0000000..bdfdece --- /dev/null +++ b/.sisyphus/evidence/task-2-main.txt @@ -0,0 +1,16 @@ +Task: Fix
landmarks on about/privacy pages + +Files modified: +- src/pages/about.astro +- src/pages/ru/about.astro +- src/pages/privacy.astro +- src/pages/ru/privacy.astro + +Verification: +- npm run lint: 0 errors +- npm run build: success +- grep dist for
on about/privacy pages: all 4 files contain
tag + +Pattern applied: +- Breadcrumb nav and page header remain outside
+- Content sections wrapped in
following GeneratorLayout.astro pattern diff --git a/.sisyphus/evidence/task-3-ad.txt b/.sisyphus/evidence/task-3-ad.txt new file mode 100644 index 0000000..0ac7a36 --- /dev/null +++ b/.sisyphus/evidence/task-3-ad.txt @@ -0,0 +1,8 @@ +TASK: Fix ad placement on homepage +FILE: src/pages/index.astro +CHANGE: Moved from before
to after
+BUILD: PASS (npm run build exited 0) +VERIFICATION: + - dist/index.html:
at byte 43284 + - dist/index.html: yandex_rtb at byte 43335 + - Order correct: True (main content before ad block) diff --git a/.sisyphus/evidence/task-4-hreflang.txt b/.sisyphus/evidence/task-4-hreflang.txt new file mode 100644 index 0000000..dc5b24e --- /dev/null +++ b/.sisyphus/evidence/task-4-hreflang.txt @@ -0,0 +1,11 @@ +Task: Add x-default hreflang to BaseLayout +Date: 2026-05-14 + +Verification: +- npm run build: PASS (62 pages built) +- grep dist/index.html for x-default: FOUND + +- grep dist/generators/dice/index.html for x-default: FOUND +- grep all dist/*.html for x-default: 62 matches across 62 files + +All pages now include x-default hreflang fallback pointing to the English version. diff --git a/.sisyphus/evidence/task-5-sitemap.txt b/.sisyphus/evidence/task-5-sitemap.txt new file mode 100644 index 0000000..d61750e --- /dev/null +++ b/.sisyphus/evidence/task-5-sitemap.txt @@ -0,0 +1,13 @@ +# Task 5 Evidence: Sitemap i18n Config + +## Build Status +PASS + +## Verification +File: dist/sitemap-0.xml +Contains and entries for all bilingual pages. + +## Sample Entries +- https://randify.pro/ -> en-US + ru-RU +- https://randify.pro/about/ -> en-US + ru-RU +- https://randify.pro/generators/coin/ -> en-US + ru-RU diff --git a/.sisyphus/evidence/task-6-og.txt b/.sisyphus/evidence/task-6-og.txt new file mode 100644 index 0000000..fcd9243 --- /dev/null +++ b/.sisyphus/evidence/task-6-og.txt @@ -0,0 +1,31 @@ +Evidence: Open Graph and Twitter Card meta tags added successfully. + +Build status: PASS (npm run build completed with exit 0) + +--- dist/index.html --- + + + + + + + + + + + + +--- dist/generators/dice/index.html --- + + + + + + + + + + + + +All required tags present on both pages. diff --git a/.sisyphus/notepads/seo-blog-categories/learnings.md b/.sisyphus/notepads/seo-blog-categories/learnings.md new file mode 100644 index 0000000..2a1d033 --- /dev/null +++ b/.sisyphus/notepads/seo-blog-categories/learnings.md @@ -0,0 +1,10 @@ +## Task 6: Open Graph + Twitter Card Meta Tags + +- Added `ogImage?: string` prop to `BaseLayout.astro` Props interface. +- Implemented full OG tag set: `og:site_name`, `og:locale`, `og:type`, `og:title`, `og:description`, `og:url`, `og:image`. +- Implemented full Twitter Card tag set: `twitter:card` (summary_large_image), `twitter:title`, `twitter:description`, `twitter:image`. +- Default OG image (`/og-default.jpg`) is used when `ogImage` prop is omitted. +- `ogImageUrl` helper ensures absolute URLs by prefixing `https://randify.pro` to relative paths. +- Default OG image generated via Node.js + sharp (1200x630, dark background with accent radial gradients and "Randify" branding). +- Build passes; tags verified in `dist/index.html` and `dist/generators/dice/index.html`. + diff --git a/.sisyphus/plans/create-agents-md.md b/.sisyphus/plans/create-agents-md.md new file mode 100644 index 0000000..5874c0e --- /dev/null +++ b/.sisyphus/plans/create-agents-md.md @@ -0,0 +1,200 @@ +# Create AGENTS.md + +## TL;DR + +> Create `AGENTS.md` at repo root with compact, high-signal instructions for future OpenCode sessions. Replace stale `CLAUDE.md` claims. Verify all facts from executable sources. +> +> **Deliverables**: `AGENTS.md` (new file), committed and pushed to `main` +> +> **Estimated Effort**: Quick +> **Parallel Execution**: NO — single task +> **Critical Path**: Task 1 only + +--- + +## Context + +### Original Request +User: "обнови Agents.md" (Create or update `AGENTS.md` for this repository). + +### Key Facts Discovered +- **Project**: Astro 4 + Tailwind CSS 4 static site, 28 random-value generators (bilingual EN/RU) +- **Deploy**: GitHub Actions + rsync to reg.ru on push to `main` +- **CI gate order**: `npm ci` → `npm run lint` → `npm run test` → `npm run build` → `rsync` +- **i18n**: Astro built-in routing, `defaultLocale: "en"`, `prefixDefaultLocale: false`. EN at `src/pages/`, RU at `src/pages/ru/`. Locale derived from `Astro.currentLocale`. +- **CRITICAL quirk**: Never use shared dynamic `[slug].astro` for RU pages — Astro bundles all imported component scripts, causing every RU page to run all 28 generator scripts. +- **Generators**: 28 live. Each requires 4 files: content JSON (EN+RU fields), component, EN page, RU page. +- **Content schema**: Zod `.strict()` in `src/lib/generator-schema.ts` — unknown fields fail build. +- **Shared utilities**: `src/lib/client/random.ts` (crypto `getRandomValues`), `src/lib/client/i18n.ts` (client locale helpers). All 28 generators refactored to use these (zero `Math.random`). +- **Dice engine**: deduplicated into `src/lib/dice-engine.ts`, imported by `DiceGenerator.astro`. +- **Test runner**: Vitest v4, `environment: "node"`, `include: ["src/**/*.test.ts"]`. +- **Lint**: ESLint via `eslint.config.mjs`, ignores `dist/`, `.astro/`, `node_modules/`, `src/env.d.ts`. +- **CLAUDE.md is stale**: claims "10 generators" and "No test runner or linter is configured" — both false. +- **No existing agent instruction files**: no `.cursorrules`, `.cursor/rules/`, `.github/copilot-instructions.md`, `opencode.json`. + +### Metis Review +- No gaps identified — repo answers all important questions. + +--- + +## Work Objectives + +### Core Objective +Write a compact `AGENTS.md` at repo root containing only high-signal, repo-specific guidance that future OpenCode agents would likely miss. + +### Concrete Deliverables +- `AGENTS.md` file at repo root + +### Definition of Done +- [ ] `AGENTS.md` exists at repo root +- [ ] `npm run lint` passes (0 errors) +- [ ] `npm run build` passes (62 pages) + +### Must Have +- Exact developer commands +- CI gate order +- i18n routing quirks and the `[slug].astro` prohibition +- Generator addition workflow (4 steps) +- Zod strict schema warning +- Shared utilities architecture (random.ts, i18n.ts, dice-engine.ts) +- Stale CLAUDE.md warnings + +### Must NOT Have +- Generic software advice +- Long tutorials or exhaustive file trees +- Obvious language conventions +- Speculative claims + +--- + +## Verification Strategy + +### Test Decision +- **Infrastructure exists**: YES +- **Automated tests**: NO (not needed for doc file) +- **Agent-Executed QA**: YES — verify lint and build pass after file creation + +### QA Policy +Every task MUST include agent-executed QA scenarios. + +--- + +## Execution Strategy + +### Wave 1 (Single Task) + +- **Task 1**: Write `AGENTS.md` + +--- + +## TODOs + +- [ ] 1. Write AGENTS.md + + **What to do**: + - Create `/home/emil/Desktop/Coding/AI/Randify.pro/AGENTS.md` with the following verified content: + - Project overview (28 generators, Astro 4 + Tailwind 4) + - Developer commands (exact npm scripts) + - CI gate order + - i18n routing architecture and `[slug].astro` prohibition + - Path alias `@/* → src/*` + - Shared utilities table (random.ts, i18n.ts, dice-engine.ts) + - Shared components (ResultBox.astro, CopyButton.astro) + - Adding a generator: 4-step workflow + - Key conventions (accent color, icons, analytics IDs) + - Stale CLAUDE.md warnings + - Testing, lint & format notes + - Build artifacts and operational gotchas + - Use compact bullets, not prose paragraphs. + - Verify no generic advice included. + + **Must NOT do**: + - Do NOT include generic software advice + - Do NOT write long tutorials + - Do NOT include obvious conventions + - Do NOT make speculative claims + - Do NOT touch `CLAUDE.md` (leave it as-is; AGENTS.md is the new source of truth) + + **Recommended Agent Profile**: + - **Category**: `quick` + - **Skills**: [] + + **Parallelization**: + - **Can Run In Parallel**: NO + - **Parallel Group**: Sequential + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `CLAUDE.md` — existing guidance (partially stale, use for comparison only) + - `package.json` — exact npm scripts + - `astro.config.mjs` — i18n routing config + - `vitest.config.ts` — test config + - `eslint.config.mjs` — lint rules and ignores + - `.github/workflows/deploy.yml` — CI gate order + - `src/lib/generator-schema.ts` — Zod strict schema + - `src/lib/client/random.ts` — crypto random utility + - `src/lib/client/i18n.ts` — client i18n helper + - `src/lib/dice-engine.ts` — canonical dice engine + + **Acceptance Criteria**: + - [ ] `AGENTS.md` exists at `/home/emil/Desktop/Coding/AI/Randify.pro/AGENTS.md` + - [ ] `npm run lint` → PASS (0 errors) + - [ ] `npm run build` → PASS (62 pages generated) + + **QA Scenarios**: + + ``` + Scenario: File created and lint passes + Tool: Bash + Preconditions: None + Steps: + 1. Read AGENTS.md and verify it contains: "28 random-value generators", "CI gate order", "[slug].astro" warning, "Zod .strict()" warning, shared utilities table + 2. Run: npm run lint + 3. Assert: 0 errors + Expected Result: lint exits 0, no errors + Evidence: .sisyphus/evidence/agents-lint.txt + + Scenario: Build passes after file creation + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Assert: "62 pages" in output, exit code 0 + Expected Result: 62 pages generated, exit code 0 + Evidence: .sisyphus/evidence/agents-build.txt + ``` + + **Evidence to Capture**: + - [ ] `.sisyphus/evidence/agents-lint.txt` + - [ ] `.sisyphus/evidence/agents-build.txt` + + **Commit**: YES + - Message: `docs: add AGENTS.md with high-signal repo guidance` + - Files: `AGENTS.md` + - Pre-commit: `npm run lint && npm run build` + +--- + +## Commit Strategy + +- **1**: `docs: add AGENTS.md with high-signal repo guidance` — AGENTS.md, npm run lint && npm run build + +--- + +## Success Criteria + +### Verification Commands +```bash +npm run lint # Expected: 0 errors +npm run build # Expected: 62 pages +``` + +### Final Checklist +- [ ] AGENTS.md exists at repo root +- [ ] Contains 28 generators count (not 10) +- [ ] Contains exact CI gate order +- [ ] Contains [slug].astro prohibition +- [ ] Contains Zod strict warning +- [ ] Lint passes +- [ ] Build passes diff --git a/.sisyphus/plans/seo-blog-categories.md b/.sisyphus/plans/seo-blog-categories.md new file mode 100644 index 0000000..d90522e --- /dev/null +++ b/.sisyphus/plans/seo-blog-categories.md @@ -0,0 +1,1501 @@ +# SEO + Blog + Categories for Randify.pro + +## TL;DR + +> **Quick Summary**: Improve Randify.pro's SEO and content depth to pass Yandex Partner Network (РСЯ) moderation and attract organic search traffic. Fix critical SEO gaps (Open Graph, hreflang, thin content signals), add a bilingual blog with Astro Content Collections, categorize all 28 generators, and enrich page structure with breadcrumbs and related content. +> +> **Deliverables**: +> - Fixed SEO metadata (OG tags, Twitter Cards, x-default hreflang, sitemap i18n) +> - Blog infrastructure (content collections, layouts, pages, RSS feeds for EN + RU) +> - 8 blog post templates with correct frontmatter (EN + RU) +> - 5 category pages for generators (EN + RU) +> - Visual breadcrumbs component +> - Related generators + related posts components +> - Custom 404 page +> - Fixed data integrity issues (duplicate JSON keys) +> +> **Estimated Effort**: Large +> **Parallel Execution**: YES — 6 waves +> **Critical Path**: Wave 1 (fixes) → Wave 2 (schema) → Wave 3 (blog) → Wave 4 (categories) → Wave 5 (content) → Wave FINAL + +--- + +## Context + +### Original Request +User was rejected by Yandex Partner Network (РСЯ) without reason specified. Wants organic search traffic instead of paid ads. Needs SEO improvements + blog + generator categorization. + +### Interview Summary +**Key Discussions**: +- Rejection reason unknown; SEO audit identified thin content as primary suspect +- Blog articles about randomness topics; user will generate content via neural networks +- 5 categories confirmed: Gaming, Security, Decision Making, Creative, Utility +- Initial batch: 8 blog post templates with placeholder content + +**Research Findings**: +- SEO audit (explore agent): 8 CRITICAL issues including missing OG tags, thin content, duplicate JSON keys, missing `
` landmarks +- Blog best practices (librarian): Astro Content Collections with Zod, `/blog/[slug]` routing, `@astrojs/rss`, `BlogPosting` schema + +### Metis Review +- No gaps identified after user confirmation of categories and content workflow + +--- + +## Work Objectives + +### Core Objective +Improve Randify.pro's SEO and content depth to pass Yandex Partner Network (РСЯ) moderation and attract organic search traffic. + +### Concrete Deliverables +- `src/layouts/BaseLayout.astro` — updated with OG tags, Twitter Cards, x-default hreflang +- `astro.config.mjs` — sitemap with i18n hreflang annotations +- `src/content/config.ts` — content collections with blog + generator schemas +- `src/lib/generator-schema.ts` — updated with `category` field +- 28 updated `src/content/generators/*.json` files with category assignments +- Fixed `dice.json`, `list.json`, `colors.json` (duplicate keys merged) +- `src/pages/blog/[slug].astro` + `src/pages/ru/blog/[slug].astro` — blog post pages +- `src/pages/blog/index.astro` + `src/pages/ru/blog/index.astro` — blog index pages +- `src/pages/rss.xml.ts` + `src/pages/ru/rss.xml.ts` — RSS feeds +- `src/layouts/BlogLayout.astro` — blog-specific layout with `BlogPosting` schema +- `src/components/Breadcrumbs.astro` — visual breadcrumb navigation +- `src/components/RelatedGenerators.astro` — cross-link box for generator pages +- `src/components/RelatedPosts.astro` — tag-based related posts for blog +- 5 category pages: `src/pages/generators/category/[category].astro` + RU mirror +- `src/pages/404.astro` + `src/pages/ru/404.astro` — custom 404 pages +- 8 blog post templates in `src/content/blog/en/` and `src/content/blog/ru/` + +### Definition of Done +- [ ] `npm run build` → 70+ pages (62 existing + blog + categories + 404) +- [ ] `npm run lint` → 0 errors +- [ ] OG tags present on all page types (verified via grep on build output) +- [ ] RSS feeds accessible at `/rss.xml` and `/ru/rss.xml` +- [ ] All 28 generators have category assigned +- [ ] No duplicate keys in any generator JSON +- [ ] Blog index and post pages render correctly +- [ ] Category pages filter generators correctly + +### Must Have +- Open Graph and Twitter Card meta tags on every page +- x-default hreflang annotation +- Sitemap with hreflang alternates +- Blog content collections with Zod schema +- RSS feeds for both EN and RU +- 5 category pages with generator filtering +- Visual breadcrumbs on generator and blog pages +- Related generators on each generator page +- Custom 404 page with navigation +- Fixed duplicate JSON keys in dice.json, list.json, colors.json +- `
` landmarks on about/privacy pages +- Blog post templates with correct frontmatter structure + +### Must NOT Have (Guardrails) +- Do NOT remove YandexRTB or AdBanner components +- Do NOT change generator interactive behavior +- Do NOT break existing build (must maintain all existing pages) +- Do NOT add external SEO tools or services +- Do NOT write full blog article content (user generates via neural networks) +- Do NOT use dynamic `[slug].astro` for generator pages (maintain separate EN/RU files) + +--- + +## Verification Strategy + +### Test Decision +- **Infrastructure exists**: YES (vitest, eslint) +- **Automated tests**: NO (infrastructure work, no new utilities requiring TDD) +- **Agent QA**: YES — every task includes agent-executed verification scenarios + +### QA Policy +Every task MUST include agent-executed QA scenarios. +- **Build verification**: `npm run build` → count pages, check for errors +- **Lint verification**: `npm run lint` → 0 errors +- **HTML inspection**: grep build output for OG tags, schema markup, hreflang +- **Functional verification**: curl or playwright to verify blog/category pages render + +--- + +## Execution Strategy + +### Parallel Execution Waves + +``` +Wave 1 (Foundation fixes — can start immediately): +├── Task 1: Fix duplicate JSON keys in 3 generator files [quick] +├── Task 2: Fix
landmarks on about/privacy pages [quick] +├── Task 3: Fix ad placement on homepage [quick] +├── Task 4: Add x-default hreflang to BaseLayout [quick] +├── Task 5: Fix sitemap i18n config in astro.config.mjs [quick] +└── Task 6: Add Open Graph + Twitter Card meta tags [quick] + +Wave 2 (Schema + data — after Wave 1): +├── Task 7: Update generatorSchema.ts with category field [quick] +├── Task 8: Update all 28 generator JSON files with categories [quick] +├── Task 9: Add Organization schema to BaseLayout [quick] +└── Task 10: Create custom 404 page [visual-engineering] + +Wave 3 (Blog infrastructure — after Wave 2): +├── Task 11: Install @astrojs/rss, set up content collections config [quick] +├── Task 12: Create BlogLayout.astro with BlogPosting schema [visual-engineering] +├── Task 13: Create blog post page EN ([slug].astro) [unspecified-high] +├── Task 14: Create blog post page RU ([slug].astro) [unspecified-high] +├── Task 15: Create blog index pages (EN + RU) [unspecified-high] +└── Task 16: Create RSS feeds (EN + RU) [quick] + +Wave 4 (Categories + content + related components — after Wave 2 + 3): +├── Task 17: Create category pages for generators (EN + RU) [unspecified-high] +├── Task 18: Add category navigation to homepage [visual-engineering] +├── Task 19: Create Breadcrumbs component [visual-engineering] +├── Task 20: Create RelatedGenerators component [unspecified-high] +├── Task 21: Create RelatedPosts component [unspecified-high] +├── Task 22: Create 8 blog post templates EN [writing] +├── Task 23: Create 8 blog post templates RU [writing] +└── Task 24: Add blog link to navigation [quick] + +Wave 5 (Integration — after Wave 4): +├── Task 25: Add related generators to generator pages [unspecified-high] +└── Task 26: Add breadcrumbs to generator and blog layouts [unspecified-high] + +Wave FINAL (After ALL tasks — 4 parallel reviews, then user okay): +├── Task F1: Plan compliance audit (oracle) +├── Task F2: Code quality review (unspecified-high) +├── Task F3: Real manual QA (unspecified-high) +└── Task F4: Scope fidelity check (deep) +-> Present results -> Get explicit user okay + +Critical Path: Wave 1 → Wave 2 → Wave 3 + Wave 4 (parallel) → Wave 5 → F1-F4 → user okay +Parallel Speedup: Waves 3 and 4 run in parallel after Wave 2. Wave 4 absorbs blog content tasks. +Max Concurrent: 6 (Wave 1), 4 (Wave 2), 6 (Wave 3), 8 (Wave 4), 2 (Wave 5) +``` + +### Dependency Matrix + +- **1-6**: None → 7-10 +- **7-10**: 1-6 → 11-24 +- **11-16**: 7-10 → 22-24, 25-26 +- **17-21**: 7-10, 11-16 → 25-26 +- **22-24**: 11-16 → 25-26 (content ready for integration) +- **25-26**: 17-21, 22-24 → F1-F4 +- **F1-F4**: 25-26 → user okay + +--- + +## TODOs + +- [ ] 1. Fix duplicate JSON keys in 3 generator files + + **What to do**: + - Read `src/content/generators/dice.json`, `list.json`, `colors.json` + - Each file has duplicate `faq` and `ruFaq` keys (second pair overwrites first) + - Merge both FAQ blocks into single `faq` and single `ruFaq` arrays + - Verify with `npm run build` that no Zod `.strict()` errors occur + + **Must NOT do**: + - Do NOT delete any FAQ content — merge both blocks + - Do NOT change other generator JSON files + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `src/content/generators/dice.json` — duplicate keys at lines 29-37 and 53-57 + - `src/content/generators/list.json` — duplicate keys at lines 27-31 and 48-52 + - `src/content/generators/colors.json` — duplicate keys at lines 26-35 and 46-55 + - `src/lib/generator-schema.ts` — `.strict()` will throw on unknown fields + + **Acceptance Criteria**: + - [ ] `dice.json`, `list.json`, `colors.json` have single `faq` and single `ruFaq` keys + - [ ] All original FAQ items preserved (merged, not deleted) + - [ ] `npm run build` → PASS (0 Zod errors) + + **QA Scenarios**: + ``` + Scenario: Build passes after JSON fix + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Assert: no Zod validation errors for dice/list/colors + Expected Result: 62 pages built successfully + Evidence: .sisyphus/evidence/task-1-build.txt + ``` + + **Commit**: YES (Wave 1) + +- [ ] 2. Fix `
` landmarks on about/privacy pages + + **What to do**: + - Update `src/pages/about.astro` and `src/pages/ru/about.astro`: wrap primary content in `
` + - Update `src/pages/privacy.astro` and `src/pages/ru/privacy.astro`: wrap primary content in `
` + - Ensure `
` contains the actual content, not the breadcrumb nav + + **Must NOT do**: + - Do NOT change content or styling + - Do NOT affect generator pages (they already have `
`) + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `src/pages/about.astro` — lines 21-94, no `
` tag + - `src/pages/privacy.astro` — lines 11-84, no `
` tag + - `src/layouts/GeneratorLayout.astro` — lines 113-116, correct `
` usage + + **Acceptance Criteria**: + - [ ] About page (EN + RU) has `
` landmark + - [ ] Privacy page (EN + RU) has `
` landmark + - [ ] `npm run lint` → PASS + + **QA Scenarios**: + ``` + Scenario: HTML validation shows main landmarks + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Grep dist/about/index.html for '
' + 3. Grep dist/privacy/index.html for '
' + 4. Grep dist/ru/about/index.html for '
' + Expected Result: Each file contains exactly one
tag + Evidence: .sisyphus/evidence/task-2-main.txt + ``` + + **Commit**: YES (Wave 1) + +- [ ] 3. Fix ad placement on homepage + + **What to do**: + - In `src/pages/index.astro`, move `` from line 50 (before `
`) to after the `
` catalog content + - Ensure ad appears below the generator grid, not above it + + **Must NOT do**: + - Do NOT remove YandexRTB component + - Do NOT change YandexRTB component itself + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `src/pages/index.astro` — line 50: `` before `
` + - `src/components/YandexRTB.astro` — ad block component + + **Acceptance Criteria**: + - [ ] YandexRTB renders after `
` content on homepage + - [ ] `npm run build` → PASS + + **QA Scenarios**: + ``` + Scenario: Ad placement is after main content + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Read dist/index.html + 3. Assert:
appears before YandexRTB ad block div + Expected Result: Ad block is after the generator catalog grid + Evidence: .sisyphus/evidence/task-3-ad.txt + ``` + + **Commit**: YES (Wave 1) + +- [ ] 4. Add x-default hreflang to BaseLayout + + **What to do**: + - In `src/layouts/BaseLayout.astro`, add `` after the existing en/ru hreflang links + - The x-default should point to the English version as the fallback + + **Must NOT do**: + - Do NOT remove existing en/ru hreflang links + - Do NOT change canonical URL logic + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `src/layouts/BaseLayout.astro` — lines 48-50: canonical + hreflang + - Google hreflang guidelines: x-default points to fallback page + + **Acceptance Criteria**: + - [ ] x-default hreflang link present in all page `` elements + - [ ] `npm run build` → PASS + + **QA Scenarios**: + ``` + Scenario: x-default hreflang present in output + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Grep dist/index.html for 'hreflang="x-default"' + 3. Grep dist/generators/dice/index.html for 'hreflang="x-default"' + Expected Result: Both files contain x-default hreflang link + Evidence: .sisyphus/evidence/task-4-hreflang.txt + ``` + + **Commit**: YES (Wave 1) + +- [ ] 5. Fix sitemap i18n config + + **What to do**: + - Update `astro.config.mjs`: pass `i18n` option to `sitemap()` integration + - Configuration: `sitemap({ i18n: { defaultLocale: "en", locales: { en: "en-US", ru: "ru-RU" } } })` + - Verify build output includes `` in sitemap + + **Must NOT do**: + - Do NOT change other sitemap options + - Do NOT remove `@astrojs/sitemap` + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `astro.config.mjs` — line 7: `sitemap()` with no options + - `@astrojs/sitemap` i18n docs: https://docs.astro.build/en/guides/integrations-guide/sitemap/#i18n + + **Acceptance Criteria**: + - [ ] `dist/sitemap-0.xml` contains `` entries + - [ ] `npm run build` → PASS + + **QA Scenarios**: + ``` + Scenario: Sitemap contains hreflang alternates + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Read dist/sitemap-0.xml + 3. Assert: contains '` structure beyond adding new meta tags + + **Recommended Agent Profile**: + - **Category**: `visual-engineering` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 1 + - **Blocks**: None + - **Blocked By**: None + + **References**: + - `src/layouts/BaseLayout.astro` — lines 36-64: current `` content + - astro-paper Layout.astro: https://github.com/satnaing/astro-paper/blob/f3005328e548805226aba54414122c7174645e83/src/layouts/Layout.astro#L71-L106 + - AstroWind Metadata.astro: https://github.com/arthelokyo/astrowind/blob/32a3bb96a000c2f5416ea1f795d18666c75ec713/src/components/common/Metadata.astro + + **Acceptance Criteria**: + - [ ] OG tags present in all built HTML pages + - [ ] Twitter Card tags present in all built HTML pages + - [ ] Default OG image exists at `public/og-default.jpg` + - [ ] `npm run build` → PASS + + **QA Scenarios**: + ``` + Scenario: OG tags present on homepage + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run build + 2. Grep dist/index.html for 'property="og:title"' + 3. Grep dist/index.html for 'property="og:description"' + 4. Grep dist/index.html for 'property="og:image"' + 5. Grep dist/index.html for 'property="twitter:card"' + Expected Result: All OG and Twitter tags present + Evidence: .sisyphus/evidence/task-6-og.txt + + Scenario: OG tags present on generator page + Tool: Bash + Preconditions: None + Steps: + 1. Grep dist/generators/dice/index.html for 'property="og:title"' + 2. Assert: og:title contains "Dice Roller" + Expected Result: OG tags populated with generator-specific data + Evidence: .sisyphus/evidence/task-6-og-gen.txt + ``` + + **Commit**: YES (Wave 1) + +- [ ] 7. Update generatorSchema.ts with category field + + **What to do**: + - Add `category` field to `generatorSchema` in `src/lib/generator-schema.ts` + - Type: `z.enum(["gaming", "security", "decision-making", "creative", "utility"])` + - Add `category` to the TypeScript `Generator` type inference + - Ensure `.strict()` still works (category must be in all JSON files before build) + + **Must NOT do**: + - Do NOT remove `.strict()` from schema + - Do NOT add other new fields + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES + - **Parallel Group**: Wave 2 + - **Blocks**: 8 + - **Blocked By**: 1-6 + + **References**: + - `src/lib/generator-schema.ts` — current schema with `.strict()` + - `src/data/generators.ts` — imports and uses `generatorSchema.parse()` + + **Acceptance Criteria**: + - [ ] `category` field added to schema + - [ ] TypeScript `Generator` type includes `category` + - [ ] `npm run lint` → PASS + + **QA Scenarios**: + ``` + Scenario: Schema compiles without errors + Tool: Bash + Preconditions: None + Steps: + 1. Run: npm run lint + 2. Assert: 0 errors + Expected Result: lint passes + Evidence: .sisyphus/evidence/task-7-schema.txt + ``` + + **Commit**: YES (Wave 2) + +- [ ] 8. Update all 28 generator JSON files with categories + + **What to do**: + - Add `"category"` field to ALL 28 files in `src/content/generators/*.json` + - Categories per generator (confirmed by user): + - **gaming**: dice, cards, lottery, wheel, magic8ball, rps + - **security**: password, hash, uuid + - **decision-making**: coin, yesno, weighted, teams + - **creative**: colors, gradient, palette, fontpair, lorem + - **utility**: numbers, date, time, shuffler, letter, names, meal, emoji, country, list + - Verify `npm run build` passes after all updates + + **Must NOT do**: + - Do NOT change any other fields in JSON files + - Do NOT skip any generator file + + **Recommended Agent Profile**: + - **Category**: `quick` + + **Parallelization**: + - **Can Run In Parallel**: YES (after Task 7) + - **Parallel Group**: Wave 2 + - **Blocks**: 17-18 + - **Blocked By**: 7 + + **References**: + - `src/content/generators/*.json` — all 28 files + - `src/lib/generator-schema.ts` — updated schema with category field + + **Acceptance Criteria**: + - [ ] All 28 JSON files have `"category"` field + - [ ] `npm run build` → PASS (62 pages, 0 Zod errors) + + **QA Scenarios**: + ``` + Scenario: Build passes with all categories + Tool: Bash + Preconditions: Task 7 completed + Steps: + 1. Run: npm run build + 2. Assert: 62 pages built, no Zod validation errors + Expected Result: Build succeeds + Evidence: .sisyphus/evidence/task-8-build.txt + ``` + + **Commit**: YES (Wave 2) + +- [ ] 9. Add Organization schema to BaseLayout + + **What to do**: + - Add `Organization` JSON-LD schema to `src/layouts/BaseLayout.astro` + - Include: `@type: "Organization"`, `name: "Randify"`, `url`, `logo` + - Inject via ` {title} + + + + + + + + + + +