🧠 Build Story
How We Drove The AI
We treated the model like a paired senior dev: gave it a role (“Apple engineer + security reviewer”), a Definition of Done (file tree, commands, verification list), and hard guardrails (Next.js App Router + TS, no new deps unless justified, never invent GitHub fields).
Real Prompts, Real Constraints
- Phased flow: Plan → validate → implement. No code until the plan cleared edge cases (token missing, rate limits, forks-only).
- Interfaces first: Defined `RepoData`/`AnalyzedRepo` and score math before touching UI.
- Strict output shape: Asked for diffs and explicit headings to keep merges tight.
- Assumptions capped: Max 6 assumptions + 2 clarifying questions; otherwise proceed.
- Self-review: Every change ended with “check error states + accessibility” before moving on.
Project-Specific Wins
GitHub resilience
// lib/github.ts
if (!GITHUB_TOKEN) {
return getDemoRepos('demo'); // no-token path
}
// graceful fallback on 401/403/429
return getDemoRepos('fallback');We enforced “no token? show demo data” to keep the hackathon demo unbreakable.
Analysis engine
const analyzed = repos.map(analyzeRepo); analyzed.sort((a, b) => b.revivalPotential - a.revivalPotential);
We tuned generateResurrectionPlan() to branch on language, project type, forks, and abandonment age.
UI truth to data
// components/RepoCard.tsx
{repo.fork && <Badge>Fork</Badge>}
{repo.source !== 'live' && <Badge>Demo data</Badge>}Badges make fork/demo context explicit so judges see why a repo scored the way it did.
Scenarios We Tested
- Missing token → demo banner + curated results; no errors.
- GitHub rate limit/401 → silent fallback to demo seed.
- Forks-only toggle → query adds/removes
fork:false; badge shows when active. - Hero image missing → onError hides the image, keeps layout intact.
- Plan reveal → animation tested in light theme; buttons copy/export/Kiro prompt all work.
⏱️
10 focused
Sessions
💬
160+ iterative
Prompts
🛡️
5 constraints
Guardrails
📁
Specs + polish
Artifacts