You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Visitors still see an incomplete portfolio after the #167 owner-reset unblock. Most published projects lack category/technologies/tags/deep content (~40/47 empty at last audit), and projects without a live_url never enter the screenshot pipeline — so cards stay on placeholders (e.g. Hype-Macro_Store) even when taxonomy and case-study copy are filled. Hourly cron at cap 1 converges too slowly for a live agency site, and the public UI has no automated proof that an enriched project actually renders its category, tech, and content.
Solution
Make published portfolio pages visitor-ready by (1) filling AI-owned empty taxonomy and case-study fields through the existing secret-guarded generators without raising the 60s serverless hard limit unsafely, (2) adding a GitHub repo social-preview cover path when there is no usable live demo URL, and (3) locking visitor-visible enrichment with Playwright suite + real-browser smoke assertions on a known enriched project.
User Stories
As a site visitor, I want project cards to show a real cover image, so that the portfolio does not look unfinished.
As a site visitor, I want project detail pages to show category, technologies, tags, and deep content when the team has published the project, so that I can evaluate fit.
As a site visitor, I want category and technology filters to include AI-filled taxonomy, so that I can browse beyond a single category.
As a prospect, I want Hype-Macro_Store and similar filled projects to look complete (not placeholder-only), so that I trust the agency showcase.
As an operator, I want generators to prefer empty auto-owned candidates, so that each capped run makes visible progress.
As an operator, I want dry-run responses to distinguish listed vs eligible candidates, so that I do not misread “candidates:46” as “46 LLM jobs needed.”
As an operator, I want cover backfill for GitHub-bound projects without live_url, so that screenshot cron is not a hard dependency on demos.
As an operator, I want cover backfill to be dry-run by default and apply-gated, so that production writes stay intentional.
As an operator, I want cover URLs validated as absolute http(s) images, so that broken meta tags do not poison snapshot_image.
As an operator, I want hourly cron to stay at a safe per-run cap, so that Vercel 60s timeouts do not regress.
As an operator, I want an AFK-safe way to run many sequential capped applies, so that the backlog can clear without raising CASE_STUDY_MAX_PER_RUN unsafely.
As an admin, I want revalidation after successful applies, so that ISR/public pages show new copy and covers promptly.
As a developer, I want pure selection helpers for GitHub-cover targets, so that eligibility is unit-tested without hitting the network.
As a content editor, I want MangaDock and other human-curated fields untouched by auto cover/content writes when ownership is human.
As a visitor on mobile, I want enriched detail layout to remain readable with cover + taxonomy chips, so that completeness is not desktop-only.
As an operator, I want failed LLM/cover fetches to fail soft per project, so that one bad repo does not abort the batch.
As an operator, I want missing README snapshots to remain a skip (not a crash), so that missing-readme cron can unblock those rows first.
As a stakeholder, I want a closing scoreboard (has_cat / has_content / has_shot counts) when the epic finishes, so that “done” is measurable.
Implementation Decisions
Reuse existing generators for taxonomy and case-study; do not invent a parallel LLM pipeline.
Do not raise default CASE_STUDY_MAX_PER_RUN above 1 on the 60s Vercel function; measured ~29s/generation. Convergence uses sequential capped applies (cron + operator loop), not a bigger single request.
Taxonomy may keep env-tuned TAXONOMY_MAX_PER_RUN if measured safe; default stays conservative.
New cover path: for published GitHub-bound projects with null snapshot_image and no usable live_url, fetch the GitHub repository page social preview (og:image / twitter:image) and persist the absolute URL into snapshot_image (same field the cards already read). Prefer this over inventing a second image column.
Ordering: generator loops should prefer empty auto-owned / missing-cover candidates first so capped runs are not dominated by no-op scans of already-complete rows.
Reporting: responses should expose eligible vs scanned counts where today’s candidates is ambiguous (case-study lists all published GitHub projects).
Authz: secret header x-refresh-secret for operator/cron endpoints; dry-run default; apply:true required to persist (match live-url / taxonomy / case-study pattern).
FE verification: extend Playwright public smoke for an enriched slug; completion also requires interactive browser smoke per repo dual-FE gate.
Ownership: never overwrite human-owned fields; cover fill only when snapshot_image is null.
Good tests assert external behavior at agreed seams only (eligibility helpers, HTTP contract dry-run vs apply, public page shows enrichment) — not private method structure.
Prefer pure helper unit tests (Bun) for cover-target selection and OG URL resolution; controller/service specs follow existing taxonomy/case-study/live-url prior art under nestjs/test/.
Frontend: Playwright .e2e.ts plus real Chromium browser smoke; happy-dom unit tests are insufficient alone.
Expected values come from fixtures / known slugs (e.g. enriched project with category+content), not recomputed tautologies.
Out of Scope
Raising serverless maxDuration or moving generation to a worker queue (follow-up if needed).
Inventing live demos / fabricating live_url when none exists.
Re-ranking (ADR 0008) or redesign of project card chrome.
Vault: Empty Project Fields Must Stay Auto-Owned; Frontend Needs Suite And Browser Smoke.
Prod scoreboard at PRD authoring: published 47; has_cat/content/tech ≈ 7; has_live ≈ 10; has_shot ≈ 9; need_tax/content ≈ 40.
Proposed test seams (confirm)
Pure cover eligibility + OG resolve helpers (highest seam for cover rules; no I/O).
Secret-guarded cover backfill HTTP contract (dry-run vs apply counts) — same style as live-url fill.
Public project detail / listing behavior via Playwright + browser smoke (enriched slug shows category, content, non-placeholder cover when DB has snapshot).
EN
Problem Statement
Visitors still see an incomplete portfolio after the #167 owner-reset unblock. Most published projects lack category/technologies/tags/deep content (~40/47 empty at last audit), and projects without a
live_urlnever enter the screenshot pipeline — so cards stay on placeholders (e.g. Hype-Macro_Store) even when taxonomy and case-study copy are filled. Hourly cron at cap 1 converges too slowly for a live agency site, and the public UI has no automated proof that an enriched project actually renders its category, tech, and content.Solution
Make published portfolio pages visitor-ready by (1) filling AI-owned empty taxonomy and case-study fields through the existing secret-guarded generators without raising the 60s serverless hard limit unsafely, (2) adding a GitHub repo social-preview cover path when there is no usable live demo URL, and (3) locking visitor-visible enrichment with Playwright suite + real-browser smoke assertions on a known enriched project.
User Stories
snapshot_image./projectsand an enriched detail slug, so that Playwright suite alone is not the only FE gate.Implementation Decisions
TAXONOMY_MAX_PER_RUNif measured safe; default stays conservative.snapshot_imageand no usablelive_url, fetch the GitHub repository page social preview (og:image/twitter:image) and persist the absolute URL intosnapshot_image(same field the cards already read). Prefer this over inventing a second image column.candidatesis ambiguous (case-study lists all published GitHub projects).x-refresh-secretfor operator/cron endpoints; dry-run default;apply:truerequired to persist (match live-url / taxonomy / case-study pattern).snapshot_imageis null.Testing Decisions
nestjs/test/..e2e.tsplus real Chromium browser smoke; happy-dom unit tests are insufficient alone.Out of Scope
maxDurationor moving generation to a worker queue (follow-up if needed).live_urlwhen none exists.Further Notes
Proposed test seams (confirm)
TH
ปัญหา
หลังปลดบล็อก owner (#167) ผู้เยี่ยมชมยังเห็นพอร์ตโฟลิโอไม่ครบ — ส่วนใหญ่ยังไม่มีหมวด/เทค/แท็ก/เนื้อหาลึก และโปรเจกต์ไม่มี
live_urlจะไม่ได้เข้า pipeline ถ่ายภาพ จึงค้าง placeholder (เช่น Hype-Macro_Store) แม้มี copy แล้ว Cron ชั่วโมงละ 1 ช้าเกินไป และยังไม่มี E2E พิสูจน์ว่าโปรเจกต์ที่ enrich แล้วโชว์ข้อมูลจริงทางแก้
(1) เติม taxonomy + case-study ผ่าน generator เดิมแบบ capped ปลอดภัย (2) ดึงปกจาก GitHub social preview เมื่อไม่มี live demo (3) ล็อกด้วย Playwright + browser smoke บนสลักที่ enrich แล้ว
เรื่องนอกขอบเขต
ไม่เร่ง
CASE_STUDY_MAX_PER_RUNบนฟังก์ชัน 60s · ไม่สร้าง live_url ปลอม · ไม่รีดีไซน์การ์ด · ไม่เปิดคิว worker ในรอบนี้