139 lines
5.6 KiB
Markdown
139 lines
5.6 KiB
Markdown
---
|
|
phase: 01-cleanup-fixes
|
|
plan: 01
|
|
type: execute
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified:
|
|
- public/sitemap.xml
|
|
- package.json
|
|
- app/data/site.ts
|
|
autonomous: true
|
|
requirements:
|
|
- FIX-01
|
|
- FIX-04
|
|
- FIX-05
|
|
must_haves:
|
|
truths:
|
|
- "public/sitemap.xml no longer exists so @nuxtjs/sitemap serves the dynamic sitemap"
|
|
- "package.json has no 'latest' or '*' version specs"
|
|
- "reviewCount in site.ts matches totalReviews in testimonials.ts (both 10)"
|
|
- "Fiverr placeholder URLs '#' are replaced with the profile URL"
|
|
artifacts:
|
|
- path: "package.json"
|
|
provides: "Pinned vue and vue-router versions"
|
|
contains: "\"vue\": \"^3.5.0\""
|
|
- path: "app/data/site.ts"
|
|
provides: "Consistent review data and valid Fiverr URLs"
|
|
contains: "reviewCount: '10'"
|
|
key_links:
|
|
- from: "app/data/site.ts"
|
|
to: "app/data/testimonials.ts"
|
|
via: "reviewCount must equal totalReviews"
|
|
pattern: "reviewCount.*10"
|
|
---
|
|
|
|
<objective>
|
|
Fix static sitemap conflict, pin dangerous dependency versions, and correct data inconsistencies.
|
|
|
|
Purpose: Eliminate config conflicts and data integrity issues that affect SEO and build reproducibility.
|
|
Output: Clean package.json, no static sitemap, consistent site data.
|
|
</objective>
|
|
|
|
<execution_context>
|
|
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
|
|
@$HOME/.claude/get-shit-done/templates/summary.md
|
|
</execution_context>
|
|
|
|
<context>
|
|
@.planning/ROADMAP.md
|
|
@.planning/STATE.md
|
|
@.planning/research/PITFALLS.md
|
|
</context>
|
|
|
|
<tasks>
|
|
|
|
<task type="auto">
|
|
<name>Task 1: Delete static sitemap and pin dependency versions</name>
|
|
<read_first>public/sitemap.xml, package.json</read_first>
|
|
<files>public/sitemap.xml, package.json</files>
|
|
<action>
|
|
1. Delete `public/sitemap.xml` entirely. This static file overrides the `@nuxtjs/sitemap` module dynamic route. Nitro serves `public/` files before server routes, so the module handler at `/sitemap.xml` is never reached while this file exists.
|
|
|
|
2. In `package.json`, replace the two dangerous `"latest"` specs:
|
|
- Change `"vue": "latest"` to `"vue": "^3.5.0"`
|
|
- Change `"vue-router": "latest"` to `"vue-router": "^4.5.0"`
|
|
|
|
Do NOT run `pnpm install` -- just update the version specs. The lockfile already has correct resolved versions.
|
|
</action>
|
|
<verify>
|
|
<automated>bash -c "test ! -f public/sitemap.xml && echo 'sitemap deleted' || echo 'FAIL: sitemap exists'" && grep -c '"latest"' package.json | grep -q '^0$' && echo "no latest found" || echo "FAIL: latest still in package.json"</automated>
|
|
</verify>
|
|
<acceptance_criteria>
|
|
- `public/sitemap.xml` does not exist
|
|
- `grep '"latest"' package.json` returns zero matches
|
|
- `grep '"vue": "\\^3.5.0"' package.json` returns a match
|
|
- `grep '"vue-router": "\\^4.5.0"' package.json` returns a match
|
|
</acceptance_criteria>
|
|
<done>Static sitemap removed, vue and vue-router pinned to caret ranges</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 2: Fix data inconsistencies in site.ts</name>
|
|
<read_first>app/data/site.ts, app/data/testimonials.ts</read_first>
|
|
<files>app/data/site.ts</files>
|
|
<action>
|
|
In `app/data/site.ts`, fix these inconsistencies:
|
|
|
|
1. **reviewCount mismatch**: On line ~99, change `reviewCount: '50'` to `reviewCount: '10'`. The testimonials.ts file has `totalReviews: 10` -- these must match. Google penalises inflated aggregateRating claims in structured data.
|
|
|
|
2. **Fiverr placeholder URLs**: On lines ~61 and ~67, two services have `url: '#'`:
|
|
- `id: 'telegram-bot'` (line ~61): change `url: '#'` to `url: 'https://www.fiverr.com/users/mr_kayjaydee'` (link to profile since no dedicated gig page exists)
|
|
- `id: 'website-development'` (line ~67): change `url: '#'` to `url: 'https://www.fiverr.com/users/mr_kayjaydee'` (same fallback)
|
|
|
|
These are the Fiverr profile URL already defined at `fiverr.profileUrl` in the same file.
|
|
</action>
|
|
<verify>
|
|
<automated>bash -c "grep -q \"reviewCount: '10'\" app/data/site.ts && echo 'reviewCount OK' || echo 'FAIL: reviewCount'" && bash -c "grep -c \"url: '#'\" app/data/site.ts | grep -q '^0$' && echo 'no placeholder URLs' || echo 'FAIL: placeholder URLs remain'"</automated>
|
|
</verify>
|
|
<acceptance_criteria>
|
|
- `grep "reviewCount: '10'" app/data/site.ts` returns a match
|
|
- `grep "reviewCount: '50'" app/data/site.ts` returns zero matches
|
|
- `grep "url: '#'" app/data/site.ts` returns zero matches
|
|
- Both telegram-bot and website-development services have `url: 'https://www.fiverr.com/users/mr_kayjaydee'`
|
|
</acceptance_criteria>
|
|
<done>reviewCount matches totalReviews (10), Fiverr placeholder URLs replaced with profile URL</done>
|
|
</task>
|
|
|
|
</tasks>
|
|
|
|
<threat_model>
|
|
## Trust Boundaries
|
|
|
|
| Boundary | Description |
|
|
|----------|-------------|
|
|
| Static assets vs server routes | `public/` files override Nitro server handlers |
|
|
|
|
## STRIDE Threat Register
|
|
|
|
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|
|
|-----------|----------|-----------|-------------|-----------------|
|
|
| T-01-01 | Information Disclosure | aggregateRating JSON-LD | mitigate | Set reviewCount to actual value (10) to avoid Google penalty for inflated claims |
|
|
| T-01-02 | Tampering | package.json "latest" | mitigate | Pin to caret ranges to prevent unvetted major version upgrades |
|
|
</threat_model>
|
|
|
|
<verification>
|
|
- `ls public/sitemap.xml` fails (file deleted)
|
|
- `grep '"latest"' package.json` returns 0 matches
|
|
- `grep "reviewCount: '10'" app/data/site.ts` returns 1 match
|
|
- `grep "url: '#'" app/data/site.ts` returns 0 matches
|
|
</verification>
|
|
|
|
<success_criteria>
|
|
Static sitemap removed, deps pinned, site data consistent with testimonials data.
|
|
</success_criteria>
|
|
|
|
<output>
|
|
After completion, create `.planning/phases/01-cleanup-fixes/01-01-SUMMARY.md`
|
|
</output>
|