docs: add implementation roadmap with task dependency graph and acceptance gates
This commit is contained in:
@@ -0,0 +1,300 @@
|
|||||||
|
# Personal Portfolio Implementation Roadmap
|
||||||
|
|
||||||
|
**Project**: davidaragon.impresion3d.pro
|
||||||
|
**Goal**: Professional portfolio + dev blog for indie builder
|
||||||
|
**Timeline**: 4 weeks (3 weeks implementation + 1 week content/polish)
|
||||||
|
**Methodology**: Atomic task decomposition → Parallel implementation → Sequential deployment
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Task Dependency Graph
|
||||||
|
|
||||||
|
```
|
||||||
|
Foundation (Week 1)
|
||||||
|
====================
|
||||||
|
t_28db7e16: [#29-impl-1] Initialize Astro + Tailwind + TypeScript
|
||||||
|
└── t_0078b4b3: [#29-impl-2] Content collections (blog + projects schemas)
|
||||||
|
├── t_0ec36bde: [#29-impl-3] Base layout (Header, Footer, Nav)
|
||||||
|
│ ├── t_6e85e022: [#29-impl-4] About page ║
|
||||||
|
│ ├── t_7aa42f76: [#29-impl-5] Homepage (hero + featured) ║
|
||||||
|
│ ├── t_b7d940a1: [#29-impl-6] Blog pages + RSS ║
|
||||||
|
│ └── t_26ed02cc: [#29-impl-7] Projects pages ║
|
||||||
|
└── (All above) ──→ t_66684b8f: [#29-impl-8] Docker deployment
|
||||||
|
|
||||||
|
Content & Polish (Week 3-4)
|
||||||
|
============================
|
||||||
|
t_c4e23cc8: [#29-impl-9] Blog content (5 posts) ║
|
||||||
|
t_637198bd: [#29-impl-10] Project case studies (3 projects) ║
|
||||||
|
t_8f00b91a: [#29-impl-11] SEO optimization (structured data, OG, analytics)
|
||||||
|
|
||||||
|
Legend:
|
||||||
|
║ = Can run in parallel
|
||||||
|
└── = Must wait for parent
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase Breakdown
|
||||||
|
|
||||||
|
### Phase 1: Foundation (Week 1)
|
||||||
|
|
||||||
|
**Priority: P1** (all tasks blocking)
|
||||||
|
|
||||||
|
| Task ID | Title | Assignee | Est. Time | Blocks |
|
||||||
|
|---------|-------|----------|-----------|--------|
|
||||||
|
| t_28db7e16 | Initialize Astro + Tailwind | wh-implementer | 2-3h | ALL |
|
||||||
|
| t_0078b4b3 | Content collections | wh-implementer | 3-4h | Layouts + Pages |
|
||||||
|
| t_0ec36bde | Base layout | wh-implementer | 3-4h | All pages |
|
||||||
|
| t_6e85e022 | About page | wh-implementer | 2-3h | - |
|
||||||
|
| t_7aa42f76 | Homepage hero | wh-implementer | 3-4h | - |
|
||||||
|
|
||||||
|
**Parallelization opportunity**: After #29-impl-3 completes, tasks #29-impl-4, #29-impl-5, #29-impl-6, #29-impl-7 can ALL run simultaneously (4 parallel tracks).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 2: Pages & Features (Week 2)
|
||||||
|
|
||||||
|
**Priority: P1-P2**
|
||||||
|
|
||||||
|
| Task ID | Title | Assignee | Est. Time | Parallel? |
|
||||||
|
|---------|-------|----------|-----------|-----------|
|
||||||
|
| t_b7d940a1 | Blog pages + RSS | wh-implementer | 4-5h | YES ║ |
|
||||||
|
| t_26ed02cc | Projects pages | wh-implementer | 3-4h | YES ║ |
|
||||||
|
|
||||||
|
**Can run in parallel** with #29-impl-4 and #29-impl-5.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 3: Deployment (Week 2-3)
|
||||||
|
|
||||||
|
**Priority: P1** (blocks launch)
|
||||||
|
|
||||||
|
| Task ID | Title | Assignee | Est. Time | Depends on |
|
||||||
|
|---------|-------|----------|-----------|------------|
|
||||||
|
| t_66684b8f | Docker + Nginx + Portainer | wh-implementer | 4-5h | ALL pages (impl-1 through impl-7) |
|
||||||
|
|
||||||
|
**Must wait** for all page implementation tasks to complete (can't deploy empty site).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 4: Content Creation (Week 3-4)
|
||||||
|
|
||||||
|
**Priority: P2** (nice-to-have for MVP, critical for launch)
|
||||||
|
|
||||||
|
| Task ID | Title | Assignee | Est. Time | Parallel? |
|
||||||
|
|---------|-------|----------|-----------|-----------|
|
||||||
|
| t_c4e23cc8 | Blog posts (5 articles) | wh-writer | 6-8h | YES ║ |
|
||||||
|
| t_637198bd | Project case studies (3 projects) | wh-writer | 4-5h | YES ║ |
|
||||||
|
|
||||||
|
**Can run in parallel** (different content types, no dependencies).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 5: SEO & Polish (Week 4)
|
||||||
|
|
||||||
|
**Priority: P3** (launch enhancement)
|
||||||
|
|
||||||
|
| Task ID | Title | Assignee | Est. Time | Depends on |
|
||||||
|
|---------|-------|----------|-----------|------------|
|
||||||
|
| t_8f00b91a | SEO optimization | wh-implementer | 2-3h | ALL pages |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Path Analysis
|
||||||
|
|
||||||
|
**Longest sequential path** (critical path):
|
||||||
|
|
||||||
|
```
|
||||||
|
impl-1 (3h) → impl-2 (4h) → impl-3 (4h) → impl-8 (5h) = 16 hours
|
||||||
|
```
|
||||||
|
|
||||||
|
**With parallelization**:
|
||||||
|
|
||||||
|
```
|
||||||
|
Week 1: impl-1 (3h) → impl-2 (4h) → impl-3 (4h) = 11h
|
||||||
|
Week 2: impl-4, impl-5, impl-6, impl-7 in parallel (max 5h)
|
||||||
|
Week 2: impl-8 (5h)
|
||||||
|
Week 3-4: impl-9, impl-10 in parallel (max 8h)
|
||||||
|
Week 4: impl-11 (3h)
|
||||||
|
|
||||||
|
Total calendar time: 3-4 weeks
|
||||||
|
Total sequential hours: 16h (foundation) + 5h (pages) + 5h (deploy) + 8h (content) + 3h (SEO) = 37 hours
|
||||||
|
With parallelization: ~27 hours of actual work
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Assignee Profiles
|
||||||
|
|
||||||
|
| Profile | Responsibilities | Skills | Tasks |
|
||||||
|
|---------|------------------|--------|-------|
|
||||||
|
| **wh-implementer** | Code implementation | Astro, React, Docker, FastAPI | impl-1 through impl-8, impl-11 |
|
||||||
|
| **wh-writer** | Content creation | Spanish writing, technical writing, SEO | impl-9, impl-10 |
|
||||||
|
| **wh-leader** | Orchestration | Planning, Gitea issues, monitoring | This task (t_22a3d7db) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kanban Board States
|
||||||
|
|
||||||
|
All tasks created in **`todo`** state.
|
||||||
|
|
||||||
|
Transition rules:
|
||||||
|
- `todo` → `ready`: When all parent tasks in `done`
|
||||||
|
- `ready` → `running`: Dispatcher assigns to available worker
|
||||||
|
- `running` → `done`: Worker calls `kanban_complete(...)`
|
||||||
|
- `running` → `blocked`: Worker needs human input
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acceptance Gates
|
||||||
|
|
||||||
|
### Gate 1: Foundation Complete (Week 1)
|
||||||
|
- [ ] Tasks impl-1, impl-2, impl-3 in `done`
|
||||||
|
- [ ] `npm run dev` starts without errors
|
||||||
|
- [ ] Tailwind CSS working (test with colored elements)
|
||||||
|
- [ ] Content collections validated (no schema errors)
|
||||||
|
- [ ] Header, Footer, Navigation visible
|
||||||
|
|
||||||
|
### Gate 2: Pages Complete (Week 2)
|
||||||
|
- [ ] Tasks impl-4, impl-5, impl-6, impl-7 in `done`
|
||||||
|
- [ ] All pages accessible (`/`, `/about`, `/blog`, `/projects`)
|
||||||
|
- [ ] No TypeScript errors
|
||||||
|
- [ ] No broken links
|
||||||
|
- [ ] Responsive design works (mobile, tablet, desktop)
|
||||||
|
|
||||||
|
### Gate 3: Deployment Ready (Week 2-3)
|
||||||
|
- [ ] Task impl-8 in `done`
|
||||||
|
- [ ] Docker image builds successfully
|
||||||
|
- [ ] Final image size <50MB
|
||||||
|
- [ ] Health check passes
|
||||||
|
- [ ] Site accessible at http://localhost:3010
|
||||||
|
- [ ] Nginx serves static files with gzip compression
|
||||||
|
|
||||||
|
### Gate 4: Content Published (Week 3-4)
|
||||||
|
- [ ] Tasks impl-9, impl-10 in `done`
|
||||||
|
- [ ] At least 3 blog posts published
|
||||||
|
- [ ] At least 2 project case studies published
|
||||||
|
- [ ] All content validates against schemas
|
||||||
|
- [ ] No typos or grammar errors
|
||||||
|
|
||||||
|
### Gate 5: SEO Optimized (Week 4)
|
||||||
|
- [ ] Task impl-11 in `done`
|
||||||
|
- [ ] Sitemap generated and accessible
|
||||||
|
- [ ] robots.txt present
|
||||||
|
- [ ] Structured data validates (Google Rich Results Test)
|
||||||
|
- [ ] OG preview looks correct (opengraph.xyz)
|
||||||
|
- [ ] Analytics configured (if using)
|
||||||
|
|
||||||
|
### Gate 6: Production Launch
|
||||||
|
- [ ] All 11 implementation tasks in `done`
|
||||||
|
- [ ] All 6 acceptance gates passed
|
||||||
|
- [ ] Portainer stack deployed to 192.168.1.30:3010
|
||||||
|
- [ ] HTTPS working via Traefik (davidaragon.impresion3d.pro)
|
||||||
|
- [ ] DNS pointing to correct server
|
||||||
|
- [ ] Health check passing
|
||||||
|
- [ ] Site accessible publicly
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Gitea Issue Mapping
|
||||||
|
|
||||||
|
All tasks map to **Gitea Issue #29**: "Build personal portfolio with blog and projects showcase"
|
||||||
|
|
||||||
|
Task naming convention: `[#29-impl-N] Description`
|
||||||
|
|
||||||
|
This allows tracking all work back to the single strategic Gitea issue while maintaining atomic Kanban tasks for execution.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Known Blockers & Mitigations
|
||||||
|
|
||||||
|
### Blocker 1: Git Push Authentication
|
||||||
|
**Status**: BLOCKED
|
||||||
|
**Impact**: Cannot push commits to GitLab
|
||||||
|
**Mitigation**:
|
||||||
|
- Commits created locally (all changes staged)
|
||||||
|
- Push manually after SSH key configured
|
||||||
|
- Or: use personal access token with HTTPS
|
||||||
|
|
||||||
|
**Resolution needed**: SSH key or GitLab personal access token
|
||||||
|
|
||||||
|
### Blocker 2: Real Images (OG, Favicon, Avatar)
|
||||||
|
**Status**: LOW PRIORITY
|
||||||
|
**Impact**: Site uses placeholders for images
|
||||||
|
**Mitigation**:
|
||||||
|
- Create placeholders in implementation tasks
|
||||||
|
- Replace with real images before launch
|
||||||
|
- Can launch with placeholders if needed (not blocking)
|
||||||
|
|
||||||
|
**Resolution**: Create professional OG image (1200x630), favicon set, avatar photo
|
||||||
|
|
||||||
|
### Blocker 3: Analytics Configuration
|
||||||
|
**Status**: OPTIONAL
|
||||||
|
**Impact**: No traffic analytics initially
|
||||||
|
**Mitigation**:
|
||||||
|
- Launch without analytics (privacy-first)
|
||||||
|
- Or: set up self-hosted Plausible later
|
||||||
|
- Not blocking for MVP
|
||||||
|
|
||||||
|
**Resolution**: Optional - configure Plausible after launch
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Success Metrics
|
||||||
|
|
||||||
|
### Development Metrics
|
||||||
|
- [ ] 11 tasks completed in 4 weeks
|
||||||
|
- [ ] Zero P1 bugs at launch
|
||||||
|
- [ ] <50MB Docker image size
|
||||||
|
- [ ] >80% test coverage (if tests added)
|
||||||
|
- [ ] 100% TypeScript strict compliance
|
||||||
|
|
||||||
|
### Product Metrics (post-launch)
|
||||||
|
- Lighthouse Score: >90 (all categories)
|
||||||
|
- Core Web Vitals: Pass (LCP <2.5s, FID <100ms, CLS <0.1)
|
||||||
|
- Uptime: >99% (monitor with UptimeRobot)
|
||||||
|
- Page load: <2s (first contentful paint)
|
||||||
|
|
||||||
|
### Content Metrics (Month 1)
|
||||||
|
- 3-5 blog posts published
|
||||||
|
- 2-3 project case studies published
|
||||||
|
- RSS subscribers: goal 50+
|
||||||
|
- Organic traffic: goal 100+ visitors/month
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Post-Launch Roadmap
|
||||||
|
|
||||||
|
### Month 1-2: Content Cadence
|
||||||
|
- Publish 2 blog posts per week
|
||||||
|
- Update project case studies with metrics
|
||||||
|
- Add 1-2 more projects (Garage61 API, etc.)
|
||||||
|
|
||||||
|
### Month 3-4: Features
|
||||||
|
- Newsletter signup backend (ConvertKit/Mailchimp)
|
||||||
|
- Comments system (Giscus/Utterances)
|
||||||
|
- Search functionality
|
||||||
|
- Dark/light mode toggle
|
||||||
|
|
||||||
|
### Month 5-6: Growth
|
||||||
|
- Guest posts on Spanish indie blogs
|
||||||
|
- X (Twitter) thread automation from blog posts
|
||||||
|
- SEO optimization (internal linking, backlinks)
|
||||||
|
- Analytics dashboard (public metrics page)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contact & Support
|
||||||
|
|
||||||
|
**Project Owner**: David Aragón (caleidos)
|
||||||
|
**Primary Agent**: wh-leader (orchestrator)
|
||||||
|
**Repository**: https://gitlab.impresion3d.pro/root/davidaragon-portfolio
|
||||||
|
**Deployment**: 192.168.1.30:3010 → davidaragon.impresion3d.pro
|
||||||
|
|
||||||
|
**Blockers?** Comment on Kanban task or create Gitea issue.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Generated**: 2026-05-08
|
||||||
|
**Last Updated**: 2026-05-08
|
||||||
|
**Status**: ✅ Ready for execution
|
||||||
Reference in New Issue
Block a user