Resolve open questions; update all core specs

This commit is contained in:
Tom Roth
2026-07-31 07:17:00 +02:00
parent 6bd990e4a0
commit 1a6f9fc509
4 changed files with 170 additions and 107 deletions

View File

@@ -1,40 +1,55 @@
# Diana Website — Specification Overview (v1) # Diana Website — Specification Overview (v1)
## Brand
**Home Enhancement and Renovation — HER**
- Short-form: **HER** (used in logo/header)
- Full name: "Home Enhancement and Renovation" (footers, About, legal)
## Purpose ## Purpose
Build a **mobile-first, SEO-friendly, static website** for Diana (handywoman) that primarily **converts visitors into qualified quote requests**. Build a **mobile-first, SEO-friendly, static website** for Diana (handywoman) that primarily **converts visitors into qualified quote requests**.
This document is the navigation map for the specification set.
## Goals ## Goals
1. **Generate qualified leads** via a lightweight quote/contact form. 1. **Generate qualified leads** via a lightweight quote/contact form.
2. Communicate Dianas differentiation: **trustworthy, easy to work with, female handyman/handywoman**, strong **project coordination/mediation** skills. 2. Communicate Diana's differentiation: **trustworthy, easy to work with, female handyman/handywoman**, strong **project coordination/mediation** skills.
3. **SEO-first information architecture**: separate service pages with clear local relevance (San Francisco + 50-mile radius). 3. **SEO-first information architecture**: separate/grouped service pages with clear local relevance (San Francisco + 50-mile radius).
4. **Fast, mobile-first UX** (Core Web Vitals friendly, readable, tap-target safe). 4. **Fast, mobile-first UX** (Core Web Vitals friendly, readable, tap-target safe).
## Non-goals / Out of scope (v1) ## Non-goals / Out of scope (v1)
- Blog - Blog
- Booking / calendar scheduling - Booking / calendar scheduling
- Payments - Payments
- Deployment/infrastructure work beyond “static site served behind Caddy reverse proxy” - Analytics / tracking (no cookie consent banner required)
- Deployment/infrastructure work beyond "static site served behind Caddy reverse proxy"
## Key constraints ## Key constraints
- Language: **English**. - Language: **English**.
- Site type: **static website**. - Site type: **static website**.
- Content updates expected to be infrequent (maintained by owner/you). - Content updates expected to be infrequent (maintained by owner/you).
- Form should be **lightweight** (no file uploads in v1). - Form should be **lightweight** (no file uploads in v1).
- Form backend: **existing AWS service** (details TBD — see OQ-3 / ADR-002).
## Primary user flows ## Primary user flows
1. Visitor lands on Home page → scans credibility/services → taps **Request a Quote** → submits form. 1. Visitor lands on Home page → scans credibility/services → taps **Request a Quote** → submits form.
2. Visitor lands on a Service page (SEO) → sees whats included + service area + CTA → submits form. 2. Visitor lands on a Service page (SEO) → sees what's included + service area + CTA → submits form.
3. Visitor checks About / Testimonials for trust → CTA → submits form. 3. Visitor checks About / Testimonials for trust → CTA → submits form.
## Intended information architecture (high level) ## Intended information architecture
- Home | Page | URL slug | Notes |
- Services (hub) |------|----------|-------|
- Service detail pages (one per service) | Home | `/` | Hero, positioning, services overview, CTA |
- About Diana | Services hub | `/services/` | Links to all service pages |
- Testimonials | Painting | `/services/painting/` | |
- Contact / Request a Quote | Tile Setting | `/services/tile-setting/` | |
| Drywall & Sheetrocking | `/services/drywall/` | |
| Minor Plumbing | `/services/plumbing/` | |
| Minor Electrical | `/services/electrical/` | |
| Carpentry & Mounting | `/services/carpentry-and-mounting/` | |
| Flooring & Wood Refinishing | `/services/flooring/` | |
| Security & Safety Equipment | `/services/security-safety/` | |
| Boat Work | `/services/boat-work/` | |
| About Diana | `/about/` | Story, experience, credibility |
| Testimonials | `/testimonials/` | Customer quotes |
| Contact / Request a Quote | `/contact/` | Form + secondary contact (email, phone) |
## Specification documents ## Specification documents
### Core specs (Phase 2) ### Core specs (Phase 2)
@@ -47,5 +62,3 @@ This document is the navigation map for the specification set.
- `33-frontend-spec.md` — pages, components, UX, mobile-first design, conversion flow - `33-frontend-spec.md` — pages, components, UX, mobile-first design, conversion flow
- `37-seo-content-spec.md` — page structure, metadata, schema.org, sitemap/robots, content requirements per page - `37-seo-content-spec.md` — page structure, metadata, schema.org, sitemap/robots, content requirements per page
- `38-lead-capture-spec.md` — form fields, validation, spam protection, delivery/routing, confirmation UX - `38-lead-capture-spec.md` — form fields, validation, spam protection, delivery/routing, confirmation UX
(If a themed spec requires an architectural decision, it will be captured in `02-architecture-decisions.md`. If uncertainty remains, it will be captured in `99-open-questions.md`.)

View File

@@ -9,64 +9,84 @@
### Lead capture (primary) ### Lead capture (primary)
- **FR-1**: The site must provide a **Request a Quote / Contact** form accessible within 12 taps from any page (persistent CTA). - **FR-1**: The site must provide a **Request a Quote / Contact** form accessible within 12 taps from any page (persistent CTA).
- **FR-2**: The form must be **lightweight** (no file upload requirement in v1). - **FR-2**: The form must be **lightweight** (no file upload in v1).
- **FR-3**: The form must collect enough info to support **qualified leads**. - **FR-3**: The form must collect the following fields to support **qualified leads**:
- Minimum fields TBD in `38-lead-capture-spec.md`. - **Name** (required)
- **FR-4**: After submission, the user must see a **clear confirmation** (and guidance on next steps). - **Address** (service location, required)
- **Phone** (required)
- **Email** (required)
- **Description** (description of work requested, required)
- **FR-4**: After submission, the user must see a **clear confirmation** and guidance on next steps (e.g., Diana will follow up within N days).
- **FR-5**: Form submissions are delivered via an **existing AWS service** (endpoint TBD — see ADR-002, OQ-3).
### Contact channels
- **FR-6**: The site must prominently expose:
- **Primary**: quote request form
- **Secondary**: email address
- **Secondary**: phone number
- **FR-7**: Both secondary channels must appear in the site **header/footer** and in the **post-submission confirmation** copy.
### Content & pages ### Content & pages
- **FR-5**: The site must be **English-only**. - **FR-8**: The site must be **English-only**.
- **FR-6**: The site must clearly state the **service area: San Francisco + 50 mile radius**. - **FR-9**: The site must clearly state the **service area: San Francisco + 50 mile radius**.
- **FR-7**: The site must include a **Services hub page**. - **FR-10**: The site must include a **Services hub page** (`/services/`).
- **FR-8**: The site must include **one page per service** (SEO-driven). - **FR-11**: The site must include **service detail pages**, grouped for SEO as follows:
- Services list (current):
- Security & Safety Equipment | Page | URL slug |
- Tile Setting |------|----------|
- Drywall / Sheetrocking | Painting | `/services/painting/` |
- Painting | Tile Setting | `/services/tile-setting/` |
- Minor Plumbing | Drywall & Sheetrocking | `/services/drywall/` |
- Minor Electrical | Minor Plumbing | `/services/plumbing/` |
- Carpentry | Minor Electrical | `/services/electrical/` |
- Mounting | Carpentry & Mounting | `/services/carpentry-and-mounting/` |
- Flooring touch-ups | Flooring & Wood Refinishing | `/services/flooring/` |
- Boat work | Security & Safety Equipment | `/services/security-safety/` |
- **FR-9**: The site must include an **About Diana** page highlighting credibility, experience, and project coordination. | Boat Work | `/services/boat-work/` |
- **FR-10**: The site must include a **Testimonials** page using existing testimonial content as a base (source: https://spotlighthis.com/testimonials/).
- **FR-11**: The site must include a **Contact** page (may be the same as Request a Quote). - **FR-12**: The site must include an **About Diana** page highlighting credibility, experience, and project coordination background.
- **FR-13**: The site must include a **Testimonials** page using existing testimonial content (source: https://spotlighthis.com/testimonials/).
- **FR-14**: The site must include a **Contact / Request a Quote** page (`/contact/`).
### Differentiation / brand messaging ### Differentiation / brand messaging
- **FR-12**: The site must explicitly lean into “**female handyman/handywoman**” positioning. - **FR-15**: Brand name: **"Home Enhancement and Renovation — HER"** (short-form: **HER**).
- **FR-13**: The site must highlight Diana as **trustworthy, easy to work with**, and skilled at **project coordination/mediation**. - **FR-16**: The site must explicitly lean into "**female handyman/handywoman**" positioning.
- **FR-14**: The site must incorporate proof points (e.g., **years of experience**, project coordination background). - **FR-17**: The site must highlight Diana as **trustworthy, easy to work with**, and skilled at **project coordination/mediation** between homeowners and construction crews.
- **FR-18**: The site must incorporate key proof points: **years of experience** and **project coordination background** (aerospace team lead).
## Non-functional requirements ## Non-functional requirements
### Mobile-first UX ### Mobile-first UX
- **NFR-1**: The site must be designed **mobile-first**, with readable typography and touch-friendly controls. - **NFR-1**: The site must be designed **mobile-first**, with readable typography and touch-friendly controls.
- **NFR-2**: The quote/contact CTA must be prominent and accessible on mobile. - **NFR-2**: The quote/contact CTA must be prominent and easily accessible on mobile.
### SEO ### SEO
- **NFR-3**: The site must be **indexable** (server-rendered/static HTML; no content hidden behind client-only rendering). - **NFR-3**: The site must be **indexable** (static/server-rendered HTML; no content hidden behind client-only rendering).
- **NFR-4**: Each service page must have unique, descriptive metadata (title/description) and content targeting that service. - **NFR-4**: Each service page must have unique, descriptive metadata (title/description) targeting that service and location.
- **NFR-5**: The site must have sitemap and robots configuration (details in `37-seo-content-spec.md`). - **NFR-5**: The site must include a sitemap and robots.txt (details in `37-seo-content-spec.md`).
### Performance ### Performance
- **NFR-6**: Pages must load quickly on mobile networks; images must be optimized and appropriately sized. - **NFR-6**: Pages must load quickly on mobile networks; images must be optimized and appropriately sized.
### Privacy / tracking
- **NFR-7**: **No analytics, tracking scripts, or cookie consent banner** in v1. No privacy policy page required at launch.
### Maintainability ### Maintainability
- **NFR-7**: The solution should be low-maintenance and suitable for infrequent updates by you. - **NFR-8**: The solution should be low-maintenance and suitable for infrequent updates by the owner.
## Constraints / scope boundaries ## Constraints / scope boundaries
- **C-1**: Site must be a **static website**. - **C-1**: Site must be a **static website**.
- **C-2**: Deployment/infrastructure is **out of scope** for v1 beyond the assumption it will be served behind **Caddy reverse proxy**. - **C-2**: Deployment/infrastructure is **out of scope** beyond the assumption it will be served behind **Caddy reverse proxy**.
- **C-3**: No blog, booking/calendar, or payments in v1. - **C-3**: No blog, booking/calendar, or payments in v1.
- **C-4**: No file uploads on the contact form in v1.
## Acceptance criteria (v1) ## Acceptance criteria (v1)
- **AC-1**: A visitor can reach a quote request form from any page in 12 taps. - **AC-1**: A visitor can reach the quote request form from any page in 12 taps.
- **AC-2**: Service pages exist for each service in FR-8, and each has a clear CTA. - **AC-2**: Service pages exist for each group in FR-11, each with a clear CTA and unique content.
- **AC-3**: The site clearly states service area and core positioning. - **AC-3**: The site clearly states service area and core brand positioning (HER).
- **AC-4**: The site is usable on mobile (no horizontal scroll, readable text, accessible tap targets). - **AC-4**: The site is usable on mobile (no horizontal scroll, readable text, accessible tap targets).
- **AC-5**: The site is SEO-ready: indexable pages, unique metadata per service page, sitemap/robots present. - **AC-5**: The site is SEO-ready: indexable pages, unique metadata per service page, sitemap/robots present.
- **AC-6**: Secondary contact channels (email, phone) are visible in header/footer and post-form confirmation.
## Traceability notes ## Traceability notes
- Lead capture specs → `38-lead-capture-spec.md` - Lead capture specs → `38-lead-capture-spec.md`

View File

@@ -2,53 +2,74 @@
This file records stable architectural decisions and their rationale. Items here should remain valid even as implementation details evolve. This file records stable architectural decisions and their rationale. Items here should remain valid even as implementation details evolve.
## ADR-001 — Static website (SSG or plain static HTML) as the delivery model ## ADR-001 — Static website as the delivery model
- **Status**: Accepted - **Status**: Accepted
- **Context**: Site is primarily informational/lead-capture, needs strong SEO, and is expected to change infrequently. - **Context**: Site is primarily informational/lead-capture, needs strong SEO, and is expected to change infrequently.
- **Decision**: Build as a **static website** (pre-rendered HTML) suitable for hosting behind a reverse proxy. - **Decision**: Build as a **static website** (pre-rendered HTML) suitable for hosting behind a Caddy reverse proxy.
- **Rationale**: - **Rationale**:
- SEO-friendly (indexable content) - SEO-friendly (fully indexable content)
- Fast and reliable on mobile - Fast and reliable on mobile
- Low maintenance - Low maintenance
- **Alternatives considered**: - **Alternatives considered**:
- WordPress/CMS: easier editing but higher maintenance/security surface - WordPress/CMS: easier editing but higher maintenance/security surface
- SPA-only: SEO/performance risks and complexity - SPA-only: SEO/performance risks and complexity
- **Consequences**: - **Consequences**:
- Contact form delivery must be handled via a static-compatible approach (see ADR-002, TBD) - Contact form delivery must be handled via a static-compatible approach (see ADR-002)
## ADR-002 — Quote request form submission mechanism ## ADR-002 — Form backend: existing AWS service
- **Status**: Proposed (blocked) - **Status**: Partially accepted (details pending)
- **Context**: Form is required (FR-1..FR-4), but the mechanism (email service, server endpoint, third-party form backend) is not yet selected. - **Context**: The site must collect quote request form submissions (FR-3, FR-5). The site is static, so a backend service is required.
- **Decision**: TBD. - **Decision**: Use an **existing AWS service** owned/operated by the stakeholder.
- **Options to evaluate** (non-exhaustive): - **Rationale**:
1. Static form backend service (e.g., Netlify Forms / Formspree / Basin) - Reuses existing infrastructure
2. Self-hosted lightweight endpoint behind Caddy (out-of-scope per C-2 unless already existing) - Avoids new third-party service dependencies
3. Email link fallback (mailto) — likely insufficient for qualified leads - **Remaining open items** (blocking `38-lead-capture-spec.md`):
- **Drivers**: - Which AWS service is used (e.g. SES, API Gateway + Lambda)?
- Qualified lead capture - What is the form submission endpoint URL?
- Spam protection - What spam protection is in place or expected (e.g. honeypot, reCAPTCHA, AWS WAF)?
- GDPR/cookie implications - **See also**: OQ-3
- Operational simplicity
- **Next step**: Resolve in `99-open-questions.md` and specify in `38-lead-capture-spec.md`.
## ADR-003 — Mobile-first, performance-first design ## ADR-003 — Mobile-first, performance-first design
- **Status**: Accepted - **Status**: Accepted
- **Context**: Most traffic is expected on mobile; SEO and conversion depend on usability and speed. - **Context**: Most traffic is expected on mobile; SEO and conversion depend on usability and speed.
- **Decision**: Adopt a **mobile-first** layout and performance budget mindset. - **Decision**: Adopt a **mobile-first** layout and performance budget mindset throughout.
- **Rationale**: - **Rationale**:
- Improves conversion - Improves conversion on mobile
- Supports SEO (Core Web Vitals) - Supports SEO (Core Web Vitals)
- **Consequences**: - **Consequences**:
- Images must be optimized; avoid heavy JS - Images must be optimized (sized, compressed, lazy-loaded); avoid heavy JavaScript
- Ensure accessible typography and tap targets - Ensure accessible typography and touch-friendly tap targets
## ADR-004 — SEO information architecture: one page per service ## ADR-004 — Service pages: grouped by search intent for SEO
- **Status**: Accepted - **Status**: Accepted
- **Context**: SEO is important and services are distinct. - **Context**: Individual pages per service produce better SEO but only if pages have sufficient unique content. Some services (carpentry/mounting, flooring/wood refinishing) share search intent and image assets.
- **Decision**: Create **separate service pages** for each service category listed in FR-8. - **Decision**: Organize service pages into **9 grouped pages** (down from 10+ individual items), grouped by search intent:
| Page | Slug | Services grouped |
|------|------|-----------------|
| Painting | `/services/painting/` | Interior & exterior painting, trim |
| Tile Setting | `/services/tile-setting/` | All tile types, all rooms |
| Drywall & Sheetrocking | `/services/drywall/` | Drywall, sheetrocking, patching |
| Minor Plumbing | `/services/plumbing/` | Sinks, toilets, showers |
| Minor Electrical | `/services/electrical/` | Lights, fans, fixtures |
| Carpentry & Mounting | `/services/carpentry-and-mounting/` | Carpentry, mounting, assembly |
| Flooring & Wood Refinishing | `/services/flooring/` | Flooring, decks, stairs, refinishing |
| Security & Safety Equipment | `/services/security-safety/` | Grab bars, locks, cameras |
| Boat Work | `/services/boat-work/` | Marine woodwork, paint, hardware |
- **Rationale**: - **Rationale**:
- Supports service-intent keywords - Grouped pages have richer content and avoid thin-page SEO penalties
- Improves internal linking and topical relevance - Carpentry + Mounting share the installation/assembly search intent
- Flooring touch-ups + Wood Refinishing share the surface/finishing search intent and asset library
- **Consequences**: - **Consequences**:
- Requires unique content per page (avoid duplicate/thin pages) - Each grouped page must contain enough unique content to serve its target keywords
- Requires a services hub and internal navigation - Internal linking from the Services hub must cover all sub-topics
## ADR-005 — No analytics or tracking in v1
- **Status**: Accepted
- **Context**: Stakeholder decided against tracking for simplicity.
- **Decision**: **No analytics scripts, no ad pixels, no cookie consent banner** in v1.
- **Rationale**: Reduces complexity, avoids consent/privacy obligations at launch.
- **Consequences**:
- No data-driven iteration on traffic or conversions at launch
- Adding analytics later will require revisiting privacy policy needs

View File

@@ -3,40 +3,49 @@
This log tracks uncertainties and deferred decisions. Each item should be resolved before implementation in Phase 4. This log tracks uncertainties and deferred decisions. Each item should be resolved before implementation in Phase 4.
## OQ-1 — Preferred contact method(s) beyond the contact form ## OQ-1 — Preferred contact method(s) beyond the contact form
- **Status**: Open - **Status**: Resolved
- **Context**: Contact form is a given, but preferred secondary channel(s) are not finalized. - **Resolution**: Secondary contact channels are **email** and **phone**. Both should appear in the site header/footer and in the confirmation copy after form submission.
- **Why it matters**: Influences CTA design, header/footer, and “next steps” after form submission.
- **Candidates**: phone, SMS/text, email.
- **Proposed resolution**: Decide primary + secondary channel(s) and when to encourage each.
## OQ-2 — GDPR/cookie consent and tracking requirements ## OQ-2 — GDPR/cookie consent and tracking requirements
- **Status**: Open - **Status**: Resolved
- **Context**: Need to know whether we will run analytics/ads pixels and whether consent banners are required. - **Resolution**: **No analytics, no tracking scripts, no cookie consent banner** for v1. No privacy policy required at launch. Revisit if analytics are added later.
- **Why it matters**: Affects scripts, cookie banner, privacy policy content, and SEO.
- **Proposed resolution**:
- Decide whether to use analytics (and which)
- If analytics, decide consent model and privacy policy needs
## OQ-3 — Form backend + spam protection approach (ADR-002) ## OQ-3 — Form backend + spam protection approach (ADR-002)
- **Status**: Open - **Status**: Partially resolved
- **Context**: Static site requires an external or existing backend mechanism. - **Resolution**: Form submissions will be handled via an **existing AWS service**. Specific service (e.g. SES, API Gateway + Lambda, or similar) and the endpoint URL/configuration need to be confirmed before `38-lead-capture-spec.md` implementation. See ADR-002.
- **Why it matters**: Reliability, spam filtering, and operational workflow. - **Remaining**: Confirm which AWS service/endpoint and provide connection details.
- **Proposed resolution**: Choose a form delivery method and specify validation + anti-spam.
## OQ-4 — Minimum quote form fields for qualified leads ## OQ-4 — Minimum quote form fields for "qualified leads"
- **Status**: Open - **Status**: Resolved
- **Context**: Goal is “more qualified leads”, but minimum qualifying information is not fully specified. - **Resolution**: Required form fields are:
- **Why it matters**: Balances friction vs. lead quality. - **Name** (full name)
- **Proposed resolution**: Define required vs optional fields in `38-lead-capture-spec.md`. - **Address** (service location)
- **Phone**
- **Email**
- **Description** (description of work requested)
- All fields are required. Detailed validation rules to be defined in `38-lead-capture-spec.md`.
## OQ-5 — Service taxonomy: separate pages vs grouping for carpentry/mounting/flooring ## OQ-5 — Service taxonomy: separate pages vs grouping
- **Status**: Open - **Status**: Resolved
- **Context**: Requirement says separate page per service, but some services overlap. - **Resolution**: Services are grouped for best SEO relevance and content depth. Proposed groupings:
- **Why it matters**: SEO clarity and content uniqueness.
- **Proposed resolution**: Confirm final service list and page slugs. | Page | Slug | Services included |
|------|------|-------------------|
| Painting | `/services/painting/` | Interior & exterior painting, trim work |
| Tile Setting | `/services/tile-setting/` | All tile types, kitchens, bathrooms, entryways, patios |
| Drywall & Sheetrocking | `/services/drywall/` | Removing, replacing, patching, sanding |
| Minor Plumbing | `/services/plumbing/` | Sinks, toilets, showers |
| Minor Electrical | `/services/electrical/` | Lights, fans, fixtures |
| Carpentry & Mounting | `/services/carpentry-and-mounting/` | Carpentry, furniture assembly, TV/shelf mounting |
| Flooring & Wood Refinishing | `/services/flooring/` | Flooring touch-ups, wood refinishing (floors, decks, stairs, cabinets) |
| Security & Safety Equipment | `/services/security-safety/` | Grab bars, lock bars, window mesh, security cameras |
| Boat Work | `/services/boat-work/` | Woodwork, spray paint, marine hardware |
- **Rationale**: Carpentry and Mounting share the same installation/assembly search intent. Flooring touch-ups and Wood Refinishing share the same surface/finish search intent and existing image assets.
## OQ-6 — Brand naming and domain ## OQ-6 — Brand naming and domain
- **Status**: Open - **Status**: Resolved
- **Context**: Current site uses “Spotlight Home Improvement Services”; new site may keep or adjust branding. - **Resolution**: New public-facing brand name is **"Home Enhancement and Renovation — HER"**.
- **Why it matters**: Title tags, logo, copy, and SEO continuity. - Use full name in footers, About page, and legal references.
- **Proposed resolution**: Confirm public-facing brand name for v1. - Use **"HER"** as the short-form logo/header identity.
- Update all spec documents and eventually title tags/metadata to reflect the new brand.