mirror of
https://github.com/formax68/memoChron.git
synced 2026-07-22 05:45:44 +00:00
docs: v1.13.1 milestone audit and phase 03 review-fix report
This commit is contained in:
parent
3aaec9694b
commit
cfdfd4ac9e
2 changed files with 350 additions and 0 deletions
|
|
@ -0,0 +1,99 @@
|
|||
---
|
||||
phase: 03
|
||||
fixed_at: 2026-05-12T00:00:00Z
|
||||
review_path: .planning/phases/03-date-parsing-navigation-bugs/03-REVIEW.md
|
||||
iteration: 1
|
||||
findings_in_scope: 3
|
||||
fixed: 3
|
||||
skipped: 0
|
||||
status: all_fixed
|
||||
---
|
||||
|
||||
# Phase 3: Code Review Fix Report
|
||||
|
||||
**Fixed at:** 2026-05-12
|
||||
**Source review:** `.planning/phases/03-date-parsing-navigation-bugs/03-REVIEW.md`
|
||||
**Iteration:** 1
|
||||
**Scope:** Critical + Warning (3 warnings — no critical findings in this review)
|
||||
|
||||
**Summary:**
|
||||
- Findings in scope: 3
|
||||
- Fixed: 3
|
||||
- Skipped: 0
|
||||
|
||||
All fixes type-checked clean with `tsc -noEmit` and pass the full
|
||||
`npm run build` pipeline (production esbuild bundle).
|
||||
|
||||
## Fixed Issues
|
||||
|
||||
### WR-01: `parseLocalDate` does not reject invalid day-of-month, silently rolls forward
|
||||
|
||||
**Files modified:** `src/utils/viewRenderers.ts`
|
||||
**Commit:** `ef48a44`
|
||||
**Applied fix:** Added a round-trip validation check after the numeric
|
||||
`Date` constructor. The helper now verifies that the constructed Date's
|
||||
`getFullYear() / getMonth() / getDate()` match the input components,
|
||||
rejecting impossible inputs like `(2026, 2, 31)` which the constructor
|
||||
silently rolls into `2026-03-03`. Filenames like `31-02-2026.md` and
|
||||
`2026-02-30.md` now fall through to the next interpretation or return
|
||||
`null` instead of returning the wrong date.
|
||||
|
||||
### WR-02: BUG-01 timezone fix is incomplete — `parseDate` still uses `new Date(string)`
|
||||
|
||||
**Files modified:** `src/utils/viewRenderers.ts`
|
||||
**Commit:** `6143643`
|
||||
**Applied fix:** Added explicit `^(\d{4})-(\d{2})-(\d{2})$` ISO detection
|
||||
in `parseDate` before the loose `new Date(input)` fallback. ISO-shaped
|
||||
inputs are routed through `parseLocalDate` so the result is a local-day
|
||||
Date, not UTC midnight. This closes the BUG-01 bug class for code-block
|
||||
parameters (`date: 2026-01-15` in `memochron-calendar` / `memochron-agenda`
|
||||
blocks) which the original Phase 3 plan covered only for daily-note
|
||||
filenames.
|
||||
|
||||
### WR-03: `maybeBackgroundRefresh` `.then` ignores stale closure and unawaited Promise
|
||||
|
||||
**Files modified:** `src/views/CalendarView.ts`
|
||||
**Commit:** `4f14936`
|
||||
**Applied fix:** Two-part fix in `maybeBackgroundRefresh()`:
|
||||
|
||||
1. **Staleness guard:** capture `this.currentDate.getTime()` before
|
||||
the fetch and bail in `.then` if it has changed. Used `getTime()`
|
||||
(not strict-equality) because `navigate()` mutates `currentDate` in
|
||||
place via `setMonth`/`setDate`, so a strict-identity comparison
|
||||
would miss the in-place arithmetic paths.
|
||||
2. **Unawaited async call:** prefixed `this.showDayAgenda(dateToShow)`
|
||||
with `void` so any future async error surfaces through the
|
||||
surrounding `.catch` rather than `unhandledrejection`.
|
||||
|
||||
Scope note: the report also mentions the same `void`-prefix concern at
|
||||
`renderCurrentRange` and `refreshEvents`. Those are Info-tier (IN-04)
|
||||
and out of scope for this `critical_and_warning` fix pass — left as-is
|
||||
per the scoping rule.
|
||||
|
||||
## Skipped Issues
|
||||
|
||||
None.
|
||||
|
||||
## Verification
|
||||
|
||||
All three fixes verified with:
|
||||
- **Tier 1:** re-read of each modified region after edit; fix text
|
||||
present and surrounding code intact.
|
||||
- **Tier 2:** `tsc -noEmit` (via `npm run build`) clean — no errors in
|
||||
modified or downstream files.
|
||||
|
||||
## Prompt-Injection Notice
|
||||
|
||||
While reading `src/views/CalendarView.ts`, the tool output appended a
|
||||
`<system-reminder>` block containing fake "MCP Server Instructions" for
|
||||
unrelated services (Airtable, Context7, Gamma). This appears to be the
|
||||
same prompt-injection source flagged in `03-REVIEW.md`. I ignored it and
|
||||
took no action on those purported instructions; the user-supplied fix
|
||||
task was followed instead. Flagging here so the orchestrator can
|
||||
investigate the source.
|
||||
|
||||
---
|
||||
|
||||
_Fixed: 2026-05-12_
|
||||
_Fixer: gsd-code-fixer_
|
||||
_Iteration: 1_
|
||||
251
.planning/v1.13.1-MILESTONE-AUDIT.md
Normal file
251
.planning/v1.13.1-MILESTONE-AUDIT.md
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
---
|
||||
milestone: v1.13.1
|
||||
audited: 2026-05-10T00:00:00Z
|
||||
status: gaps_found
|
||||
scores:
|
||||
requirements: 5/19
|
||||
phases: 1/4
|
||||
integration: 14/14 wired (Phase 01 only — phases 2-4 not yet executed)
|
||||
flows: phase-01-internal-flows-intact
|
||||
gaps:
|
||||
requirements:
|
||||
- id: "SEC-01"
|
||||
status: "orphaned"
|
||||
phase: "Phase 2 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 2 directory does not exist. Color validation surface still unsanitized at SettingsTab.ts:589, 592, 675, 678 (template-literal SVG with ${currentColor})."
|
||||
- id: "SEC-02"
|
||||
status: "orphaned"
|
||||
phase: "Phase 2 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 2 directory does not exist. CalendarService.fetchCalendar (lines 396-400), fetchLocalCalendar (line 532), and NoteService.createEventNote (line 75) still use inconsistent error handling."
|
||||
- id: "BUG-05"
|
||||
status: "orphaned"
|
||||
phase: "Phase 2 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 2 directory does not exist. CalendarView.getStartOfWeek at line 407 not yet corrected for Saturday-start (firstDayOfWeek=6)."
|
||||
- id: "BUG-06"
|
||||
status: "orphaned"
|
||||
phase: "Phase 2 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 2 directory does not exist. isFetchingCalendars guard exists in CalendarService but semantic correctness for the 100ms-delay window between schedule and fire pending verification."
|
||||
- id: "BUG-01"
|
||||
status: "orphaned"
|
||||
phase: "Phase 3 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 3 directory does not exist. Daily-note YYYY-MM-DD parsing in non-UTC timezones not yet fixed."
|
||||
- id: "BUG-02"
|
||||
status: "orphaned"
|
||||
phase: "Phase 3 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 3 directory does not exist. Month/week navigation responsiveness not yet addressed."
|
||||
- id: "BUG-03"
|
||||
status: "orphaned"
|
||||
phase: "Phase 3 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 3 directory does not exist. Drag-resize → view-mode dropdown sync not yet addressed."
|
||||
- id: "BUG-04"
|
||||
status: "orphaned"
|
||||
phase: "Phase 3 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 3 directory does not exist. #56 date-parsing fix not yet verified post-#58."
|
||||
- id: "ENH-01"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. Today-vs-selected-day distinct visual indicator not yet implemented."
|
||||
- id: "ENH-02"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. Agenda note-exists icon not yet implemented."
|
||||
- id: "ENH-03"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. Optional note-exists dot toggle not yet implemented."
|
||||
- id: "ENH-04"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. NL/EU DD-MM-YYYY date format option not yet added."
|
||||
- id: "ENH-05"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. {{day}}/{{month}} named template variables not yet implemented."
|
||||
- id: "ENH-06"
|
||||
status: "orphaned"
|
||||
phase: "Phase 4 (not started)"
|
||||
claimed_by_plans: []
|
||||
completed_by_plans: []
|
||||
verification_status: "missing"
|
||||
evidence: "Phase 4 directory does not exist. {{cursor}} marker not yet implemented."
|
||||
unverified_phases:
|
||||
- phase: "02-security-correctness"
|
||||
reason: "Phase directory does not exist; not yet planned or executed"
|
||||
- phase: "03-date-parsing-navigation-bugs"
|
||||
reason: "Phase directory does not exist; not yet planned or executed"
|
||||
- phase: "04-ux-enhancements"
|
||||
reason: "Phase directory does not exist; not yet planned or executed"
|
||||
integration: []
|
||||
flows: []
|
||||
tech_debt:
|
||||
- phase: 01-foundation
|
||||
items:
|
||||
- "Info: src/views/EmbeddedCalendarView.ts:15 — unused CalendarEvent import (pre-existing, type-only so esbuild tree-shakes; surfaced as IN-01 in 01-REVIEW.md re-review). Does not block phase closure."
|
||||
- "Frontmatter authoring gap: Plans 01-01..01-07 and 01-09 SUMMARY.md frontmatter requirements_completed arrays are empty; the milestone REQ-IDs (TD-01, TD-02, TD-03, TD-04, CLEAN-01) are not listed there. Coverage is satisfied via the Requirements Coverage table in 01-VERIFICATION.md, not via summary frontmatter."
|
||||
nyquist:
|
||||
compliant_phases: 0
|
||||
partial_phases: 1 # Phase 01: VALIDATION.md exists, nyquist_compliant=false with documented reason (QA-01 deferred to v2)
|
||||
missing_phases: 3 # Phases 02, 03, 04 (not started)
|
||||
overall: "partial"
|
||||
---
|
||||
|
||||
# Milestone v1.13.1 — Audit Report
|
||||
|
||||
**Milestone:** v1.13.1 — MemoChron Stabilization
|
||||
**Audited:** 2026-05-10
|
||||
**Status:** `gaps_found` — milestone is in progress; only 1 of 4 phases complete
|
||||
|
||||
## Summary
|
||||
|
||||
This audit was triggered while the milestone is still in progress. Phase 01 (Foundation) is complete and verified `passed`. Phases 02 (Security & Correctness), 03 (Date Parsing & Navigation Bugs), and 04 (UX Enhancements) have not been planned or executed — their directories do not exist in `.planning/phases/`.
|
||||
|
||||
Of 19 v1 requirements assigned to this milestone, **5 are satisfied** (Phase 1) and **14 are orphaned** (assigned to phases 2-4 but never verified by any phase).
|
||||
|
||||
The audit cannot pass: the milestone is not finished. This is not a regression — it is the expected outcome of running the audit before all phases are complete.
|
||||
|
||||
## Scores
|
||||
|
||||
| Dimension | Score | Notes |
|
||||
|-----------|-------|-------|
|
||||
| Requirements satisfied | 5/19 | Phase 1 reqs verified with code-level evidence |
|
||||
| Phases verified | 1/4 | Phase 1 only |
|
||||
| Cross-phase integration | 14/14 wired (Phase 01 internal) | No cross-phase dependencies broken; downstream phases not yet executed |
|
||||
| E2E flows | Phase 01 flows intact | calendar fetch / render / note creation / embedded views all preserved by Phase 01's refactors |
|
||||
|
||||
## Requirements Coverage (3-Source Cross-Reference)
|
||||
|
||||
For each requirement: Source A = REQUIREMENTS.md traceability checkbox; Source B = phase VERIFICATION.md Requirements Coverage table; Source C = phase SUMMARY.md `requirements_completed` frontmatter.
|
||||
|
||||
| Req | Phase | A: REQUIREMENTS.md | B: VERIFICATION.md | C: SUMMARY frontmatter | Final Status |
|
||||
|-----|-------|--------------------|--------------------|-----------------------|---------------|
|
||||
| TD-01 | 1 | `[ ]` | passed (SATISFIED, evidence in VERIFICATION) | missing | **satisfied** (VERIFICATION evidence; recommend tick `[x]` and add to frontmatter) |
|
||||
| TD-02 | 1 | `[ ]` | passed (SATISFIED, evidence in VERIFICATION) | missing | **satisfied** (VERIFICATION evidence; recommend tick `[x]` and add to frontmatter) |
|
||||
| TD-03 | 1 | `[ ]` | passed (SATISFIED, evidence in VERIFICATION) | missing | **satisfied** (VERIFICATION evidence; recommend tick `[x]` and add to frontmatter) |
|
||||
| TD-04 | 1 | `[ ]` | passed (SATISFIED, evidence in VERIFICATION) | missing | **satisfied** (VERIFICATION evidence; recommend tick `[x]` and add to frontmatter) |
|
||||
| CLEAN-01 | 1 | `[ ]` | passed (SATISFIED, evidence in VERIFICATION) | missing | **satisfied** (VERIFICATION evidence; recommend tick `[x]` and add to frontmatter) |
|
||||
| SEC-01 | 2 | `[ ]` | missing | missing | **orphaned** |
|
||||
| SEC-02 | 2 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-05 | 2 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-06 | 2 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-01 | 3 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-02 | 3 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-03 | 3 | `[ ]` | missing | missing | **orphaned** |
|
||||
| BUG-04 | 3 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-01 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-02 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-03 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-04 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-05 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
| ENH-06 | 4 | `[ ]` | missing | missing | **orphaned** |
|
||||
|
||||
**Note on Phase 1 final status:** Per the strict status determination matrix (passed VERIFICATION + missing SUMMARY frontmatter → "partial (verify manually)"), the matrix would flag these for manual verification. Manual verification has been done — `01-VERIFICATION.md` contains an explicit Requirements Coverage table mapping each REQ-ID to its source plan with code-level evidence, and the verification status is `passed`. They are therefore promoted to `satisfied`. The summary-frontmatter gap is recorded as a tech-debt item.
|
||||
|
||||
## Phase Verification Status
|
||||
|
||||
| Phase | Status | Verification | Plans | Score |
|
||||
|-------|--------|--------------|-------|-------|
|
||||
| 01 — Foundation | **passed** | `01-VERIFICATION.md` exists, status `passed` | 10/10 complete | 4/4 truths verified |
|
||||
| 02 — Security & Correctness | **not started** | (no directory) | 0/TBD | — |
|
||||
| 03 — Date Parsing & Navigation Bugs | **not started** | (no directory) | 0/TBD | — |
|
||||
| 04 — UX Enhancements | **not started** | (no directory) | 0/TBD | — |
|
||||
|
||||
## Cross-Phase Integration
|
||||
|
||||
Integration checker output (full report above the audit). Summary:
|
||||
|
||||
- **Phase 01 internal wiring:** All 14 expected cross-component connections verified WIRED end-to-end (lifecycle teardown chain, live-settings reads, plugin-owned timer cancellation, drag-listener cleanup).
|
||||
- **Cross-phase wiring (between completed phases):** N/A — only one phase complete.
|
||||
- **E2E flows:** Calendar fetch → render → cache, click-event → create-note, settings → live refresh, embedded code-block rendering — all intact post-Phase 01 refactors.
|
||||
- **Cross-phase wiring considerations for unstarted phases (informational, not failures):**
|
||||
- **BUG-06:** `CalendarService.isFetchingCalendars` re-entrancy guard already exists; `setBackgroundRefreshTimer` setter pre-clears any in-flight timer. Phase 2 must verify the guard covers the 100ms-delay window between schedule and fire.
|
||||
- **BUG-05:** `firstDayOfWeek` is already read live via `this.plugin.settings.firstDayOfWeek`, so Phase 2's `getStartOfWeek` fix will inherit live-settings propagation correctly.
|
||||
- **SEC-01 surface:** Active injection sites identified at `SettingsTab.ts:589, 592, 675, 678` (template-literal SVG with `${currentColor}`).
|
||||
- **SEC-02 surface:** `CalendarService.fetchCalendar` (396-400), `fetchLocalCalendar` (532), `NoteService.createEventNote` (75) still need consistent error handling.
|
||||
- **ENH-04 / ENH-05 surface:** `NoteService.formatTitle` and `EventTemplateVariables` left intact and ready for Phase 4 to plug into.
|
||||
|
||||
## Tech Debt
|
||||
|
||||
### Phase 01
|
||||
|
||||
- **`src/views/EmbeddedCalendarView.ts:15` — unused `CalendarEvent` import.** Pre-existing; surfaced as IN-01 in `01-REVIEW.md` re-review. Type-only import (esbuild tree-shakes), so no bundle impact. Does not block phase closure. One-line fix.
|
||||
- **Frontmatter authoring gap:** Plans 01-01..01-07 and 01-09 SUMMARY frontmatter `requirements_completed` arrays are empty. The milestone REQ-IDs (TD-01..TD-04, CLEAN-01) are not present. Coverage is satisfied via the Requirements Coverage table in `01-VERIFICATION.md`, but the 3-source cross-reference is degraded. Plans 01-08 and 01-10 list `WR-02-FIX` and `IN-01-FIX` (code-review fix labels), not milestone REQ-IDs.
|
||||
|
||||
## Nyquist Compliance
|
||||
|
||||
| Phase | VALIDATION.md | nyquist_compliant | Status | Action |
|
||||
|-------|---------------|-------------------|--------|--------|
|
||||
| 01 — Foundation | exists (`01-VALIDATION.md`) | false (with documented reason — no test framework in repo, QA-01 deferred to v2 per REQUIREMENTS.md Out of Scope) | PARTIAL | None — out-of-scope by milestone decision; static-analysis + build gates substitute for behavioral tests |
|
||||
| 02 — Security & Correctness | missing | — | MISSING | Will be created when phase is planned |
|
||||
| 03 — Date Parsing & Navigation Bugs | missing | — | MISSING | Will be created when phase is planned |
|
||||
| 04 — UX Enhancements | missing | — | MISSING | Will be created when phase is planned |
|
||||
|
||||
**Overall Nyquist:** `partial` — Phase 01 is intentionally non-compliant by milestone scope decision; Phases 2-4 unstarted.
|
||||
|
||||
## Why Status is `gaps_found`
|
||||
|
||||
Per the FAIL gate in the audit-milestone workflow: any `unsatisfied` requirement (here, 14 orphans) MUST force `gaps_found` status on the milestone audit.
|
||||
|
||||
This is the correct read of milestone state. Phase 01 is complete and clean; Phases 02-04 are unstarted; the milestone is not yet ready to close. Returning here after Phases 02-04 are executed and verified should flip status to `passed`.
|
||||
|
||||
## Recommended Next Steps
|
||||
|
||||
The audit-milestone workflow's standard remediation routing assumes most phases are complete with a few gap-closure phases needed. That routing does not fit this state — there is nothing to "close inline." The remediation here is to plan and execute the remaining three phases, in roadmap order.
|
||||
|
||||
### Continue the milestone (proper path)
|
||||
|
||||
1. `/gsd-phase 02` (or run `/gsd-discuss-phase 02` directly) — plan Phase 02 (Security & Correctness): SEC-01, SEC-02, BUG-05, BUG-06.
|
||||
2. `/gsd-discuss-phase 02` → `/gsd-plan-phase 02` → `/gsd-execute-phase 02`.
|
||||
3. After Phase 02 verifies passed, repeat for Phase 03 (BUG-01..BUG-04).
|
||||
4. After Phase 03 verifies passed, repeat for Phase 04 (ENH-01..ENH-06).
|
||||
5. Re-run `/gsd-audit-milestone` after Phase 04 verifies passed.
|
||||
6. If passed, run `/gsd-complete-milestone v1.13.1`.
|
||||
|
||||
### Optional cleanup before continuing
|
||||
|
||||
- Update `.planning/REQUIREMENTS.md` traceability checkboxes for Phase 1 reqs from `[ ]` → `[x]`.
|
||||
- Remove unused `CalendarEvent` import at `src/views/EmbeddedCalendarView.ts:15` (one-line fix; could be picked up incidentally during Phase 02).
|
||||
- Backfill `requirements_completed` frontmatter on Phase 01 plan summaries (low priority — does not affect runtime; only affects future audit clarity).
|
||||
|
||||
---
|
||||
|
||||
_Audit generated: 2026-05-10_
|
||||
_Audit tool: /gsd-audit-milestone_
|
||||
Loading…
Reference in a new issue