docs(roadmap): add gap closure phases 8-9

Milestone audit found 4 gaps:
- Session ID bug in error handling (critical)
- Additional work sections not integrated (Montage, etc.)
- Sonstiges free text missing
- i18n not implemented (REQ-7)

Phase 8: Bug Fixes & Legacy Parity
Phase 9: Internationalization

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-06 22:34:01 +09:00
parent 9c8ddc555c
commit ab36dca53c
3 changed files with 210 additions and 31 deletions

View File

@@ -17,6 +17,8 @@ None
- [x] **Phase 5: Volume Calculations** - cbm calculations matching legacy logic exactly
- [x] **Phase 6: Email System** - Legacy HTML table format generation and wp_mail() integration
- [x] **Phase 7: Captcha & Validation** - reCAPTCHA v2/v3, hCaptcha, inline validation, i18n
- [ ] **Phase 8: Bug Fixes & Legacy Parity** - Session bug fix, additional work sections, Sonstiges free text
- [ ] **Phase 9: Internationalization** - i18n with gettext, German/English translation files
## Phase Details
@@ -91,6 +93,28 @@ Plans:
Plans:
- [x] 07-01: Captcha verification and inline validation
### Phase 8: Bug Fixes & Legacy Parity
**Goal**: Fix session ID bug in error handling, integrate additional work sections (Montage, Schrank, Elektriker, Dübelarbeiten, Packarbeiten, Anfahrt) into form and email, add Sonstiges free text field
**Depends on**: Phase 7
**Research**: Unlikely (internal fixes and integration of existing data)
**Gap Closure**: Closes session bug, additional work sections, Sonstiges gaps from v1.0 audit
**Plans**: 0/1
**Status**: Not started
Plans:
- [ ] 08-01: Fix session bug, render additional work sections, add Sonstiges
### Phase 9: Internationalization
**Goal**: Wrap all user-facing strings in gettext functions, create .pot/.po/.mo translation files, load text domain, provide German and English translations
**Depends on**: Phase 8
**Research**: Unlikely (WordPress i18n is well-documented)
**Gap Closure**: Closes REQ-7 (i18n support) from v1.0 audit
**Plans**: 0/1
**Status**: Not started
Plans:
- [ ] 09-01: Wrap strings in gettext, generate translation files, load text domain
## Progress
| Phase | Plans Complete | Status | Completed |
@@ -102,3 +126,5 @@ Plans:
| 5. Volume Calculations | 1/1 | Complete | 2026-01-16 |
| 6. Email System | 1/1 | Complete | 2026-01-16 |
| 7. Captcha & Validation | 1/1 | Complete | 2026-01-16 |
| 8. Bug Fixes & Legacy Parity | 0/1 | Not started | - |
| 9. Internationalization | 0/1 | Not started | - |

View File

@@ -5,16 +5,16 @@
See: .planning/PROJECT.md (updated 2026-01-16)
**Core value:** Email format identical to legacy — office staff workflow depends on the exact HTML table structure.
**Current focus:** Project complete — All 7 phases finished
**Current focus:** Gap closure phases 8-9 (audit fixes before v1.0 completion)
## Current Position
Phase: 7 of 7 (Captcha & Validation) — COMPLETE
Plan: 1 of 1 in current phase
Status: All phases complete
Last activity: 2026-01-16 — Completed 07-01-PLAN.md
Phase: 8 of 9 (Bug Fixes & Legacy Parity)
Plan: Not started
Status: Ready to plan
Last activity: 2026-02-06 — Added gap closure phases from milestone audit
Progress: ██████████ 100% 🎉
Progress: ███████░░░ 78% (7/9 phases)
## Performance Metrics
@@ -34,11 +34,13 @@ Progress: ██████████ 100% 🎉
| 5 | 1 | Real-time calculations with German decimal support |
| 6 | 1 | Form handler, email generator, wp_mail() integration |
| 7 | 1 | Captcha verification and inline validation |
| 8 | — | Bug fixes & legacy parity (gap closure) |
| 9 | — | Internationalization (gap closure) |
**Overall Trend:**
- All phases completed successfully
- Phases 1-7 completed successfully
- Milestone audit found 4 gaps requiring phases 8-9
- No blockers encountered
- Consistent execution pattern across all phases
## Accumulated Context
@@ -52,36 +54,21 @@ Recent decisions affecting current work:
| 1 | Class prefix over namespaces | Broader WordPress compatibility |
| 1 | Capability: edit_posts | Allow editors and admins (not just admins) |
| 1 | Menu position 25 | Below Comments, logical grouping |
| Audit | Fix all 4 gaps for v1.0 | Full legacy parity before shipping |
### Deferred Issues
None yet.
- Admin resend email (future feature)
- Email queue/retry mechanism (low priority)
- reCAPTCHA v3 non-JS fallback (low priority)
### Blockers/Concerns
None yet.
None.
## Session Continuity
Last session: 2026-01-16
Stopped at: Completed 07-01-PLAN.md (Captcha & Validation)
Last session: 2026-02-06
Stopped at: Created gap closure phases 8-9
Resume file: None
Next up: Project complete! Ready for testing and deployment.
## Project Completion
**All 7 phases successfully implemented:**
1. ✅ Foundation - CPT and admin menu
2. ✅ Legacy Data Extraction - Furniture items and cbm values
3. ✅ Settings System - Email and captcha configuration
4. ✅ Form Rendering - Complete form HTML
5. ✅ Volume Calculations - Real-time cbm totals
6. ✅ Email System - Legacy format generation and sending
7. ✅ Captcha & Validation - Spam protection and user validation
**Next Steps:**
- Manual testing in WordPress environment
- Configure captcha keys in settings
- Test all three captcha providers
- Test form submission flow
- Deploy to production
Next up: Plan phase 8 (Bug Fixes & Legacy Parity)

View File

@@ -0,0 +1,166 @@
---
milestone: "1.0"
audited: 2026-02-06
status: gaps_found
scores:
requirements: 8/9
phases: 7/7
integration: 8/10
flows: 3/3
gaps:
requirements:
- "REQ-7: i18n support — German-only implemented, no .pot/.po files, no gettext functions, no English translation"
integration:
- "Session ID bug: session_id() used without session_start() for error transient keys — may cause error messages to display to wrong user or not display at all"
- "Additional work sections (Montage, Schrank, Elektriker, Dubelarbeiten, Packarbeiten, Anfahrt) extracted in Phase 2 but never integrated into form, email, or validation"
- "Sonstiges free text section not implemented"
flows: []
tech_debt:
- phase: "02-legacy-data"
items:
- "get_additional_work() method is orphaned — data extracted but never consumed"
- phase: "06-email"
items:
- "session_id() for transient keys may not work in all hosting environments"
- "No admin resend email feature (documented as future)"
- "No email queue/retry mechanism"
- phase: "07-captcha"
items:
- "reCAPTCHA v3 has no fallback for non-JS users"
- "Email validation uses simple regex, may not catch all invalid formats"
---
# Milestone Audit: v1.0 MVP
**Audited:** 2026-02-06
**Status:** GAPS FOUND
**Auditor:** gsd-integration-checker
## Requirements Coverage
| # | Requirement | Status | Phase | Notes |
|---|------------|--------|-------|-------|
| 1 | Plugin infrastructure with CPT `umzugsliste_entry` | SATISFIED | 1 | CPT registered, admin menu working |
| 2 | Settings page (email, captcha, thank you URL) | SATISFIED | 3 | WordPress Settings API, all 4 captcha options |
| 3 | Shortcode `[umzugsliste]` renders form matching legacy | SATISFIED | 4 | 7 rooms, 118 furniture items rendered |
| 4 | Volume calculations matching legacy logic exactly | SATISFIED | 5 | Real-time JS with German decimal formatting |
| 5 | Captcha integration (all three providers) | SATISFIED | 7 | reCAPTCHA v2, v3, hCaptcha all implemented |
| 6 | Legacy HTML table email format generation | SATISFIED | 6 | HTML tables with bgcolor, legacy structure |
| 7 | i18n support (German primary, English secondary) | **NOT SATISFIED** | — | No gettext functions, no .pot/.po files, German-only |
| 8 | Form submission saves to CPT before email | SATISFIED | 6 | CPT save → email send order verified |
| 9 | Inline form validation (not JS alerts) | SATISFIED | 7 | Client-side + server-side, no alerts |
**Score: 8/9 requirements satisfied**
## Phase Completion
| Phase | Status | SUMMARY.md | Plans |
|-------|--------|-----------|-------|
| 1. Foundation | Complete | Yes | 1/1 |
| 2. Legacy Data Extraction | Complete | Yes | 1/1 |
| 3. Settings System | Complete | Yes | 1/1 |
| 4. Form Rendering | Complete | Yes | 1/1 |
| 5. Volume Calculations | Complete | Yes | 1/1 |
| 6. Email System | Complete | Yes | 1/1 |
| 7. Captcha & Validation | Complete | Yes | 1/1 |
**Score: 7/7 phases complete**
## Cross-Phase Integration
### Verified Connections
- Phase 1 → All: Plugin bootstrap, CPT, constants properly consumed
- Phase 2 → Phase 4: `get_rooms()` and `get_furniture_items()` used in form renderer
- Phase 2 → Phase 5: CBM values passed via data attributes, JS reads correctly
- Phase 2 → Phase 6: Email generator uses furniture data to build HTML tables
- Phase 3 → Phase 6: Receiver email and thank you URL used in form handler
- Phase 3 → Phase 7: Captcha provider and keys used for widget/verification
- Phase 4 → Phase 5: Data attributes and DOM structure consumed by JS calculations
- Phase 4 → Phase 6: Field names match expected POST format in form handler
- Phase 4 → Phase 7: Error display and captcha widget integrated in form
- Phase 6 → Phase 1: CPT entries created with proper meta data
- Phase 7 → Phase 6: Captcha verification runs before form processing
### Integration Score: 8/10
## E2E Flow Verification
### Flow 1: Happy Path (Form → Email → Redirect)
**Status: COMPLETE**
Load form → fill data → real-time calculations → submit → nonce check → captcha check → validation → sanitize → save CPT → generate email → send via wp_mail → redirect to thank you page
### Flow 2: Validation Error Path
**Status: COMPLETE (with session bug)**
Submit invalid → client validation blocks OR server validation catches → error transient → redirect back → display errors inline
**Bug:** `session_id()` used without `session_start()` — transient key may be empty
### Flow 3: Admin View Submissions
**Status: COMPLETE**
Navigate to Umzugsliste → Eintraege → view CPT list → click entry → see JSON data and meta
**Flows Score: 3/3 flows functional**
## Critical Gaps
### 1. i18n Not Implemented (Requirement 7)
- No `__()` or `_e()` gettext function calls anywhere
- No `.pot`, `.po`, or `.mo` translation files
- No `languages/` directory
- Text domain declared but never loaded (`load_plugin_textdomain()` missing)
- All user-facing strings hardcoded in German
- **Decision needed:** Is English support required for v1.0?
### 2. Session ID Bug
- `session_id()` returns empty string when PHP session not started
- Used in form-handler.php (lines 72, 82) and form-renderer.php (line 49)
- Transient key degrades to `umzugsliste_errors_default`
- In multi-user scenarios, errors could cross-contaminate between users
- **Fix required before production**
### 3. Additional Work Sections Orphaned
- Phase 2 extracted 32 fields across 6 sections (Montage, Schrank, Elektriker, Dubelarbeiten, Packarbeiten, Anfahrt)
- `get_additional_work()` method exists but is never called
- Not rendered in form, not included in email, not validated
- **Decision needed:** Required for v1.0 or defer to v1.1?
### 4. Sonstiges Free Text Missing
- Legacy form had a free text "Sonstiges" section
- Not implemented in any phase
- **Decision needed:** Required for v1.0 or defer?
## Tech Debt
| Phase | Item | Priority |
|-------|------|----------|
| 06 | session_id() without session_start() | Critical |
| 02 | get_additional_work() orphaned | High |
| 06 | No admin resend email | Low |
| 06 | No email queue/retry | Low |
| 07 | reCAPTCHA v3 no non-JS fallback | Low |
| 07 | Simple email regex validation | Low |
## Security Verification
- Nonce protection: IMPLEMENTED
- Data sanitization: IMPLEMENTED
- SQL injection protection: SAFE (WordPress APIs)
- XSS protection: IMPLEMENTED (esc_html, esc_attr)
- CSRF protection: IMPLEMENTED (nonce + referer check)
## Recommendations
### Before Completing Milestone
1. **Decide on i18n:** Accept German-only for v1.0 or implement before shipping
2. **Fix session bug:** Replace `session_id()` with reliable alternative
3. **Decide on additional work sections:** Ship without or implement
### For Next Milestone
- i18n with full English translation (if deferred)
- Additional work sections integration
- Sonstiges free text field
- Admin resend email
- Production testing across hosting environments
---
*Generated by gsd-integration-checker on 2026-02-06*