wip_new_notifications #196

Open
anomalist wants to merge 7 commits from wip_new_notifications into master
  1. 10
      .cursor/rules/core/base_context.mdc
  2. 6
      .cursor/rules/core/harbor_pilot_universal.mdc
  3. 4
      .cursor/rules/core/less_complex.mdc
  4. 4
      .cursor/rules/development/asset_configuration.mdc
  5. 2
      .cursor/rules/development/time.mdc
  6. 2
      .cursor/rules/development/time_implementation.mdc
  7. 96
      .cursor/rules/docs/documentation_references_model_agents.mdc
  8. 1
      .cursor/rules/docs/markdown_templates.mdc
  9. 56
      .cursor/rules/harbor_pilot_universal.mdc
  10. 2
      .cursor/rules/meta_bug_diagnosis.mdc
  11. 6
      .cursor/rules/meta_core_always_on.mdc
  12. 9
      .cursor/rules/meta_documentation.mdc
  13. 39
      .cursor/rules/playwright-test-investigation.mdc
  14. 2
      .cursor/rules/workflow/commit_messages.mdc
  15. 20
      .husky/pre-commit
  16. 41
      .husky/pre-push
  17. 69
      .markdownlint.json
  18. 34
      BUILDING.md
  19. 3
      README-PR-TEMPLATE.md
  20. 55
      README.md
  21. 22
      TASK_storage.md
  22. 21
      doc/GLOSSARY.md
  23. 1
      doc/README-BUILD-GUARD.md
  24. 80
      doc/README.md
  25. 10
      doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md
  26. 24
      doc/android-asset-validation.md
  27. 2
      doc/architecture-decisions.md
  28. 4
      doc/error-diagnostics-log.md
  29. 22
      doc/meta_rule_usage_guide.md
  30. 231
      doc/notification-system.md
  31. 551
      doc/web-push-cleanup-guide.md
  32. 5
      doc/z-index-guide.md
  33. 1
      package.json

10
.cursor/rules/core/base_context.mdc

@ -21,7 +21,7 @@ alwaysApply: false
## Purpose ## Purpose
All interactions must *increase the human's competence over time* while All interactions must _increase the human's competence over time_ while
completing the task efficiently. The model may handle menial work and memory completing the task efficiently. The model may handle menial work and memory
extension, but must also promote learning, autonomy, and healthy work habits. extension, but must also promote learning, autonomy, and healthy work habits.
The model should also **encourage human interaction and collaboration** rather The model should also **encourage human interaction and collaboration** rather
@ -31,7 +31,7 @@ machine-driven steps.
## Principles ## Principles
1. Competence over convenience: finish the task *and* leave the human more 1. Competence over convenience: finish the task _and_ leave the human more
capable next time. capable next time.
@ -75,7 +75,7 @@ assumptions if unanswered.
### timebox_minutes ### timebox_minutes
*integer or null* — When set to a positive integer (e.g., `5`), this acts _integer or null_ — When set to a positive integer (e.g., `5`), this acts
as a **time budget** guiding the model to prioritize delivering the most as a **time budget** guiding the model to prioritize delivering the most
essential parts of the task within that constraint. essential parts of the task within that constraint.
@ -91,7 +91,7 @@ Behavior when set:
3. **Signal Skipped Depth** — Omitted details should be listed under 3. **Signal Skipped Depth** — Omitted details should be listed under
*Deferred for depth*. _Deferred for depth_.
4. **Order by Value** — Start with blocking or high-value items, then 4. **Order by Value** — Start with blocking or high-value items, then
@ -198,7 +198,7 @@ Default: Doer + short Mentor notes.
## Self-Check (model, before responding) ## Self-Check (model, before responding)
- [ ] Task done *and* at least one competence lever included (≤120 words - [ ] Task done _and_ at least one competence lever included (≤120 words
total) total)
- [ ] At least one collaboration/discussion hook present - [ ] At least one collaboration/discussion hook present
- [ ] Output follows the **Output Contract** sections - [ ] Output follows the **Output Contract** sections

6
.cursor/rules/core/harbor_pilot_universal.mdc

@ -53,7 +53,7 @@ evidence-backed steps**.
- **Verifiable Outputs**: Include expected results, status codes, or - **Verifiable Outputs**: Include expected results, status codes, or
error messages error messages
- **Cite evidence** for *Works/Doesn't* items (timestamps, filenames, - **Cite evidence** for _Works/Doesn't_ items (timestamps, filenames,
line numbers, IDs/status codes, or logs). line numbers, IDs/status codes, or logs).
## Required Sections ## Required Sections
@ -181,8 +181,8 @@ Before publishing, verify:
--- ---
**Status**: 🚢 ACTIVE — General ruleset extending *Base Context — Human **Status**: 🚢 ACTIVE — General ruleset extending _Base Context — Human
Competence First* Competence First_
**Priority**: Critical **Priority**: Critical
**Estimated Effort**: Ongoing reference **Estimated Effort**: Ongoing reference

4
.cursor/rules/core/less_complex.mdc

@ -16,7 +16,7 @@ language: Match repository languages and conventions
where it occurs; avoid new layers, indirection, or patterns unless where it occurs; avoid new layers, indirection, or patterns unless
strictly necessary. strictly necessary.
2. **Keep scope tight.** Implement only what is needed to satisfy the 2. **Keep scope tight.** Implement only what is needed to satisfy the
acceptance criteria and tests for *this* issue. acceptance criteria and tests for _this_ issue.
3. **Avoid speculative abstractions.** Use the **Rule of Three**: 3. **Avoid speculative abstractions.** Use the **Rule of Three**:
don't extract helpers/patterns until the third concrete usage proves don't extract helpers/patterns until the third concrete usage proves
the shape. the shape.
@ -29,7 +29,7 @@ language: Match repository languages and conventions
7. **Targeted tests only.** Add the smallest set of tests that prove 7. **Targeted tests only.** Add the smallest set of tests that prove
the fix and guard against regression; don't rewrite suites. the fix and guard against regression; don't rewrite suites.
8. **Document the "why enough."** Include a one-paragraph note 8. **Document the "why enough."** Include a one-paragraph note
explaining why this minimal solution is sufficient *now*. explaining why this minimal solution is sufficient _now_.
## Future-Proofing Requires Evidence + Discussion ## Future-Proofing Requires Evidence + Discussion

4
.cursor/rules/development/asset_configuration.mdc

@ -9,8 +9,8 @@ alwaysApply: false
**Date**: 2025-08-19 **Date**: 2025-08-19
**Status**: 🎯 **ACTIVE** - Asset management guidelines **Status**: 🎯 **ACTIVE** - Asset management guidelines
*Scope: Assets Only (icons, splashes, image pipelines) — not overall build _Scope: Assets Only (icons, splashes, image pipelines) — not overall build
orchestration* orchestration_
## Intent ## Intent

2
.cursor/rules/development/time.mdc

@ -40,7 +40,7 @@ feature development, issue investigations, ADRs, and documentation**.
`2025-08-17`). `2025-08-17`).
- Avoid ambiguous terms like *recently*, *last month*, or *soon*. - Avoid ambiguous terms like _recently_, _last month_, or _soon_.
- For time-based experiments (e.g., A/B tests), always include: - For time-based experiments (e.g., A/B tests), always include:

2
.cursor/rules/development/time_implementation.mdc

@ -19,7 +19,7 @@
- Optionally provide UTC alongside if context requires cross-team clarity. - Optionally provide UTC alongside if context requires cross-team clarity.
- When interpreting relative terms like *now*, *today*, *last week*: - When interpreting relative terms like _now_, _today_, _last week_:
- Resolve them against the **developer's current time**. - Resolve them against the **developer's current time**.

96
.cursor/rules/docs/documentation_references_model_agents.mdc

@ -0,0 +1,96 @@
---
title: Documentation, References, and Model Agent Use
version: 1.1
alwaysApply: true
scope: code, project-plans
---
# Directive on Documentation, References, and Model Agent Use in Code and Project Plans
To ensure clarity, efficiency, and high-value documentation within code and project plans—and to leverage **model agents** (AI- or automation-based assistants) effectively—contributors must follow these rules:
---
## 1. Documentation and References Must Add Clear Value
- Only include documentation, comments, or reference links when they provide _new, meaningful information_ that assists understanding or decision-making.
- Avoid duplicating content already obvious in the codebase, version history, or linked project documents.
---
## 2. Eliminate Redundant or Noisy References
- Remove references that serve no purpose beyond filling space.
- Model agents may automatically flag and suggest removal of trivial references (e.g., links to unchanged boilerplate or self-evident context).
---
## 3. Explicit Role of Model Agents
Model agents are **active participants** in documentation quality control. Their tasks include:
- **Relevance Evaluation**: Automatically analyze references for their substantive contribution before inclusion.
- **Redundancy Detection**: Flag duplicate or trivial references across commits, files, or tasks.
- **Context Linking**: Suggest appropriate higher-level docs (designs, ADRs, meeting notes) when a code change touches multi-stage or cross-team items.
- **Placement Optimization**: Recommend centralization of references (e.g., in plan overviews, ADRs, or merge commit messages) rather than scattered low-value inline references.
- **Consistency Monitoring**: Ensure references align with team standards (e.g., ADR template, architecture repo, or external policy documents).
Contributors must treat agent recommendations as **first-pass reviews** but remain accountable for final human judgment.
---
## 4. Contextual References for Complex Items
- Use **centralized references** for multi-stage features (e.g., architectural docs, research threads).
- Keep inline code comments light; push broader context into centralized documents.
- Model agents may auto-summarize complex chains of discussion and attach them as a single reference point.
---
## 5. Centralization of Broader Context
- Store overarching context (design docs, proposals, workflows) in accessible, well-indexed places.
- Model agents should assist by **generating reference maps** that track where docs are cited across the codebase.
---
## 6. Focused Documentation
- Documentation should explain **why** and **how** decisions are made, not just what was changed.
- Model agents can auto-generate first-pass explanations from commit metadata, diffs, and linked issues—but humans must refine them for accuracy and intent.
---
## 7. Review and Accountability
- Reviewers and team leads must reject submissions containing unnecessary or low-quality documentation.
- Model agent outputs are aids, not replacements—contributors remain responsible for **final clarity and relevance**.
---
## 8. Continuous Improvement and Agent Feedback Loops
- Encourage iterative development of model agents so their evaluations become more precise over time.
- Contributions should include **feedback on agent suggestions** (e.g., accepted, rejected, or corrected) to train better future outputs.
- Agents should log patterns of “rejected” suggestions for refinement.
---
## 9. Workflow Overview (Mermaid Diagram)
```mermaid
flowchart TD
A[Contributor] -->|Writes Code & Draft Docs| B[Model Agent]
B -->|Evaluates References| C{Relevant?}
C -->|Yes| D[Suggest Placement & Context Links]
C -->|No| E[Flag Redundancy / Noise]
D --> F[Contributor Refines Docs]
E --> F
F --> G[Reviewer]
G -->|Approves / Requests Revisions| H[Final Documentation]
G -->|Feedback on Agent Suggestions| B
```
---
✅ **Outcome:** By integrating disciplined contributor standards with **model agent augmentation**, the team achieves documentation that is consistently _relevant, concise, centralized, and decision-focused_. AI ensures coverage and noise reduction, while humans ensure precision and judgment.

1
.cursor/rules/docs/markdown_templates.mdc

@ -192,6 +192,7 @@ Summary of key concepts and skills.
Where to apply this knowledge next. Where to apply this knowledge next.
``` ```
- [ ] Integration tests - [ ] Integration tests
- [ ] E2E tests - [ ] E2E tests

56
.cursor/rules/harbor_pilot_universal.mdc

@ -16,9 +16,10 @@ inherits: base_context.mdc
**Author**: System/Shared **Author**: System/Shared
**Date**: 2025-08-21 (UTC) **Date**: 2025-08-21 (UTC)
**Status**: 🚢 ACTIVE — General ruleset extending *Base Context — Human Competence First* **Status**: 🚢 ACTIVE — General ruleset extending _Base Context — Human Competence First_
> **Alignment with Base Context** > **Alignment with Base Context**
>
> - **Purpose fit**: Prioritizes human competence and collaboration while delivering reproducible artifacts. > - **Purpose fit**: Prioritizes human competence and collaboration while delivering reproducible artifacts.
> - **Output Contract**: This directive **adds universal constraints** for any technical topic while **inheriting** the Base Context contract sections. > - **Output Contract**: This directive **adds universal constraints** for any technical topic while **inheriting** the Base Context contract sections.
> - **Toggles honored**: Uses the same toggle semantics; defaults above can be overridden by the caller. > - **Toggles honored**: Uses the same toggle semantics; defaults above can be overridden by the caller.
@ -26,9 +27,11 @@ inherits: base_context.mdc
--- ---
## Objective ## Objective
Produce a **developer-grade, reproducible guide** for any technical topic that onboards a competent practitioner **without meta narration** and **with evidence-backed steps**. Produce a **developer-grade, reproducible guide** for any technical topic that onboards a competent practitioner **without meta narration** and **with evidence-backed steps**.
## Scope & Constraints ## Scope & Constraints
- **One Markdown document** as the deliverable. - **One Markdown document** as the deliverable.
- Use **absolute dates** in **UTC** (e.g., `2025-08-21T14:22Z`) — avoid “today/yesterday”. - Use **absolute dates** in **UTC** (e.g., `2025-08-21T14:22Z`) — avoid “today/yesterday”.
- Include at least **one diagram** (Mermaid preferred). Choose the most fitting type: - Include at least **one diagram** (Mermaid preferred). Choose the most fitting type:
@ -37,10 +40,11 @@ Produce a **developer-grade, reproducible guide** for any technical topic that o
- **APIs**: `curl` + one client library (e.g., `httpx` for Python). - **APIs**: `curl` + one client library (e.g., `httpx` for Python).
- **CLIs**: literal command blocks and expected output snippets. - **CLIs**: literal command blocks and expected output snippets.
- **Code**: minimal, self-contained samples (language appropriate). - **Code**: minimal, self-contained samples (language appropriate).
- Cite **evidence** for *Works/Doesn’t* items (timestamps, filenames, line numbers, IDs/status codes, or logs). - Cite **evidence** for _Works/Doesn’t_ items (timestamps, filenames, line numbers, IDs/status codes, or logs).
- If something is unknown, output `TODO:<missing>` — **never invent**. - If something is unknown, output `TODO:<missing>` — **never invent**.
## Required Sections (extends Base Output Contract) ## Required Sections (extends Base Output Contract)
Follow this exact order **after** the Base Contract’s **Objective → Result → Use/Run** headers: Follow this exact order **after** the Base Contract’s **Objective → Result → Use/Run** headers:
1. **Context & Scope** 1. **Context & Scope**
@ -52,9 +56,9 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
4. **Architecture / Process Overview** 4. **Architecture / Process Overview**
- Short prose + **one diagram** selected from the list above. - Short prose + **one diagram** selected from the list above.
5. **Interfaces & Contracts (choose one)** 5. **Interfaces & Contracts (choose one)**
- **API-based**: Endpoint table (*Step, Method, Path/URL, Auth, Key Headers/Params, Sample Req/Resp ref*). - **API-based**: Endpoint table (_Step, Method, Path/URL, Auth, Key Headers/Params, Sample Req/Resp ref_).
- **Data/Files**: I/O contract table (*Source, Format, Schema/Columns, Size, Validation rules*). - **Data/Files**: I/O contract table (_Source, Format, Schema/Columns, Size, Validation rules_).
- **Systems/Hardware**: Interfaces table (*Port/Bus, Protocol, Voltage/Timing, Constraints*). - **Systems/Hardware**: Interfaces table (_Port/Bus, Protocol, Voltage/Timing, Constraints_).
6. **Repro: End-to-End Procedure** 6. **Repro: End-to-End Procedure**
- Minimal copy-paste steps with code/commands and **expected outputs**. - Minimal copy-paste steps with code/commands and **expected outputs**.
7. **What Works (with Evidence)** 7. **What Works (with Evidence)**
@ -69,16 +73,19 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
- Canonical docs, specs, tickets, prior analyses. - Canonical docs, specs, tickets, prior analyses.
> **Competence Hooks (per Base Context; keep lightweight):** > **Competence Hooks (per Base Context; keep lightweight):**
> - *Why this works* (≤3 bullets) — core invariants or guarantees. >
> - *Common pitfalls* (≤3 bullets) — the traps we saw in evidence. > - _Why this works_ (≤3 bullets) — core invariants or guarantees.
> - *Next skill unlock* (1 line) — the next capability to implement/learn. > - _Common pitfalls_ (≤3 bullets) — the traps we saw in evidence.
> - *Teach-back* (1 line) — prompt the reader to restate the flow/architecture. > - _Next skill unlock_ (1 line) — the next capability to implement/learn.
> - _Teach-back_ (1 line) — prompt the reader to restate the flow/architecture.
> **Collaboration Hooks (per Base Context):** > **Collaboration Hooks (per Base Context):**
>
> - Name reviewers for **Interfaces & Contracts** and the **diagram**. > - Name reviewers for **Interfaces & Contracts** and the **diagram**.
> - Short **sign-off checklist** before merging/publishing the guide. > - Short **sign-off checklist** before merging/publishing the guide.
## Do / Don’t (Base-aligned) ## Do / Don’t (Base-aligned)
- **Do** quantify progress only against a defined scope with acceptance criteria. - **Do** quantify progress only against a defined scope with acceptance criteria.
- **Do** include minimal sample payloads/headers or I/O schemas; redact sensitive values. - **Do** include minimal sample payloads/headers or I/O schemas; redact sensitive values.
- **Do** keep commentary lean; if timeboxed, move depth to **Deferred for depth**. - **Do** keep commentary lean; if timeboxed, move depth to **Deferred for depth**.
@ -86,6 +93,7 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
- **Don’t** include IDE-specific chatter or internal rules unrelated to the task. - **Don’t** include IDE-specific chatter or internal rules unrelated to the task.
## Validation Checklist (self-check before returning) ## Validation Checklist (self-check before returning)
- [ ] All Required Sections present and ordered. - [ ] All Required Sections present and ordered.
- [ ] Diagram compiles (basic Mermaid syntax) and fits the problem. - [ ] Diagram compiles (basic Mermaid syntax) and fits the problem.
- [ ] If API-based, **Auth** and **Key Headers/Params** are listed for each endpoint. - [ ] If API-based, **Auth** and **Key Headers/Params** are listed for each endpoint.
@ -96,6 +104,7 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
- [ ] Base **Output Contract** sections satisfied (Objective/Result/Use/Run/Competence/Collaboration/Assumptions/References). - [ ] Base **Output Contract** sections satisfied (Objective/Result/Use/Run/Competence/Collaboration/Assumptions/References).
## Universal Template (fill-in) ## Universal Template (fill-in)
```markdown ```markdown
# <Title> — Working Notes (As of YYYY-MM-DDTHH:MMZ) # <Title> — Working Notes (As of YYYY-MM-DDTHH:MMZ)
@ -132,37 +141,46 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
``` ```
## Interfaces & Contracts ## Interfaces & Contracts
### If API-based ### If API-based
| Step | Method | Path/URL | Auth | Key Headers/Params | Sample | | Step | Method | Path/URL | Auth | Key Headers/Params | Sample |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| <…> | <…> | <…> | <…> | <…> | below | | <…> | <…> | <…> | <…> | <…> | below |
### If Data/Files ### If Data/Files
| Source | Format | Schema/Columns | Size | Validation | | Source | Format | Schema/Columns | Size | Validation |
|---|---|---|---|---| |---|---|---|---|---|
| <…> | <…> | <…> | <…> | <…> | | <…> | <…> | <…> | <…> | <…> |
### If Systems/Hardware ### If Systems/Hardware
| Interface | Protocol | Timing/Voltage | Constraints | Notes | | Interface | Protocol | Timing/Voltage | Constraints | Notes |
|---|---|---|---|---| |---|---|---|---|---|
| <…> | <…> | <…> | <…> | <…> | | <…> | <…> | <…> | <…> | <…> |
## Repro: End-to-End Procedure ## Repro: End-to-End Procedure
```bash ```bash
# commands / curl examples (redacted where necessary) # commands / curl examples (redacted where necessary)
``` ```
```python ```python
# minimal client library example (language appropriate) # minimal client library example (language appropriate)
``` ```
> Expected output: <snippet/checks> > Expected output: <snippet/checks>
## What Works (Evidence) ## What Works (Evidence)
- ✅ <short statement> - ✅ <short statement>
- **Time**: <YYYY-MM-DDTHH:MMZ> - **Time**: <YYYY-MM-DDTHH:MMZ>
- **Evidence**: file/line/log or request id/status - **Evidence**: file/line/log or request id/status
- **Verify at**: <where> - **Verify at**: <where>
## What Doesn’t (Evidence & Hypotheses) ## What Doesn’t (Evidence & Hypotheses)
- ❌ <short failure> at `<component/endpoint/file>` - ❌ <short failure> at `<component/endpoint/file>`
- **Time**: <YYYY-MM-DDTHH:MMZ> - **Time**: <YYYY-MM-DDTHH:MMZ>
- **Evidence**: <snippet/id/status> - **Evidence**: <snippet/id/status>
@ -170,38 +188,46 @@ Follow this exact order **after** the Base Contract’s **Objective → Result
- **Next probe**: <short> - **Next probe**: <short>
## Risks, Limits, Assumptions ## Risks, Limits, Assumptions
<bullets: limits, security boundaries, retries/backoff, idempotency, SLOs> <bullets: limits, security boundaries, retries/backoff, idempotency, SLOs>
## Next Steps ## Next Steps
| Owner | Task | Exit Criteria | Target Date (UTC) | | Owner | Task | Exit Criteria | Target Date (UTC) |
|---|---|---|---| |---|---|---|---|
| <name> | <action> | <measurable outcome> | <YYYY-MM-DD> | | <name> | <action> | <measurable outcome> | <YYYY-MM-DD> |
## References ## References
<links/titles> <links/titles>
## Competence Hooks ## Competence Hooks
- *Why this works*: <≤3 bullets>
- *Common pitfalls*: <≤3 bullets> - _Why this works_: <≤3 bullets>
- *Next skill unlock*: <1 line> - _Common pitfalls_: <≤3 bullets>
- *Teach-back*: <1 line> - _Next skill unlock_: <1 line>
- _Teach-back_: <1 line>
## Collaboration Hooks ## Collaboration Hooks
- Reviewers: <names/roles> - Reviewers: <names/roles>
- Sign-off checklist: <≤5 checks> - Sign-off checklist: <≤5 checks>
## Assumptions & Limits ## Assumptions & Limits
<bullets> <bullets>
## Deferred for depth ## Deferred for depth
<park deeper material here to respect timeboxing> <park deeper material here to respect timeboxing>
``` ```
--- ---
**Notes for Implementers:** **Notes for Implementers:**
- Respect Base *Do-Not* (no filler, no invented facts, no censorship).
- Respect Base _Do-Not_ (no filler, no invented facts, no censorship).
- Prefer clarity over completeness when timeboxed; capture unknowns explicitly. - Prefer clarity over completeness when timeboxed; capture unknowns explicitly.
- Apply historical comment management rules (see `.cursor/rules/historical_comment_management.mdc`) - Apply historical comment management rules (see `.cursor/rules/historical_comment_management.mdc`)
- Apply realistic time estimation rules (see `.cursor/rules/realistic_time_estimation.mdc`) - Apply realistic time estimation rules (see `.cursor/rules/realistic_time_estimation.mdc`)
- Apply Playwright test investigation rules (see `.cursor/rules/playwright_test_investigation.mdc`) - Apply Playwright test investigation rules (see `.cursor/rules/playwright_test_investigation.mdc`)

2
.cursor/rules/meta_bug_diagnosis.mdc

@ -82,6 +82,7 @@ common investigation pitfalls.
### **Safe Diagnosis Commands** ### **Safe Diagnosis Commands**
✅ **Safe to use during diagnosis:** ✅ **Safe to use during diagnosis:**
- `npm run lint-fix` - Syntax and style checking - `npm run lint-fix` - Syntax and style checking
- `npm run type-check` - TypeScript validation (if available) - `npm run type-check` - TypeScript validation (if available)
- `git status` - Version control status - `git status` - Version control status
@ -90,6 +91,7 @@ common investigation pitfalls.
- `grep_search` - Text pattern searching - `grep_search` - Text pattern searching
❌ **Never use during diagnosis:** ❌ **Never use during diagnosis:**
- `npm run build:web` - Blocks chat - `npm run build:web` - Blocks chat
- `npm run build:electron` - Blocks chat - `npm run build:electron` - Blocks chat
- `npm run build:capacitor` - Blocks chat - `npm run build:capacitor` - Blocks chat

6
.cursor/rules/meta_core_always_on.mdc

@ -36,6 +36,7 @@ that are essential for all AI interactions.
**This meta-rule enforces current workflow mode constraints for all interactions:** **This meta-rule enforces current workflow mode constraints for all interactions:**
### **Current Workflow State** ### **Current Workflow State**
```json ```json
{ {
"workflowState": { "workflowState": {
@ -62,26 +63,31 @@ that are essential for all AI interactions.
### **Mode-Specific Enforcement** ### **Mode-Specific Enforcement**
**Diagnosis Mode (read_only):** **Diagnosis Mode (read_only):**
- ❌ **Forbidden**: File modification, code creation, build commands, git commits - ❌ **Forbidden**: File modification, code creation, build commands, git commits
- ✅ **Allowed**: File reading, code analysis, investigation, documentation - ✅ **Allowed**: File reading, code analysis, investigation, documentation
- **Response**: Guide user toward investigation and analysis, not implementation - **Response**: Guide user toward investigation and analysis, not implementation
**Fixing Mode (implementation):** **Fixing Mode (implementation):**
- ✅ **Allowed**: File modification, code creation, build commands, testing, git commits - ✅ **Allowed**: File modification, code creation, build commands, testing, git commits
- ❌ **Forbidden**: None (full implementation mode) - ❌ **Forbidden**: None (full implementation mode)
- **Response**: Proceed with implementation and testing - **Response**: Proceed with implementation and testing
**Planning Mode (design_only):** **Planning Mode (design_only):**
- ❌ **Forbidden**: Implementation, coding, building, deployment - ❌ **Forbidden**: Implementation, coding, building, deployment
- ✅ **Allowed**: Analysis, design, estimation, documentation, architecture - ✅ **Allowed**: Analysis, design, estimation, documentation, architecture
- **Response**: Focus on planning and design, not implementation - **Response**: Focus on planning and design, not implementation
**Research Mode (investigation):** **Research Mode (investigation):**
- ❌ **Forbidden**: File modification, implementation, deployment - ❌ **Forbidden**: File modification, implementation, deployment
- ✅ **Allowed**: Investigation, analysis, research, documentation - ✅ **Allowed**: Investigation, analysis, research, documentation
- **Response**: Focus on investigation and analysis - **Response**: Focus on investigation and analysis
**Documentation Mode (writing_only):** **Documentation Mode (writing_only):**
- ❌ **Forbidden**: Implementation, coding, building, deployment - ❌ **Forbidden**: Implementation, coding, building, deployment
- ✅ **Allowed**: Writing, editing, formatting, structuring, reviewing - ✅ **Allowed**: Writing, editing, formatting, structuring, reviewing
- **Response**: Focus on documentation creation and improvement - **Response**: Focus on documentation creation and improvement

9
.cursor/rules/meta_documentation.mdc

@ -51,6 +51,7 @@ providing technical descriptions.
## When to Use ## When to Use
**Use this meta-rule when**: **Use this meta-rule when**:
- Writing new documentation - Writing new documentation
- Updating existing documentation - Updating existing documentation
- Creating technical guides - Creating technical guides
@ -107,6 +108,7 @@ providing technical descriptions.
### **Document Structure** ### **Document Structure**
**Mandatory Sections**: **Mandatory Sections**:
- **Overview**: Clear purpose and scope with educational context - **Overview**: Clear purpose and scope with educational context
- **Why This Matters**: Business value and user benefit explanation - **Why This Matters**: Business value and user benefit explanation
- **Core Concepts**: Fundamental understanding before implementation - **Core Concepts**: Fundamental understanding before implementation
@ -116,6 +118,7 @@ providing technical descriptions.
- **Next Steps**: Where to go from here - **Next Steps**: Where to go from here
**Optional Sections**: **Optional Sections**:
- **Background**: Historical context and evolution - **Background**: Historical context and evolution
- **Alternatives**: Other approaches and trade-offs - **Alternatives**: Other approaches and trade-offs
- **Advanced Topics**: Deep dive into complex scenarios - **Advanced Topics**: Deep dive into complex scenarios
@ -124,6 +127,7 @@ providing technical descriptions.
### **Writing Style** ### **Writing Style**
**Educational Approach**: **Educational Approach**:
- **Conversational tone**: Write as if explaining to a colleague - **Conversational tone**: Write as if explaining to a colleague
- **Progressive disclosure**: Start simple, add complexity gradually - **Progressive disclosure**: Start simple, add complexity gradually
- **Active voice**: "You can do this" not "This can be done" - **Active voice**: "You can do this" not "This can be done"
@ -131,6 +135,7 @@ providing technical descriptions.
- **Analogies**: Use familiar concepts to explain complex ideas - **Analogies**: Use familiar concepts to explain complex ideas
**Technical Accuracy**: **Technical Accuracy**:
- **Precise language**: Use exact technical terms consistently - **Precise language**: Use exact technical terms consistently
- **Code examples**: Working, tested code snippets - **Code examples**: Working, tested code snippets
- **Version information**: Specify applicable versions and platforms - **Version information**: Specify applicable versions and platforms
@ -139,6 +144,7 @@ providing technical descriptions.
### **Content Quality Standards** ### **Content Quality Standards**
**Educational Value**: **Educational Value**:
- [ ] **Concept clarity**: Reader understands the fundamental idea - [ ] **Concept clarity**: Reader understands the fundamental idea
- [ ] **Context relevance**: Reader knows when to apply the knowledge - [ ] **Context relevance**: Reader knows when to apply the knowledge
- [ ] **Practical application**: Reader can implement the solution - [ ] **Practical application**: Reader can implement the solution
@ -146,6 +152,7 @@ providing technical descriptions.
- [ ] **Next steps**: Reader knows where to continue learning - [ ] **Next steps**: Reader knows where to continue learning
**Technical Accuracy**: **Technical Accuracy**:
- [ ] **Fact verification**: All technical details are correct - [ ] **Fact verification**: All technical details are correct
- [ ] **Code validation**: Examples compile and run correctly - [ ] **Code validation**: Examples compile and run correctly
- [ ] **Version compatibility**: Platform and version requirements clear - [ ] **Version compatibility**: Platform and version requirements clear
@ -183,6 +190,7 @@ providing technical descriptions.
### **Review Checklist** ### **Review Checklist**
**Educational Quality**: **Educational Quality**:
- [ ] **Clear learning objective**: What will the reader learn? - [ ] **Clear learning objective**: What will the reader learn?
- [ ] **Appropriate complexity**: Matches target audience knowledge - [ ] **Appropriate complexity**: Matches target audience knowledge
- [ ] **Progressive disclosure**: Information builds logically - [ ] **Progressive disclosure**: Information builds logically
@ -190,6 +198,7 @@ providing technical descriptions.
- [ ] **Common questions**: Anticipates and answers reader questions - [ ] **Common questions**: Anticipates and answers reader questions
**Technical Quality**: **Technical Quality**:
- [ ] **Accuracy**: All technical details verified - [ ] **Accuracy**: All technical details verified
- [ ] **Completeness**: Covers all necessary information - [ ] **Completeness**: Covers all necessary information
- [ ] **Consistency**: Terminology and formatting consistent - [ ] **Consistency**: Terminology and formatting consistent

39
.cursor/rules/playwright-test-investigation.mdc

@ -9,26 +9,31 @@ alwaysApply: false
**Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines **Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines
## Objective ## Objective
Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity. Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity.
## Context & Scope ## Context & Scope
- **Audience**: Developers debugging Playwright test failures - **Audience**: Developers debugging Playwright test failures
- **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues - **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues
- **Out of scope**: Test writing best practices, CI/CD configuration - **Out of scope**: Test writing best practices, CI/CD configuration
## Artifacts & Links ## Artifacts & Links
- Test results: `test-results/` directory - Test results: `test-results/` directory
- Error context: `error-context.md` files with page snapshots - Error context: `error-context.md` files with page snapshots
- Trace files: `trace.zip` files for failed tests - Trace files: `trace.zip` files for failed tests
- HTML reports: Interactive test reports with screenshots - HTML reports: Interactive test reports with screenshots
## Environment & Preconditions ## Environment & Preconditions
- OS/Runtime: Linux/Windows/macOS with Node.js - OS/Runtime: Linux/Windows/macOS with Node.js
- Versions: Playwright test framework, browser drivers - Versions: Playwright test framework, browser drivers
- Services: Local test server (localhost:8080), test data setup - Services: Local test server (localhost:8080), test data setup
- Auth mode: None required for test investigation - Auth mode: None required for test investigation
## Architecture / Process Overview ## Architecture / Process Overview
Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis. Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis.
```mermaid ```mermaid
@ -57,6 +62,7 @@ flowchart TD
## Interfaces & Contracts ## Interfaces & Contracts
### Test Results Structure ### Test Results Structure
| Component | Format | Content | Validation | | Component | Format | Content | Validation |
|---|---|---|---| |---|---|---|---|
| Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations | | Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations |
@ -65,6 +71,7 @@ flowchart TD
| JSON Results | JSON | Machine-readable results | Parse for automated analysis | | JSON Results | JSON | Machine-readable results | Parse for automated analysis |
### Investigation Commands ### Investigation Commands
| Step | Command | Expected Output | Notes | | Step | Command | Expected Output | Notes |
|---|---|---|---| |---|---|---|---|
| Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns | | Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns |
@ -74,6 +81,7 @@ flowchart TD
## Repro: End-to-End Investigation Procedure ## Repro: End-to-End Investigation Procedure
### 1. Locate Failed Test Results ### 1. Locate Failed Test Results
```bash ```bash
# Find all results for a specific test # Find all results for a specific test
find test-results -name "*test-name*" -type d find test-results -name "*test-name*" -type d
@ -83,6 +91,7 @@ find test-results -name "error-context.md" | head -5
``` ```
### 2. Analyze Error Context ### 2. Analyze Error Context
```bash ```bash
# Read error context for specific test # Read error context for specific test
cat test-results/test-name-test-description-browser/error-context.md cat test-results/test-name-test-description-browser/error-context.md
@ -92,6 +101,7 @@ grep -A 10 -B 5 "button.*Yes\|button.*No" test-results/*/error-context.md
``` ```
### 3. Check Trace Files ### 3. Check Trace Files
```bash ```bash
# List available trace files # List available trace files
find test-results -name "*.zip" | grep trace find test-results -name "*.zip" | grep trace
@ -101,6 +111,7 @@ npx playwright show-trace test-results/test-name/trace.zip
``` ```
### 4. Investigate Selector Issues ### 4. Investigate Selector Issues
```typescript ```typescript
// Check for multiple elements with same text // Check for multiple elements with same text
await page.locator('button:has-text("Yes")').count(); // Should be 1 await page.locator('button:has-text("Yes")').count(); // Should be 1
@ -110,6 +121,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
``` ```
## What Works (Evidence) ## What Works (Evidence)
- ✅ **Error context files** provide page snapshots showing exact DOM state at failure - ✅ **Error context files** provide page snapshots showing exact DOM state at failure
- **Time**: 2025-08-21T14:22Z - **Time**: 2025-08-21T14:22Z
- **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible - **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible
@ -126,6 +138,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
- **Verify at**: Error context markdown files - **Verify at**: Error context markdown files
## What Doesn't (Evidence & Hypotheses) ## What Doesn't (Evidence & Hypotheses)
- ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161` - ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161`
- **Time**: 2025-08-21T14:22Z - **Time**: 2025-08-21T14:22Z
- **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data" - **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data"
@ -139,12 +152,14 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
- **Next probe**: Implement alert queuing or prevent overlapping alerts - **Next probe**: Implement alert queuing or prevent overlapping alerts
## Risks, Limits, Assumptions ## Risks, Limits, Assumptions
- **Trace file size**: Large trace files may impact storage and analysis time - **Trace file size**: Large trace files may impact storage and analysis time
- **Browser compatibility**: Trace viewer requires specific browser support - **Browser compatibility**: Trace viewer requires specific browser support
- **Test isolation**: Shared state between tests may affect investigation results - **Test isolation**: Shared state between tests may affect investigation results
- **Timing sensitivity**: Tests may pass/fail based on system performance - **Timing sensitivity**: Tests may pass/fail based on system performance
## Next Steps ## Next Steps
| Owner | Task | Exit Criteria | Target Date (UTC) | | Owner | Task | Exit Criteria | Target Date (UTC) |
|---|---|---|---| |---|---|---|---|
| Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 | | Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 |
@ -152,21 +167,25 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
| Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 | | Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 |
## References ## References
- [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer) - [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer)
- [Playwright Test Results](https://playwright.dev/docs/test-reporters) - [Playwright Test Results](https://playwright.dev/docs/test-reporters)
- [Test Investigation Workflow](./research_diagnostic.mdc) - [Test Investigation Workflow](./research_diagnostic.mdc)
## Competence Hooks ## Competence Hooks
- **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes - **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes
- **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts - **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts
- **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows - **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows
- **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?" - **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?"
## Collaboration Hooks ## Collaboration Hooks
- **Reviewers**: QA team, test automation engineers - **Reviewers**: QA team, test automation engineers
- **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested - **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested
## Assumptions & Limits ## Assumptions & Limits
- Test results directory structure follows Playwright conventions - Test results directory structure follows Playwright conventions
- Trace files are enabled in configuration (`trace: "retain-on-failure"`) - Trace files are enabled in configuration (`trace: "retain-on-failure"`)
- Error context files contain valid YAML page snapshots - Error context files contain valid YAML page snapshots
@ -178,6 +197,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
**Priority**: High **Priority**: High
**Maintainer**: Development team **Maintainer**: Development team
**Next Review**: 2025-09-21 **Next Review**: 2025-09-21
# Playwright Test Investigation — Harbor Pilot Directive # Playwright Test Investigation — Harbor Pilot Directive
**Author**: Matthew Raymer **Author**: Matthew Raymer
@ -185,26 +205,31 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
**Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines **Status**: 🎯 **ACTIVE** - Playwright test debugging guidelines
## Objective ## Objective
Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity. Provide systematic approach for investigating Playwright test failures with focus on UI element conflicts, timing issues, and selector ambiguity.
## Context & Scope ## Context & Scope
- **Audience**: Developers debugging Playwright test failures - **Audience**: Developers debugging Playwright test failures
- **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues - **In scope**: Test failure analysis, selector conflicts, UI state investigation, timing issues
- **Out of scope**: Test writing best practices, CI/CD configuration - **Out of scope**: Test writing best practices, CI/CD configuration
## Artifacts & Links ## Artifacts & Links
- Test results: `test-results/` directory - Test results: `test-results/` directory
- Error context: `error-context.md` files with page snapshots - Error context: `error-context.md` files with page snapshots
- Trace files: `trace.zip` files for failed tests - Trace files: `trace.zip` files for failed tests
- HTML reports: Interactive test reports with screenshots - HTML reports: Interactive test reports with screenshots
## Environment & Preconditions ## Environment & Preconditions
- OS/Runtime: Linux/Windows/macOS with Node.js - OS/Runtime: Linux/Windows/macOS with Node.js
- Versions: Playwright test framework, browser drivers - Versions: Playwright test framework, browser drivers
- Services: Local test server (localhost:8080), test data setup - Services: Local test server (localhost:8080), test data setup
- Auth mode: None required for test investigation - Auth mode: None required for test investigation
## Architecture / Process Overview ## Architecture / Process Overview
Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis. Playwright test investigation follows a systematic diagnostic workflow that leverages built-in debugging tools and error context analysis.
```mermaid ```mermaid
@ -233,6 +258,7 @@ flowchart TD
## Interfaces & Contracts ## Interfaces & Contracts
### Test Results Structure ### Test Results Structure
| Component | Format | Content | Validation | | Component | Format | Content | Validation |
|---|---|---|---| |---|---|---|---|
| Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations | | Error Context | Markdown | Page snapshot in YAML | Verify DOM state matches test expectations |
@ -241,6 +267,7 @@ flowchart TD
| JSON Results | JSON | Machine-readable results | Parse for automated analysis | | JSON Results | JSON | Machine-readable results | Parse for automated analysis |
### Investigation Commands ### Investigation Commands
| Step | Command | Expected Output | Notes | | Step | Command | Expected Output | Notes |
|---|---|---|---| |---|---|---|---|
| Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns | | Locate failed tests | `find test-results -name "*test-name*"` | Test result directories | Use exact test name patterns |
@ -250,6 +277,7 @@ flowchart TD
## Repro: End-to-End Investigation Procedure ## Repro: End-to-End Investigation Procedure
### 1. Locate Failed Test Results ### 1. Locate Failed Test Results
```bash ```bash
# Find all results for a specific test # Find all results for a specific test
find test-results -name "*test-name*" -type d find test-results -name "*test-name*" -type d
@ -259,6 +287,7 @@ find test-results -name "error-context.md" | head -5
``` ```
### 2. Analyze Error Context ### 2. Analyze Error Context
```bash ```bash
# Read error context for specific test # Read error context for specific test
cat test-results/test-name-test-description-browser/error-context.md cat test-results/test-name-test-description-browser/error-context.md
@ -268,6 +297,7 @@ grep -A 10 -B 5 "button.*Yes\|button.*No" test-results/*/error-context.md
``` ```
### 3. Check Trace Files ### 3. Check Trace Files
```bash ```bash
# List available trace files # List available trace files
find test-results -name "*.zip" | grep trace find test-results -name "*.zip" | grep trace
@ -277,6 +307,7 @@ npx playwright show-trace test-results/test-name/trace.zip
``` ```
### 4. Investigate Selector Issues ### 4. Investigate Selector Issues
```typescript ```typescript
// Check for multiple elements with same text // Check for multiple elements with same text
await page.locator('button:has-text("Yes")').count(); // Should be 1 await page.locator('button:has-text("Yes")').count(); // Should be 1
@ -286,6 +317,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
``` ```
## What Works (Evidence) ## What Works (Evidence)
- ✅ **Error context files** provide page snapshots showing exact DOM state at failure - ✅ **Error context files** provide page snapshots showing exact DOM state at failure
- **Time**: 2025-08-21T14:22Z - **Time**: 2025-08-21T14:22Z
- **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible - **Evidence**: `test-results/60-new-activity-New-offers-for-another-user-chromium/error-context.md` shows both alerts visible
@ -302,6 +334,7 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
- **Verify at**: Error context markdown files - **Verify at**: Error context markdown files
## What Doesn't (Evidence & Hypotheses) ## What Doesn't (Evidence & Hypotheses)
- ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161` - ❌ **Generic selectors** fail with multiple similar elements at `test-playwright/testUtils.ts:161`
- **Time**: 2025-08-21T14:22Z - **Time**: 2025-08-21T14:22Z
- **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data" - **Evidence**: `button:has-text("Yes")` matches both "Yes" and "Yes, Export Data"
@ -315,12 +348,14 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
- **Next probe**: Implement alert queuing or prevent overlapping alerts - **Next probe**: Implement alert queuing or prevent overlapping alerts
## Risks, Limits, Assumptions ## Risks, Limits, Assumptions
- **Trace file size**: Large trace files may impact storage and analysis time - **Trace file size**: Large trace files may impact storage and analysis time
- **Browser compatibility**: Trace viewer requires specific browser support - **Browser compatibility**: Trace viewer requires specific browser support
- **Test isolation**: Shared state between tests may affect investigation results - **Test isolation**: Shared state between tests may affect investigation results
- **Timing sensitivity**: Tests may pass/fail based on system performance - **Timing sensitivity**: Tests may pass/fail based on system performance
## Next Steps ## Next Steps
| Owner | Task | Exit Criteria | Target Date (UTC) | | Owner | Task | Exit Criteria | Target Date (UTC) |
|---|---|---|---| |---|---|---|---|
| Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 | | Development Team | Fix test selectors for multiple alerts | All tests pass consistently | 2025-08-22 |
@ -328,21 +363,25 @@ await page.locator('div[role="alert"]:has-text("Register") button:has-text("Yes"
| Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 | | Development Team | Add test IDs to alert buttons | Unique selectors for all UI elements | 2025-08-28 |
## References ## References
- [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer) - [Playwright Trace Viewer Documentation](https://playwright.dev/docs/trace-viewer)
- [Playwright Test Results](https://playwright.dev/docs/test-reporters) - [Playwright Test Results](https://playwright.dev/docs/test-reporters)
- [Test Investigation Workflow](./research_diagnostic.mdc) - [Test Investigation Workflow](./research_diagnostic.mdc)
## Competence Hooks ## Competence Hooks
- **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes - **Why this works**: Systematic investigation leverages Playwright's built-in debugging tools to identify root causes
- **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts - **Common pitfalls**: Generic selectors fail with multiple similar elements; timing issues create race conditions; alert stacking causes UI conflicts
- **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows - **Next skill unlock**: Implement unique test IDs and handle alert dismissal order in test flows
- **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?" - **Teach-back**: "How would you investigate a Playwright test failure using error context, trace files, and page snapshots?"
## Collaboration Hooks ## Collaboration Hooks
- **Reviewers**: QA team, test automation engineers - **Reviewers**: QA team, test automation engineers
- **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested - **Sign-off checklist**: Error context analyzed, trace files reviewed, root cause identified, fix implemented and tested
## Assumptions & Limits ## Assumptions & Limits
- Test results directory structure follows Playwright conventions - Test results directory structure follows Playwright conventions
- Trace files are enabled in configuration (`trace: "retain-on-failure"`) - Trace files are enabled in configuration (`trace: "retain-on-failure"`)
- Error context files contain valid YAML page snapshots - Error context files contain valid YAML page snapshots

2
.cursor/rules/workflow/commit_messages.mdc

@ -73,7 +73,7 @@
### Avoid ### Avoid
- Vague: *improved, enhanced, better* - Vague: _improved, enhanced, better_
- Trivialities: tiny docs, one-liners, pure lint cleanups (separate, - Trivialities: tiny docs, one-liners, pure lint cleanups (separate,

20
.husky/pre-commit

@ -18,16 +18,16 @@ npm run lint-fix || {
exit 1 exit 1
} }
# Then run Build Architecture Guard # Build Architecture Guard - DISABLED
echo "🏗️ Running Build Architecture Guard..." # echo "🏗️ Running Build Architecture Guard..."
bash ./scripts/build-arch-guard.sh --staged || { # bash ./scripts/build-arch-guard.sh --staged || {
echo # echo
echo "❌ Build Architecture Guard failed. Please fix the issues and try again." # echo "❌ Build Architecture Guard failed. Please fix the issues and try again."
echo "💡 To bypass this check for emergency commits, use:" # echo "💡 To bypass this check for emergency commits, use:"
echo " git commit --no-verify" # echo " git commit --no-verify"
echo # echo
exit 1 # exit 1
} # }
echo "✅ All pre-commit checks passed!" echo "✅ All pre-commit checks passed!"

41
.husky/pre-push

@ -5,23 +5,28 @@
# #
. "$(dirname -- "$0")/_/husky.sh" . "$(dirname -- "$0")/_/husky.sh"
echo "🔍 Running Build Architecture Guard (pre-push)..." echo "🔍 Pre-push checks..."
# Get the remote branch we're pushing to # Build Architecture Guard - DISABLED
REMOTE_BRANCH="origin/$(git rev-parse --abbrev-ref HEAD)" # echo "🔍 Running Build Architecture Guard (pre-push)..."
#
# # Get the remote branch we're pushing to
# REMOTE_BRANCH="origin/$(git rev-parse --abbrev-ref HEAD)"
#
# # Check if remote branch exists
# if git show-ref --verify --quiet "refs/remotes/$REMOTE_BRANCH"; then
# RANGE="$REMOTE_BRANCH...HEAD"
# else
# # If remote branch doesn't exist, check last commit
# RANGE="HEAD~1..HEAD"
# fi
#
# bash ./scripts/build-arch-guard.sh --range "$RANGE" || {
# echo
# echo "💡 To bypass this check for emergency pushes, use:"
# echo " git push --no-verify"
# echo
# exit 1
# }
# Check if remote branch exists echo "✅ Pre-push checks passed!"
if git show-ref --verify --quiet "refs/remotes/$REMOTE_BRANCH"; then
RANGE="$REMOTE_BRANCH...HEAD"
else
# If remote branch doesn't exist, check last commit
RANGE="HEAD~1..HEAD"
fi
bash ./scripts/build-arch-guard.sh --range "$RANGE" || {
echo
echo "💡 To bypass this check for emergency pushes, use:"
echo " git push --no-verify"
echo
exit 1
}

69
.markdownlint.json

@ -1,27 +1,56 @@
{ {
"MD013": { "MD013": false,
"line_length": 80, "MD033": false,
"code_blocks": false, "MD041": false,
"tables": false, "MD024": {
"headings": false "siblings_only": true
},
"MD029": {
"style": "ordered"
},
"MD007": {
"indent": 2
},
"MD012": {
"maximum": 1
}, },
"MD012": true,
"MD022": true, "MD022": true,
"MD025": true,
"MD026": {
"punctuation": ".,;:!"
},
"MD030": {
"ul_single": 1,
"ol_single": 1,
"ul_multi": 1,
"ol_multi": 1
},
"MD031": true, "MD031": true,
"MD032": true, "MD032": true,
"MD047": true, "MD034": true,
"MD009": true, "MD035": {
"MD010": true, "style": "---"
"MD004": { "style": "dash" }, },
"MD029": { "style": "ordered" },
"MD041": false,
"MD025": false,
"MD024": false,
"MD036": false, "MD036": false,
"MD003": false, "MD037": true,
"MD040": false, "MD038": true,
"MD055": false, "MD039": true,
"MD056": false, "MD040": true,
"MD034": false, "MD042": true,
"MD023": false "MD043": false,
"MD044": false,
"MD045": true,
"MD046": {
"style": "fenced"
},
"MD047": true,
"MD048": {
"style": "backtick"
},
"MD049": {
"style": "underscore"
},
"MD050": {
"style": "asterisk"
}
} }

34
BUILDING.md

@ -93,6 +93,7 @@ The Build Architecture Guard protects your build system by enforcing documentati
#### Protected File Patterns #### Protected File Patterns
The guard monitors these sensitive paths: The guard monitors these sensitive paths:
- `vite.config.*` - Build configuration - `vite.config.*` - Build configuration
- `scripts/**` - Build and utility scripts - `scripts/**` - Build and utility scripts
- `electron/**` - Desktop application code - `electron/**` - Desktop application code
@ -132,6 +133,7 @@ npm run guard:setup
#### Troubleshooting #### Troubleshooting
If you encounter `mapfile: command not found` errors: If you encounter `mapfile: command not found` errors:
```bash ```bash
# Ensure script is executable # Ensure script is executable
chmod +x scripts/build-arch-guard.sh chmod +x scripts/build-arch-guard.sh
@ -270,6 +272,7 @@ Start the development server using `npm run build:web:dev` or `npm run build:web
3. To test the production build locally, use `npm run build:web:serve` (builds then serves) 3. To test the production build locally, use `npm run build:web:serve` (builds then serves)
**Why Use `serve`?** **Why Use `serve`?**
- **Production Testing**: Test your optimized production build locally before deployment - **Production Testing**: Test your optimized production build locally before deployment
- **SPA Routing Validation**: Verify deep linking and navigation work correctly (handles routes like `/discover`, `/account`) - **SPA Routing Validation**: Verify deep linking and navigation work correctly (handles routes like `/discover`, `/account`)
- **Performance Testing**: Test the minified and optimized build locally - **Performance Testing**: Test the minified and optimized build locally
@ -335,15 +338,18 @@ All web build commands use the `./scripts/build-web.sh` script, which provides:
The `serve` functionality provides a local HTTP server for testing production builds: The `serve` functionality provides a local HTTP server for testing production builds:
**What It Does:** **What It Does:**
1. **Builds** the application using Vite 1. **Builds** the application using Vite
2. **Serves** the built files from the `dist/` directory 2. **Serves** the built files from the `dist/` directory
3. **Handles SPA Routing** - serves `index.html` for all routes (fixes 404s on `/discover`, `/account`, etc.) 3. **Handles SPA Routing** - serves `index.html` for all routes (fixes 404s on `/discover`, `/account`, etc.)
**Server Options:** **Server Options:**
- **Primary**: `npx serve -s dist -l 8080` (recommended - full SPA support) - **Primary**: `npx serve -s dist -l 8080` (recommended - full SPA support)
- **Fallback**: Python HTTP server (limited SPA routing support) - **Fallback**: Python HTTP server (limited SPA routing support)
**Use Cases:** **Use Cases:**
- Testing production builds before deployment - Testing production builds before deployment
- Validating SPA routing behavior - Validating SPA routing behavior
- Performance testing of optimized builds - Performance testing of optimized builds
@ -365,8 +371,8 @@ current version to test DB migrations.
- Put the commit hash in the changelog (which will help you remember to bump the - Put the commit hash in the changelog (which will help you remember to bump the
version in the step later). version in the step later).
- Tag with the new version, - Tag with the new version,
[online](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/releases) or [online](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/releases) or
`git tag 1.0.2 && git push origin 1.0.2`. `git tag 1.0.2 && git push origin 1.0.2`.
- For test, build the app: - For test, build the app:
@ -1185,14 +1191,14 @@ If you need to build manually or want to understand the individual steps:
- Choose Product -> Archive - Choose Product -> Archive
- This will trigger a build and take time, needing user's "login" keychain - This will trigger a build and take time, needing user's "login" keychain
password (user's login password), repeatedly. password (user's login password), repeatedly.
- If it fails with `building for 'iOS', but linking in dylib - If it fails with `building for 'iOS', but linking in dylib
(.../.pkgx/zlib.net/v1.3.0/lib/libz.1.3.dylib) built for 'macOS'` then run (.../.pkgx/zlib.net/v1.3.0/lib/libz.1.3.dylib) built for 'macOS'` then run
XCode outside that terminal (ie. not with `npx cap open ios`). XCode outside that terminal (ie. not with `npx cap open ios`).
- Click Distribute -> App Store Connect - Click Distribute -> App Store Connect
- In AppStoreConnect, add the build to the distribution. You may have to remove - In AppStoreConnect, add the build to the distribution. You may have to remove
the current build with the "-" when you hover over it, then "Add Build" with the the current build with the "-" when you hover over it, then "Add Build" with the
new build. new build.
- May have to go to App Review, click Submission, then hover over the build - May have to go to App Review, click Submission, then hover over the build
and click "-". and click "-".
- It can take 15 minutes for the build to show up in the list of builds. - It can take 15 minutes for the build to show up in the list of builds.
- You'll probably have to "Manage" something about encryption, disallowed in France. - You'll probably have to "Manage" something about encryption, disallowed in France.
@ -1257,11 +1263,13 @@ npm run assets:validate
##### What Gets Validated ##### What Gets Validated
**Source Assets (Required):** **Source Assets (Required):**
- `resources/icon.png` - App icon source - `resources/icon.png` - App icon source
- `resources/splash.png` - Splash screen source - `resources/splash.png` - Splash screen source
- `resources/splash_dark.png` - Dark mode splash source - `resources/splash_dark.png` - Dark mode splash source
**Android Resources (Generated):** **Android Resources (Generated):**
- `android/app/src/main/res/drawable/splash.png` - Splash screen drawable - `android/app/src/main/res/drawable/splash.png` - Splash screen drawable
- `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities
- `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities
@ -2706,6 +2714,7 @@ configuration files in the repository.
### 2025-08-21 - Cursor Rules Refactoring and Build System Updates ### 2025-08-21 - Cursor Rules Refactoring and Build System Updates
#### Package Dependencies Updated #### Package Dependencies Updated
- **Added**: `markdownlint-cli2` v0.18.1 - Modern markdown linting with improved performance - **Added**: `markdownlint-cli2` v0.18.1 - Modern markdown linting with improved performance
- **Added**: `@commitlint/cli` v18.6.1 - Conventional commit message validation - **Added**: `@commitlint/cli` v18.6.1 - Conventional commit message validation
- **Added**: `@commitlint/config-conventional` v18.6.2 - Conventional commit standards - **Added**: `@commitlint/config-conventional` v18.6.2 - Conventional commit standards
@ -2713,28 +2722,33 @@ configuration files in the repository.
- **Updated**: `lint-staged` v15.2.2 - Pre-commit linting automation - **Updated**: `lint-staged` v15.2.2 - Pre-commit linting automation
#### Build Script Improvements #### Build Script Improvements
- **Markdown Linting**: Replaced custom markdown scripts with `markdownlint-cli2` - **Markdown Linting**: Replaced custom markdown scripts with `markdownlint-cli2`
- **Before**: `./scripts/fix-markdown.sh` and `./scripts/validate-markdown.sh` - **Before**: `./scripts/fix-markdown.sh` and `./scripts/validate-markdown.sh`
- **After**: `markdownlint-cli2 --fix` and `markdownlint-cli2` - **After**: `markdownlint-cli2 --fix` and `markdownlint-cli2`
- **Benefits**: Faster execution, better error reporting, modern markdown standards - **Benefits**: Faster execution, better error reporting, modern markdown standards
#### Lint-Staged Configuration Enhanced #### Lint-Staged Configuration Enhanced
- **Added**: Markdown file linting to pre-commit hooks - **Added**: Markdown file linting to pre-commit hooks
- **Pattern**: `*.{md,markdown,mdc}` files now automatically formatted - **Pattern**: `*.{md,markdown,mdc}` files now automatically formatted
- **Command**: `markdownlint-cli2 --fix` runs before each commit - **Command**: `markdownlint-cli2 --fix` runs before each commit
- **Coverage**: All markdown files including `.mdc` cursor rules - **Coverage**: All markdown files including `.mdc` cursor rules
#### Commit Message Standards #### Commit Message Standards
- **Added**: Conventional commit validation via commitlint - **Added**: Conventional commit validation via commitlint
- **Configuration**: Extends `@commitlint/config-conventional` - **Configuration**: Extends `@commitlint/config-conventional`
- **Enforcement**: Ensures consistent commit message format across the project - **Enforcement**: Ensures consistent commit message format across the project
#### Node.js Version Requirements #### Node.js Version Requirements
- **Updated**: Minimum Node.js version requirements for new dependencies - **Updated**: Minimum Node.js version requirements for new dependencies
- **markdownlint-cli2**: Requires Node.js >=20 - **markdownlint-cli2**: Requires Node.js >=20
- **Various utilities**: Require Node.js >=18 for modern ES features - **Various utilities**: Require Node.js >=18 for modern ES features
#### Build Process Impact #### Build Process Impact
- **No Breaking Changes**: All existing build commands continue to work - **No Breaking Changes**: All existing build commands continue to work
- **Improved Quality**: Better markdown formatting and commit message standards - **Improved Quality**: Better markdown formatting and commit message standards
- **Enhanced Automation**: More comprehensive pre-commit validation - **Enhanced Automation**: More comprehensive pre-commit validation
@ -2745,6 +2759,7 @@ configuration files in the repository.
### 2025-08-21 - Commitlint Configuration Refinement ### 2025-08-21 - Commitlint Configuration Refinement
#### Commit Message Validation Improvements #### Commit Message Validation Improvements
- **Modified**: Commitlint configuration moved from `package.json` to dedicated `commitlint.config.js` - **Modified**: Commitlint configuration moved from `package.json` to dedicated `commitlint.config.js`
- **Enhanced**: Strict validation rules downgraded from errors to warnings - **Enhanced**: Strict validation rules downgraded from errors to warnings
- **Before**: `subject-case` and `subject-full-stop` rules caused red error messages - **Before**: `subject-case` and `subject-full-stop` rules caused red error messages
@ -2752,16 +2767,18 @@ configuration files in the repository.
- **Benefit**: Eliminates confusing red error messages while maintaining commit quality guidance - **Benefit**: Eliminates confusing red error messages while maintaining commit quality guidance
#### Configuration Structure #### Configuration Structure
- **File**: `commitlint.config.js` - Dedicated commitlint configuration - **File**: `commitlint.config.js` - Dedicated commitlint configuration
- **Extends**: `@commitlint/config-conventional` - Standard conventional commit rules - **Extends**: `@commitlint/config-conventional` - Standard conventional commit rules
- **Custom Rules**: - **Custom Rules**:
- `subject-case: [1, 'never', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']]` - `subject-case: [1, 'never', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']]`
- `subject-full-stop: [1, 'never', '.']` - `subject-full-stop: [1, 'never', '.']`
- **Levels**: - **Levels**:
- `0` = Disabled, `1` = Warning, `2` = Error - `0` = Disabled, `1` = Warning, `2` = Error
- Current: Problematic rules set to warning level (1) - Current: Problematic rules set to warning level (1)
#### User Experience Impact #### User Experience Impact
- **Before**: Red error messages on every push with strict commit rules - **Before**: Red error messages on every push with strict commit rules
- **After**: Yellow warning messages that provide guidance without disruption - **After**: Yellow warning messages that provide guidance without disruption
- **Workflow**: Commits and pushes continue to work while maintaining quality standards - **Workflow**: Commits and pushes continue to work while maintaining quality standards
@ -2772,6 +2789,7 @@ configuration files in the repository.
### 2025-08-26 - Capacitor Plugin Additions ### 2025-08-26 - Capacitor Plugin Additions
#### New Capacitor Plugins Added #### New Capacitor Plugins Added
- **Added**: `@capacitor/clipboard` v6.0.2 - Clipboard functionality for mobile platforms - **Added**: `@capacitor/clipboard` v6.0.2 - Clipboard functionality for mobile platforms
- **Purpose**: Enable copy/paste operations on mobile devices - **Purpose**: Enable copy/paste operations on mobile devices
- **Platforms**: iOS and Android - **Platforms**: iOS and Android
@ -2785,23 +2803,27 @@ configuration files in the repository.
- **Integration**: Automatically included in mobile builds - **Integration**: Automatically included in mobile builds
#### Android Build System Updates #### Android Build System Updates
- **Modified**: `android/capacitor.settings.gradle` - Added new plugin project includes - **Modified**: `android/capacitor.settings.gradle` - Added new plugin project includes
- **Added**: `:capacitor-clipboard` project directory mapping - **Added**: `:capacitor-clipboard` project directory mapping
- **Added**: `:capacitor-status-bar` project directory mapping - **Added**: `:capacitor-status-bar` project directory mapping
- **Impact**: New plugins now properly integrated into Android build process - **Impact**: New plugins now properly integrated into Android build process
#### Package Dependencies #### Package Dependencies
- **Updated**: `package.json` - Added new Capacitor plugin dependencies - **Updated**: `package.json` - Added new Capacitor plugin dependencies
- **Updated**: `package-lock.json` - Locked dependency versions for consistency - **Updated**: `package-lock.json` - Locked dependency versions for consistency
- **Version**: All new plugins use Capacitor 6.x compatible versions - **Version**: All new plugins use Capacitor 6.x compatible versions
#### Build Process Impact #### Build Process Impact
- **No Breaking Changes**: Existing build commands continue to work unchanged - **No Breaking Changes**: Existing build commands continue to work unchanged
- **Enhanced Mobile Features**: New clipboard and status bar capabilities available - **Enhanced Mobile Features**: New clipboard and status bar capabilities available
- **Automatic Integration**: Plugins automatically included in mobile builds - **Automatic Integration**: Plugins automatically included in mobile builds
- **Platform Support**: Both iOS and Android builds now include new functionality - **Platform Support**: Both iOS and Android builds now include new functionality
#### Testing Requirements #### Testing Requirements
- **Mobile Builds**: Verify new plugins integrate correctly in iOS and Android builds - **Mobile Builds**: Verify new plugins integrate correctly in iOS and Android builds
- **Functionality**: Test clipboard operations and status bar management on devices - **Functionality**: Test clipboard operations and status bar management on devices
- **Fallback**: Ensure graceful degradation when plugins are unavailable - **Fallback**: Ensure graceful degradation when plugins are unavailable

3
README-PR-TEMPLATE.md

@ -66,14 +66,17 @@ test-image.tar a1b2c3d4e5f6...
``` ```
### Docs ### Docs
- [x] **BUILDING.md** updated (sections): Docker deployment - [x] **BUILDING.md** updated (sections): Docker deployment
- [x] Troubleshooting updated: Added Docker troubleshooting section - [x] Troubleshooting updated: Added Docker troubleshooting section
### Rollback ### Rollback
- [x] Verified steps to restore previous behavior: - [x] Verified steps to restore previous behavior:
1. `git revert HEAD` 1. `git revert HEAD`
2. `docker rmi test-image` 2. `docker rmi test-image`
3. Restore previous BUILDING.md 3. Restore previous BUILDING.md
``` ```
--- ---

55
README.md

@ -11,7 +11,7 @@ See [ClickUp](https://sharing.clickup.com/9014278710/l/h/8cmnyhp-174/10573fec74e
Quick start: Quick start:
* For setup, we recommend [pkgx](https://pkgx.dev), which installs what you need (either automatically or with the `dev` command). Core dependencies are typescript & npm; when building for other platforms, you'll need other things such as those in the pkgx.yaml & BUILDING.md files. - For setup, we recommend [pkgx](https://pkgx.dev), which installs what you need (either automatically or with the `dev` command). Core dependencies are typescript & npm; when building for other platforms, you'll need other things such as those in the pkgx.yaml & BUILDING.md files.
```bash ```bash
npm install npm install
@ -90,6 +90,7 @@ VITE_LOG_LEVEL=debug npm run dev
See [Logging Configuration Guide](doc/logging-configuration.md) for complete details. See [Logging Configuration Guide](doc/logging-configuration.md) for complete details.
### Quick Usage ### Quick Usage
```bash ```bash
# Run the database clearing script # Run the database clearing script
./scripts/clear-database.sh ./scripts/clear-database.sh
@ -102,16 +103,19 @@ npm run build:web:dev # For Web
### What It Does ### What It Does
#### **Electron (Desktop App)** #### **Electron (Desktop App)**
- Automatically finds and clears the SQLite database files - Automatically finds and clears the SQLite database files
- Works on Linux, macOS, and Windows - Works on Linux, macOS, and Windows
- Clears all data and forces fresh migrations on next startup - Clears all data and forces fresh migrations on next startup
#### **Web Browser** #### **Web Browser**
- Provides instructions for using custom browser data directories - Provides instructions for using custom browser data directories
- Shows manual clearing via browser DevTools - Shows manual clearing via browser DevTools
- Ensures reliable database clearing without browser complications - Ensures reliable database clearing without browser complications
### Safety Features ### Safety Features
- ✅ **Interactive Script**: Guides you through the process - ✅ **Interactive Script**: Guides you through the process
- ✅ **Platform Detection**: Automatically detects your OS - ✅ **Platform Detection**: Automatically detects your OS
- ✅ **Clear Instructions**: Step-by-step guidance for each platform - ✅ **Clear Instructions**: Step-by-step guidance for each platform
@ -120,6 +124,7 @@ npm run build:web:dev # For Web
### Manual Commands (if needed) ### Manual Commands (if needed)
#### **Electron Database Location** #### **Electron Database Location**
```bash ```bash
# Linux # Linux
rm -rf ~/.config/TimeSafari/* rm -rf ~/.config/TimeSafari/*
@ -132,6 +137,7 @@ rmdir /s /q %APPDATA%\TimeSafari
``` ```
#### **Web Browser (Custom Data Directory)** #### **Web Browser (Custom Data Directory)**
```bash ```bash
# Create isolated browser profile # Create isolated browser profile
mkdir ~/timesafari-dev-data mkdir ~/timesafari-dev-data
@ -144,6 +150,7 @@ URL generation across all environments. This prevents localhost URLs from
appearing in shared links during development. appearing in shared links during development.
### Key Features ### Key Features
- ✅ **Production URLs for Sharing**: All copy link buttons use production domain - ✅ **Production URLs for Sharing**: All copy link buttons use production domain
- ✅ **Environment-Specific Internal URLs**: Internal operations use appropriate - ✅ **Environment-Specific Internal URLs**: Internal operations use appropriate
environment URLs environment URLs
@ -227,6 +234,7 @@ npm run test:prerequisites
- **Build failures**: Run `npm run check:dependencies` to diagnose environment issues - **Build failures**: Run `npm run check:dependencies` to diagnose environment issues
**Required Versions**: **Required Versions**:
- Node.js: 18+ (LTS recommended) - Node.js: 18+ (LTS recommended)
- npm: 8+ (comes with Node.js) - npm: 8+ (comes with Node.js)
- Platform-specific tools: Android Studio, Xcode (for mobile builds) - Platform-specific tools: Android Studio, Xcode (for mobile builds)
@ -246,25 +254,26 @@ To add a Font Awesome icon, add to `fontawesome.ts` and reference with
### Reference Material ### Reference Material
* Notifications can be type of `toast` (self-dismiss), `info`, `success`, `warning`, and `danger`. - Notifications can be type of `toast` (self-dismiss), `info`, `success`, `warning`, and `danger`.
They are done via [notiwind](https://www.npmjs.com/package/notiwind) and set up in App.vue. They are done via [notiwind](https://www.npmjs.com/package/notiwind) and set up in App.vue.
* [Customize Vue configuration](https://cli.vuejs.org/config/). - [Customize Vue configuration](https://cli.vuejs.org/config/).
* If you are deploying in a subdirectory, add it to `publicPath` in vue.config.js, eg: `publicPath: "/app/time-tracker/",` - If you are deploying in a subdirectory, add it to `publicPath` in vue.config.js, eg: `publicPath: "/app/time-tracker/",`
### Code Organization ### Code Organization
The project uses a centralized approach to type definitions and interfaces: The project uses a centralized approach to type definitions and interfaces:
* `src/interfaces/` - Contains all TypeScript interfaces and type definitions - `src/interfaces/` - Contains all TypeScript interfaces and type definitions
* `deepLinks.ts` - Deep linking type system and Zod validation schemas - `deepLinks.ts` - Deep linking type system and Zod validation schemas
* `give.ts` - Give-related interfaces and type definitions - `give.ts` - Give-related interfaces and type definitions
* `claims.ts` - Claim-related interfaces and verifiable credentials - `claims.ts` - Claim-related interfaces and verifiable credentials
* `common.ts` - Shared interfaces and utility types - `common.ts` - Shared interfaces and utility types
* Other domain-specific interface files - Other domain-specific interface files
Key principles: Key principles:
- All interfaces and types are defined in the interfaces folder - All interfaces and types are defined in the interfaces folder
- Zod schemas are used for runtime validation and type generation - Zod schemas are used for runtime validation and type generation
- Domain-specific interfaces are separated into their own files - Domain-specific interfaces are separated into their own files
@ -275,11 +284,11 @@ Key principles:
The application uses a platform-agnostic database layer with Vue mixins for service access: The application uses a platform-agnostic database layer with Vue mixins for service access:
* `src/services/PlatformService.ts` - Database interface definition - `src/services/PlatformService.ts` - Database interface definition
* `src/services/PlatformServiceFactory.ts` - Platform-specific service factory - `src/services/PlatformServiceFactory.ts` - Platform-specific service factory
* `src/services/AbsurdSqlDatabaseService.ts` - SQLite implementation - `src/services/AbsurdSqlDatabaseService.ts` - SQLite implementation
* `src/utils/PlatformServiceMixin.ts` - Vue mixin for database access with caching - `src/utils/PlatformServiceMixin.ts` - Vue mixin for database access with caching
* `src/db/` - Legacy Dexie database (migration in progress) - `src/db/` - Legacy Dexie database (migration in progress)
**Development Guidelines**: **Development Guidelines**:
@ -316,11 +325,11 @@ timesafari/
Gifts make the world go 'round! Gifts make the world go 'round!
* [WebStorm by JetBrains](https://www.jetbrains.com/webstorm/) for the free open-source license - [WebStorm by JetBrains](https://www.jetbrains.com/webstorm/) for the free open-source license
* [Máximo Fernández](https://medium.com/@maxfarenas) for the 3D [code](https://github.com/maxfer03/vue-three-ns) and [explanatory post](https://medium.com/nicasource/building-an-interactive-web-portfolio-with-vue-three-js-part-three-implementing-three-js-452cb375ef80) - [Máximo Fernández](https://medium.com/@maxfarenas) for the 3D [code](https://github.com/maxfer03/vue-three-ns) and [explanatory post](https://medium.com/nicasource/building-an-interactive-web-portfolio-with-vue-three-js-part-three-implementing-three-js-452cb375ef80)
* [Many tools & libraries](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/src/branch/master/package.json#L10) such as Nodejs.org, IntelliJ Idea, Veramo.io, Vuejs.org, threejs.org - [Many tools & libraries](https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/src/branch/master/package.json#L10) such as Nodejs.org, IntelliJ Idea, Veramo.io, Vuejs.org, threejs.org
* [Bush 3D model](https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439) - [Bush 3D model](https://sketchfab.com/3d-models/lupine-plant-bf30f1110c174d4baedda0ed63778439)
* [Forest floor image](https://www.goodfreephotos.com/albums/textures/leafy-autumn-forest-floor.jpg) - [Forest floor image](https://www.goodfreephotos.com/albums/textures/leafy-autumn-forest-floor.jpg)
* Time Safari logo assisted by [DALL-E in ChatGPT](https://chat.openai.com/g/g-2fkFE8rbu-dall-e) - Time Safari logo assisted by [DALL-E in ChatGPT](https://chat.openai.com/g/g-2fkFE8rbu-dall-e)
* [DiceBear](https://www.dicebear.com/licenses/) and [Avataaars](https://www.dicebear.com/styles/avataaars/#details) for human-looking identicons - [DiceBear](https://www.dicebear.com/licenses/) and [Avataaars](https://www.dicebear.com/styles/avataaars/#details) for human-looking identicons
* Some gratitude prompts thanks to [Develop Good Habits](https://www.developgoodhabits.com/gratitude-journal-prompts/) - Some gratitude prompts thanks to [Develop Good Habits](https://www.developgoodhabits.com/gratitude-journal-prompts/)

22
TASK_storage.md

@ -5,33 +5,33 @@
We can't trust iOS IndexedDB to persist. I want to start delivering an app to people now, in preparation for presentations mid-June: Rotary on June 12 and Porcfest on June 17. We can't trust iOS IndexedDB to persist. I want to start delivering an app to people now, in preparation for presentations mid-June: Rotary on June 12 and Porcfest on June 17.
* Apple WebKit puts a [7-day cap on IndexedDB](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/). - Apple WebKit puts a [7-day cap on IndexedDB](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/).
* The web standards expose a `persist` method to mark memory as persistent, and [supposedly WebView supports it](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persisted), but too many other things indicate it's not reliable. I've talked with [ChatGPT](https://chatgpt.com/share/68322f40-84c8-8007-b213-855f7962989a) & Venice & Claude (in Cursor); [this answer from Perplexity](https://www.perplexity.ai/search/which-platforms-prompt-the-use-HUQLqy4qQD2cRbkmO4CgHg) says that most platforms don't prompt and Safari doesn't support it; I don't know if that means WebKit as well. - The web standards expose a `persist` method to mark memory as persistent, and [supposedly WebView supports it](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persisted), but too many other things indicate it's not reliable. I've talked with [ChatGPT](https://chatgpt.com/share/68322f40-84c8-8007-b213-855f7962989a) & Venice & Claude (in Cursor); [this answer from Perplexity](https://www.perplexity.ai/search/which-platforms-prompt-the-use-HUQLqy4qQD2cRbkmO4CgHg) says that most platforms don't prompt and Safari doesn't support it; I don't know if that means WebKit as well.
* Capacitor says [not to trust it on iOS](https://capacitorjs.com/docs/v6/guides/storage). - Capacitor says [not to trust it on iOS](https://capacitorjs.com/docs/v6/guides/storage).
Also, with sensitive data, the accounts info should be encrypted. Also, with sensitive data, the accounts info should be encrypted.
# Options # Options
* There is a community [SQLite plugin for Capacitor](https://github.com/capacitor-community/sqlite) with encryption by [SQLCipher](https://github.com/sqlcipher/sqlcipher). - There is a community [SQLite plugin for Capacitor](https://github.com/capacitor-community/sqlite) with encryption by [SQLCipher](https://github.com/sqlcipher/sqlcipher).
* [This tutorial](https://jepiqueau.github.io/2023/09/05/Ionic7Vue-SQLite-CRUD-App.html#part-1---web---table-of-contents) shows how that plugin works for web as well as native. - [This tutorial](https://jepiqueau.github.io/2023/09/05/Ionic7Vue-SQLite-CRUD-App.html#part-1---web---table-of-contents) shows how that plugin works for web as well as native.
* Capacitor abstracts [user preferences in an API](https://capacitorjs.com/docs/apis/preferences), which uses different underlying libraries on iOS & Android. Unfortunately, it won't do any filtering or searching, and is only meant for small amounts of data. (It could be used for settings and for identifiers, but contacts will grow and image blobs won't work.) - Capacitor abstracts [user preferences in an API](https://capacitorjs.com/docs/apis/preferences), which uses different underlying libraries on iOS & Android. Unfortunately, it won't do any filtering or searching, and is only meant for small amounts of data. (It could be used for settings and for identifiers, but contacts will grow and image blobs won't work.)
* There are hints that Capacitor offers another custom storage API but all I could find was that Preferences API. - There are hints that Capacitor offers another custom storage API but all I could find was that Preferences API.
* [Ionic Storage](https://ionic.io/docs/secure-storage) is an enterprise solution, which also supports encryption. - [Ionic Storage](https://ionic.io/docs/secure-storage) is an enterprise solution, which also supports encryption.
* Not an option yet: Dexie may support SQLite in [a future version](https://dexie.org/roadmap/dexie5.0). - Not an option yet: Dexie may support SQLite in [a future version](https://dexie.org/roadmap/dexie5.0).
# Current Plan # Current Plan
* Implement SQLite for Capacitor & web, with encryption. That will allow us to test quickly and keep the same interface for native & web, but we don't deal with migrations for current web users. - Implement SQLite for Capacitor & web, with encryption. That will allow us to test quickly and keep the same interface for native & web, but we don't deal with migrations for current web users.
* After that is delivered, write a migration for current web users from IndexedDB to SQLite. - After that is delivered, write a migration for current web users from IndexedDB to SQLite.
# Current method calls # Current method calls

21
doc/GLOSSARY.md

@ -0,0 +1,21 @@
# Glossary
**T (slot time)** — The local wall-clock time a notification should fire (e.g., 08:00).
**T–lead** — The moment **`prefetchLeadMinutes`** before **T** when the system *attempts* a **single** background prefetch. T–lead **controls prefetch attempts, not arming**; locals are pre-armed earlier to guarantee closed-app delivery.
**Rolling window** — Always keep **today's remaining** (and tomorrow if iOS pending caps allow) locals **armed** so the OS can deliver while the app is closed.
**TTL (time-to-live)** — Maximum allowed payload age **at fire time**. If `T − fetchedAt > ttlSeconds`, we **skip** arming for that T.
**Shared DB (default)** — The app and plugin open the **same SQLite file**; the app owns schema/migrations, the plugin performs short writes with WAL.
**WAL (Write-Ahead Logging)** — SQLite journaling mode that permits concurrent reads during writes; recommended for foreground-read + background-write.
**`PRAGMA user_version`** — An integer the app increments on each migration; the plugin **checks** (does not migrate) to ensure compatibility.
**Exact alarm (Android)** — Minute-precise alarm via `AlarmManager.setExactAndAllowWhileIdle`, subject to policy and permission.
**Windowed alarm (Android)** — Batched/inexact alarm via `setWindow(start,len)`; we target **±10 minutes** when exact alarms are unavailable.
**Start-on-Login** — Electron feature that automatically launches the application when the user logs into their system, enabling background notification scheduling and delivery after system reboot.

1
doc/README-BUILD-GUARD.md

@ -330,6 +330,7 @@ Track the effectiveness of your Build Architecture Guard:
## 📝 **Changelog** ## 📝 **Changelog**
### 2025-08-22 - Shell Compatibility Fix ### 2025-08-22 - Shell Compatibility Fix
- **Fixed**: Replaced `mapfile` command with portable alternative for cross-shell compatibility - **Fixed**: Replaced `mapfile` command with portable alternative for cross-shell compatibility
- **Impact**: Resolves "mapfile: command not found" errors in pre-commit hooks - **Impact**: Resolves "mapfile: command not found" errors in pre-commit hooks
- **Files**: `scripts/build-arch-guard.sh` - **Files**: `scripts/build-arch-guard.sh`

80
doc/README.md

@ -1,77 +1,11 @@
# TimeSafari Docs # TimeSafari — Native-First Notification System (Clean Pack) — 2025-09-07
## Generating PDF from Markdown on OSx This pack contains a single-version **Native-First** documentation set with a clear definition of **T–lead** and aligned terminology.
This uses Pandoc and BasicTex (LaTeX) Installed through Homebrew. **Native-First =** OS-scheduled **background prefetch at T–lead** + **pre-armed one-shot local notifications**. Web-push is retired.
### Set Up **Included files**
```bash - `notification-system.md` (merged comprehensive guide)
brew install pandoc - `web-push-cleanup-guide.md` (cleanup instructions)
- `GLOSSARY.md` (definitions incl. **T** and **T–lead**)
brew install basictex
# Setting up LaTex packages
# First update tlmgr
sudo tlmgr update --self
# Then install LaTex packages
sudo tlmgr install bbding
sudo tlmgr install enumitem
sudo tlmgr install environ
sudo tlmgr install fancyhdr
sudo tlmgr install framed
sudo tlmgr install import
sudo tlmgr install lastpage # Enables Page X of Y
sudo tlmgr install mdframed
sudo tlmgr install multirow
sudo tlmgr install needspace
sudo tlmgr install ntheorem
sudo tlmgr install tabu
sudo tlmgr install tcolorbox
sudo tlmgr install textpos
sudo tlmgr install titlesec
sudo tlmgr install titling # Required for the fancy headers used
sudo tlmgr install threeparttable
sudo tlmgr install trimspaces
sudo tlmgr install tocloft # Required for \tableofcontents generation
sudo tlmgr install varwidth
sudo tlmgr install wrapfig
# Install fonts
sudo tlmgr install cmbright
sudo tlmgr install collection-fontsrecommended # And set up fonts
sudo tlmgr install fira
sudo tlmgr install fontaxes
sudo tlmgr install libertine # The main font the doc uses
sudo tlmgr install opensans
sudo tlmgr install sourceserifpro
```
#### References
The following guide was adapted to this project except that we install with Brew and have a few more packages.
Guide: <https://daniel.feldroy.com/posts/setting-up-latex-on-mac-os-x>
### Usage
Use the `pandoc` command to generate a PDF.
```bash
pandoc usage-guide.md -o usage-guide.pdf
```
And you can open the PDF with the `open` command.
```bash
open usage-guide.pdf
```
Or use this one-liner
```bash
pandoc usage-guide.md -o usage-guide.pdf && open usage-guide.pdf
```

10
doc/WORKER_ONLY_DATABASE_IMPLEMENTATION.md

@ -117,25 +117,25 @@ async function getDatabaseService() {
## Files Modified ## Files Modified
1. **src/interfaces/worker-messages.ts** *(NEW)* 1. **src/interfaces/worker-messages.ts** _(NEW)_
- Type definitions for worker communication - Type definitions for worker communication
- Request and response message interfaces - Request and response message interfaces
2. **src/registerSQLWorker.js** *(MAJOR REWRITE)* 2. **src/registerSQLWorker.js** _(MAJOR REWRITE)_
- Message-based operation handling - Message-based operation handling
- **Fixed circular dependency with lazy loading** - **Fixed circular dependency with lazy loading**
- Proper error handling and response formatting - Proper error handling and response formatting
3. **src/services/platforms/WebPlatformService.ts** *(MAJOR REWRITE)* 3. **src/services/platforms/WebPlatformService.ts** _(MAJOR REWRITE)_
- Worker-only database access - Worker-only database access
- Message sending and response handling - Message sending and response handling
- Timeout and error management - Timeout and error management
4. **src/main.web.ts** *(SIMPLIFIED)* 4. **src/main.web.ts** _(SIMPLIFIED)_
- Removed duplicate worker creation - Removed duplicate worker creation
- Simplified initialization flow - Simplified initialization flow
5. **WORKER_ONLY_DATABASE_IMPLEMENTATION.md** *(NEW)* 5. **WORKER_ONLY_DATABASE_IMPLEMENTATION.md** _(NEW)_
- Complete documentation of changes - Complete documentation of changes
## Benefits ## Benefits

24
doc/android-asset-validation.md

@ -11,12 +11,14 @@ The Android Asset Validation System automatically detects and fixes missing Andr
## Problem Solved ## Problem Solved
Previously, Android builds would fail with errors like: Previously, Android builds would fail with errors like:
``` ```
error: resource drawable/splash (aka app.timesafari.app:drawable/splash) not found. error: resource drawable/splash (aka app.timesafari.app:drawable/splash) not found.
error: resource mipmap/ic_launcher (aka app.timesafari.app:mipmap/ic_launcher) not found. error: resource mipmap/ic_launcher (aka app.timesafari.app:mipmap/ic_launcher) not found.
``` ```
This happened when: This happened when:
- Source assets existed but weren't generated into Android resources - Source assets existed but weren't generated into Android resources
- Android resource directories were missing - Android resource directories were missing
- Asset generation tools weren't run before building - Asset generation tools weren't run before building
@ -45,16 +47,19 @@ npm run build:android:studio
### What Gets Validated ### What Gets Validated
#### Source Assets (Required) #### Source Assets (Required)
- `resources/icon.png` - App icon source - `resources/icon.png` - App icon source
- `resources/splash.png` - Splash screen source - `resources/splash.png` - Splash screen source
- `resources/splash_dark.png` - Dark mode splash source - `resources/splash_dark.png` - Dark mode splash source
#### Android Resources (Generated) #### Android Resources (Generated)
- `android/app/src/main/res/drawable/splash.png` - Splash screen drawable - `android/app/src/main/res/drawable/splash.png` - Splash screen drawable
- `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher.png` - App icons for all densities
- `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities - `android/app/src/main/res/mipmap-*/ic_launcher_round.png` - Round app icons for all densities
### Density Levels Checked ### Density Levels Checked
- `mipmap-mdpi` (1x) - `mipmap-mdpi` (1x)
- `mipmap-hdpi` (1.5x) - `mipmap-hdpi` (1.5x)
- `mipmap-xhdpi` (2x) - `mipmap-xhdpi` (2x)
@ -64,6 +69,7 @@ npm run build:android:studio
## Usage ## Usage
### Automatic Validation (Recommended) ### Automatic Validation (Recommended)
The validation runs automatically during all Android builds: The validation runs automatically during all Android builds:
```bash ```bash
@ -78,6 +84,7 @@ npm run build:android:debug
``` ```
### Manual Validation ### Manual Validation
Run validation only to check/fix assets: Run validation only to check/fix assets:
```bash ```bash
@ -89,6 +96,7 @@ npm run assets:validate:android
``` ```
### Validation Only (No Regeneration) ### Validation Only (No Regeneration)
Check configuration without fixing: Check configuration without fixing:
```bash ```bash
@ -98,6 +106,7 @@ npm run assets:validate
## Error Handling ## Error Handling
### Missing Source Assets ### Missing Source Assets
If source assets are missing, the build fails with clear error messages: If source assets are missing, the build fails with clear error messages:
``` ```
@ -108,6 +117,7 @@ If source assets are missing, the build fails with clear error messages:
``` ```
### Missing Generated Resources ### Missing Generated Resources
If generated resources are missing, they're automatically regenerated: If generated resources are missing, they're automatically regenerated:
``` ```
@ -119,6 +129,7 @@ If generated resources are missing, they're automatically regenerated:
``` ```
### Generation Failure ### Generation Failure
If regeneration fails, helpful guidance is provided: If regeneration fails, helpful guidance is provided:
``` ```
@ -131,6 +142,7 @@ If regeneration fails, helpful guidance is provided:
## Integration Points ## Integration Points
### Build Script Integration ### Build Script Integration
The validation is integrated into the main build process: The validation is integrated into the main build process:
```bash ```bash
@ -143,6 +155,7 @@ validate_android_assets || {
``` ```
### NPM Scripts ### NPM Scripts
New npm scripts for asset management: New npm scripts for asset management:
```json ```json
@ -156,17 +169,20 @@ New npm scripts for asset management:
## Benefits ## Benefits
### For Developers ### For Developers
- **No More Build Failures**: Automatic detection and fixing of missing resources - **No More Build Failures**: Automatic detection and fixing of missing resources
- **Faster Development**: No need to manually run asset generation tools - **Faster Development**: No need to manually run asset generation tools
- **Clear Error Messages**: Helpful guidance when issues occur - **Clear Error Messages**: Helpful guidance when issues occur
- **Consistent Results**: Same validation on all development machines - **Consistent Results**: Same validation on all development machines
### For CI/CD ### For CI/CD
- **Reliable Builds**: Consistent asset validation across environments - **Reliable Builds**: Consistent asset validation across environments
- **Early Detection**: Catches issues before they reach production - **Early Detection**: Catches issues before they reach production
- **Automated Fixes**: Self-healing builds when possible - **Automated Fixes**: Self-healing builds when possible
### For Project Maintenance ### For Project Maintenance
- **Reduced Support**: Fewer "build doesn't work" issues - **Reduced Support**: Fewer "build doesn't work" issues
- **Documentation**: Clear requirements for required assets - **Documentation**: Clear requirements for required assets
- **Standardization**: Consistent asset structure across the project - **Standardization**: Consistent asset structure across the project
@ -176,21 +192,27 @@ New npm scripts for asset management:
### Common Issues ### Common Issues
#### "No assets found in the asset path" #### "No assets found in the asset path"
This occurs when the `assets/` directory is empty. The validation system automatically copies source assets and regenerates them. This occurs when the `assets/` directory is empty. The validation system automatically copies source assets and regenerates them.
#### "Failed to generate Android assets" #### "Failed to generate Android assets"
Check that: Check that:
- Source assets exist in `resources/` - Source assets exist in `resources/`
- `@capacitor/assets` is installed - `@capacitor/assets` is installed
- You have write permissions to the Android directories - You have write permissions to the Android directories
#### "Asset generation completed but some resources are still missing" #### "Asset generation completed but some resources are still missing"
This indicates a problem with the asset generation tool. Try: This indicates a problem with the asset generation tool. Try:
1. Running `npm install` to ensure dependencies are up to date 1. Running `npm install` to ensure dependencies are up to date
2. Manually running `npx @capacitor/assets generate` 2. Manually running `npx @capacitor/assets generate`
3. Checking the asset generation logs for specific errors 3. Checking the asset generation logs for specific errors
### Manual Recovery ### Manual Recovery
If automatic regeneration fails, you can manually create the missing resources: If automatic regeneration fails, you can manually create the missing resources:
```bash ```bash
@ -213,12 +235,14 @@ rm assets/icon.png assets/splash.png assets/splash_dark.png
## Future Enhancements ## Future Enhancements
### Planned Improvements ### Planned Improvements
- **iOS Asset Validation**: Extend validation to iOS assets - **iOS Asset Validation**: Extend validation to iOS assets
- **Asset Quality Checks**: Validate image dimensions and formats - **Asset Quality Checks**: Validate image dimensions and formats
- **Performance Optimization**: Cache validation results - **Performance Optimization**: Cache validation results
- **CI/CD Integration**: Add validation to GitHub Actions - **CI/CD Integration**: Add validation to GitHub Actions
### Configuration Options ### Configuration Options
- **Custom Asset Paths**: Support for different asset directory structures - **Custom Asset Paths**: Support for different asset directory structures
- **Validation Rules**: Configurable validation requirements - **Validation Rules**: Configurable validation requirements
- **Skip Options**: Ability to skip validation for specific scenarios - **Skip Options**: Ability to skip validation for specific scenarios

2
doc/architecture-decisions.md

@ -122,4 +122,4 @@ export default class HomeView extends Vue {
--- ---
*This decision was made based on the current codebase architecture and team expertise. The mixin approach provides the best balance of performance, developer experience, and architectural consistency for the TimeSafari application.* _This decision was made based on the current codebase architecture and team expertise. The mixin approach provides the best balance of performance, developer experience, and architectural consistency for the TimeSafari application._

4
doc/error-diagnostics-log.md

@ -92,5 +92,5 @@ Multiple stack traces showing Vue router navigation and component mounting cycle
3. Address API/server issues in separate debugging session 3. Address API/server issues in separate debugging session
--- ---
*Log Entry by: Migration Assistant* _Log Entry by: Migration Assistant_
*Session: ProjectsView.vue Triple Migration Pattern* _Session: ProjectsView.vue Triple Migration Pattern_

22
doc/meta_rule_usage_guide.md

@ -32,6 +32,7 @@ you apply 1-3 meta-rules that automatically include everything you need.
### **Step 1: Always Start with Core Always-On** ### **Step 1: Always Start with Core Always-On**
**Every single interaction** starts with: **Every single interaction** starts with:
``` ```
meta_core_always_on.mdc meta_core_always_on.mdc
``` ```
@ -65,12 +66,14 @@ meta_core_always_on + meta_research + meta_bug_diagnosis
**Important**: Meta-rules represent **workflow phases**, not a rigid sequence. You can: **Important**: Meta-rules represent **workflow phases**, not a rigid sequence. You can:
### **Jump Between Phases Freely** ### **Jump Between Phases Freely**
- **Start with diagnosis** if you already know the problem - **Start with diagnosis** if you already know the problem
- **Go back to research** if your fix reveals new issues - **Go back to research** if your fix reveals new issues
- **Switch to planning** mid-implementation if scope changes - **Switch to planning** mid-implementation if scope changes
- **Document at any phase** - not just at the end - **Document at any phase** - not just at the end
### **Mode Switching by Invoking Meta-Rules** ### **Mode Switching by Invoking Meta-Rules**
Each meta-rule invocation **automatically switches your workflow mode**: Each meta-rule invocation **automatically switches your workflow mode**:
``` ```
@ -80,11 +83,13 @@ Planning Mode → Invoke @meta_feature_implementation → Implementation Mode
``` ```
### **Phase Constraints, Not Sequence Constraints** ### **Phase Constraints, Not Sequence Constraints**
- **Within each phase**: Clear constraints on what you can/cannot do - **Within each phase**: Clear constraints on what you can/cannot do
- **Between phases**: Complete freedom to move as needed - **Between phases**: Complete freedom to move as needed
- **No forced order**: Choose the phase that matches your current need - **No forced order**: Choose the phase that matches your current need
### **Example of Flexible Workflow** ### **Example of Flexible Workflow**
``` ```
1. Start with @meta_research (investigation mode) 1. Start with @meta_research (investigation mode)
2. Jump to @meta_bug_diagnosis (diagnosis mode) 2. Jump to @meta_bug_diagnosis (diagnosis mode)
@ -103,16 +108,19 @@ Planning Mode → Invoke @meta_feature_implementation → Implementation Mode
**Scenario**: User reports that the contact list isn't loading properly **Scenario**: User reports that the contact list isn't loading properly
**Initial Meta-Rule Selection**: **Initial Meta-Rule Selection**:
``` ```
meta_core_always_on + meta_research + meta_bug_diagnosis meta_core_always_on + meta_research + meta_bug_diagnosis
``` ```
**What This Gives You**: **What This Gives You**:
- **Core Always-On**: Human competence focus, time standards, context - **Core Always-On**: Human competence focus, time standards, context
- **Research**: Systematic investigation methodology, evidence collection - **Research**: Systematic investigation methodology, evidence collection
- **Bug Diagnosis**: Defect analysis framework, root cause identification - **Bug Diagnosis**: Defect analysis framework, root cause identification
**Flexible Workflow**: **Flexible Workflow**:
1. Apply core always-on for foundation 1. Apply core always-on for foundation
2. Use research meta-rule for systematic investigation 2. Use research meta-rule for systematic investigation
3. Switch to bug diagnosis when you have enough evidence 3. Switch to bug diagnosis when you have enough evidence
@ -125,16 +133,19 @@ meta_core_always_on + meta_research + meta_bug_diagnosis
**Scenario**: Building a new contact search feature **Scenario**: Building a new contact search feature
**Meta-Rule Selection**: **Meta-Rule Selection**:
``` ```
meta_core_always_on + meta_feature_planning + meta_feature_implementation meta_core_always_on + meta_feature_planning + meta_feature_implementation
``` ```
**What This Gives You**: **What This Gives You**:
- **Core Always-On**: Foundation principles and context - **Core Always-On**: Foundation principles and context
- **Feature Planning**: Requirements analysis, architecture planning - **Feature Planning**: Requirements analysis, architecture planning
- **Feature Implementation**: Development workflow, testing strategy - **Feature Implementation**: Development workflow, testing strategy
**Iterative Workflow**: **Iterative Workflow**:
1. Start with core always-on 1. Start with core always-on
2. Use feature planning for design and requirements 2. Use feature planning for design and requirements
3. Switch to feature implementation for coding and testing 3. Switch to feature implementation for coding and testing
@ -147,15 +158,18 @@ meta_core_always_on + meta_feature_planning + meta_feature_implementation
**Scenario**: Writing a migration guide for the new database system **Scenario**: Writing a migration guide for the new database system
**Meta-Rule Selection**: **Meta-Rule Selection**:
``` ```
meta_core_always_on + meta_documentation meta_core_always_on + meta_documentation
``` ```
**What This Gives You**: **What This Gives You**:
- **Core Always-On**: Foundation and context - **Core Always-On**: Foundation and context
- **Documentation**: Educational focus, templates, quality standards - **Documentation**: Educational focus, templates, quality standards
**Parallel Workflow**: **Parallel Workflow**:
1. Apply core always-on for foundation 1. Apply core always-on for foundation
2. Use documentation meta-rule for educational content creation 2. Use documentation meta-rule for educational content creation
3. **Can research** while documenting if you need more information 3. **Can research** while documenting if you need more information
@ -198,27 +212,35 @@ Each meta-rule includes success criteria. Use these to validate your work:
## Common Meta-Rule Combinations ## Common Meta-Rule Combinations
### **Research + Diagnosis** ### **Research + Diagnosis**
``` ```
meta_core_always_on + meta_research + meta_bug_diagnosis meta_core_always_on + meta_research + meta_bug_diagnosis
``` ```
**Use for**: Complex bug investigations requiring systematic analysis **Use for**: Complex bug investigations requiring systematic analysis
### **Planning + Implementation** ### **Planning + Implementation**
``` ```
meta_core_always_on + meta_feature_planning + meta_feature_implementation meta_core_always_on + meta_feature_planning + meta_feature_implementation
``` ```
**Use for**: End-to-end feature development from concept to deployment **Use for**: End-to-end feature development from concept to deployment
### **Research + Planning** ### **Research + Planning**
``` ```
meta_core_always_on + meta_research + meta_feature_planning meta_core_always_on + meta_research + meta_feature_planning
``` ```
**Use for**: Feasibility research and solution design **Use for**: Feasibility research and solution design
### **Documentation + Context** ### **Documentation + Context**
``` ```
meta_core_always_on + meta_documentation + [context-specific] meta_core_always_on + meta_documentation + [context-specific]
``` ```
**Use for**: Creating comprehensive, educational documentation **Use for**: Creating comprehensive, educational documentation
## Best Practices ## Best Practices

231
doc/notification-system.md

@ -0,0 +1,231 @@
# TimeSafari — Native-First Notification System
**Status:** Ready for implementation
**Date:** 2025-09-07
**Author:** Matthew Raymer
---
## Executive Summary
Ship a **single, Native-First** notification system: OS-scheduled **background prefetch at T–lead** + **pre-armed** local notifications. Web-push is retired.
### What we deliver
- **Closed-app delivery:** Pre-armed locals fire even if the app is closed.
- **Freshness:** One prefetch attempt per slot at **T–lead**; ETag/TTL controls; skip when stale.
- **Android precision:** Exact alarms with permission; windowed fallback (±10m) otherwise.
- **Resilience:** Re-arm after reboot/time-change (Android receivers; iOS on next wake/silent push).
- **Cross-platform:** Same TS API (iOS/Android/Electron). Electron is best-effort while running.
### Success signals
- High delivery reliability, minute-precision on Android with permission.
- Prefetch budget hit rate at **T–lead**; zero stale deliveries beyond TTL.
---
## Strategic Plan
### Goal
Deliver 1..M daily notifications with **OS background prefetch at T–lead** and **rolling-window safety** so messages display with fresh content even when the app is closed.
### Tenets
- **Reliability first:** OS delivers once scheduled; no JS at delivery time.
- **Freshness with guardrails:** Prefetch at **T–lead**; enforce **TTL-at-fire**; ETag-aware.
- **Single system:** One TS API; native adapters swap under the hood.
- **Platform honesty:** Android exactness via permission; iOS best-effort budget.
### Architecture (high level)
App (Vue/TS) → Orchestrator (policy) → Native Adapters:
- **SchedulerNative** — AlarmManager (Android) / UNUserNotificationCenter (iOS)
- **BackgroundPrefetchNative** — WorkManager (Android) / BGTaskScheduler (+ silent push) (iOS)
- **DataStore** — SQLite
**Storage (single shared DB):** The app and the native plugin will use **the same SQLite database file**. The app owns schema/migrations; the plugin opens the same file with WAL enabled and performs short, serialized writes. This keeps one source of truth for payloads, delivery logs, and config.
### SQLite Ownership & Concurrency
* **One DB file:** The plugin opens the **same path** the app uses (no second DB).
* **Migrations owned by app:** The app executes schema migrations and bumps `PRAGMA user_version`. The plugin **never** migrates; it **asserts** the expected version.
* **WAL mode:** Open DB with `journal_mode=WAL`, `synchronous=NORMAL`, `busy_timeout=5000`, `foreign_keys=ON`. WAL allows foreground reads while a background job commits quickly.
* **Single-writer discipline:** Background jobs write in **short transactions** (UPSERT per slot), then return.
* **Encryption (optional):** If using SQLCipher, the **same key** is used by both app and plugin. Do not mix encrypted and unencrypted openings.
### Scheduling & T–lead
- **Arm** a rolling window (today + tomorrow within iOS cap).
- **Attempt** a single **online-first** fetch per slot at **T–lead = T − prefetchLeadMinutes**.
- If prefetch is skipped, the armed local **still fires** using cached content.
### Policies
- **TTL-at-fire:** If (T − fetchedAt) > `ttlSeconds`**skip** arming.
- **Android exactness:** Request `SCHEDULE_EXACT_ALARM`; fallback **±10m** window.
- **Reboot/time change:** Android receivers re-arm next 24h; iOS on next wake/silent push.
- **No delivery-time mutation:** iOS locals cannot be mutated by NSE; render before scheduling.
---
## Implementation Guide
### 1) Interfaces (TS stable)
- **SchedulerNative**: `scheduleExact({slotId, whenMs, title, body, extra})`, `scheduleWindow(..., windowLenMs)`, `cancelBySlot`, `rescheduleAll`, `capabilities()`
- **BackgroundPrefetchNative**: `schedulePrefetch(slotId, atMs)`, `cancelPrefetch(slotId)`
- **DataStore**: SQLite adapters (notif_contents, notif_deliveries, notif_config)
- **Public API**: `configure`, `requestPermissions`, `runFullPipelineNow`, `reschedule`, `getState`
### DB Path & Adapter Configuration
* **Configure option:** `dbPath: string` (absolute path or platform alias) is passed from JS to the plugin during `configure()`.
* **Shared tables:**
* `notif_contents(slot_id, payload_json, fetched_at, etag, …)`
* `notif_deliveries(slot_id, fire_at, delivered_at, status, error_code, …)`
* `notif_config(k, v)`
* **Open settings:**
* `journal_mode=WAL`
* `synchronous=NORMAL`
* `busy_timeout=5000`
* `foreign_keys=ON`
**Type (TS) extension**
```ts
export type ConfigureOptions = {
// …existing fields…
dbPath: string; // shared DB file the plugin will open
storage: 'shared'; // canonical value; plugin-owned DB is not used
};
```
**Plugin side (pseudo)**
```kotlin
// Android open
val db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE)
db.execSQL("PRAGMA journal_mode=WAL")
db.execSQL("PRAGMA synchronous=NORMAL")
db.execSQL("PRAGMA foreign_keys=ON")
db.execSQL("PRAGMA busy_timeout=5000")
// Verify schema version
val uv = rawQuery("PRAGMA user_version").use { it.moveToFirst(); it.getInt(0) }
require(uv >= MIN_EXPECTED_VERSION) { "Schema version too old" }
```
```swift
// iOS open (FMDB / SQLite3)
// Set WAL via PRAGMA after open; check user_version the same way.
```
### 2) Templating & Arming
- Render `title/body` **before** scheduling; pass via **SchedulerNative**.
- Route all arming through **SchedulerNative** to centralize Android exact/window semantics.
### 3) T–lead (single attempt)
**T–lead governs prefetch, not arming.** We **arm** one-shot locals as part of the rolling window so closed-app delivery is guaranteed. At **T–lead = T − prefetchLeadMinutes**, the **native background job** attempts **one** 12s ETag-aware fetch. If fresh content arrives and will not violate **TTL-at-fire**, we (re)arm the upcoming slot; if the OS skips the wake, the pre-armed local still fires with cached content.
- Compute T–lead = `whenMs - prefetchLeadMinutes*60_000`.
- `BackgroundPrefetchNative.schedulePrefetch(slotId, atMs=T–lead)`.
- On wake: **ETag** fetch (timeout **12s**), persist, optionally cancel & re-arm if within TTL.
- Never fetch at delivery time.
### 4) TTL-at-fire
**TTL-at-fire:** Before arming for time **T**, compute `T − fetchedAt`. If that exceeds `ttlSeconds`, **do not arm** (skip). This prevents posting stale notifications when the app has been closed for a long time.
`if (whenMs - fetchedAt) > ttlSeconds*1000 → skip`
### 5) Android specifics
- Request `SCHEDULE_EXACT_ALARM`; deep-link if denied; fallback to `setWindow(start,len)` (±10m).
- Receivers: `BOOT_COMPLETED`, `TIMEZONE_CHANGED`, `TIME_SET` → recompute & re-arm for next 24h and schedule T–lead prefetch.
### 6) iOS specifics
- `BGTaskScheduler` for T–lead prefetch (best-effort). Optional silent push nudge.
- Locals: `UNCalendarNotificationTrigger` (one-shots); no NSE mutation for locals.
### 7) Network & Timeouts
- Content fetch: **12s** timeout; single attempt at T–lead; ETag/304 respected.
- ACK/Error: **8s** timeout, fire-and-forget.
### 8) Electron
- Notifications while app is running; recommend **Start-on-Login**. No true background scheduling when fully closed.
### 9) Telemetry
- Record `scheduled|shown|error`; ACK deliveries (8s timeout); include slot/times/TZ/app version.
---
## Capability Matrix
| Capability | Android (Native) | iOS (Native) | Electron | Web |
|---|---|---|---|---|
| Multi-daily locals (closed app) | ✅ | ✅ | ✅ (app running) | — |
| Prefetch at T–lead (app closed) | ✅ WorkManager | ⚠️ BGTask (best-effort) | ✅ (app running) | — |
| Re-arm after reboot/time-change | ✅ Receivers | ⚠️ On next wake/silent push | ✅ Start-on-Login | — |
| Minute-precision alarms | ✅ with exact permission | ❌ not guaranteed | ✅ timer best-effort | — |
| Delivery-time mutation for locals | ❌ | ❌ | — | — |
| ETag/TTL enforcement | ✅ | ✅ | ✅ | — |
| Rolling-window safety | ✅ | ✅ | ✅ | — |
---
## Acceptance Criteria
### Core
- **Closed-app delivery:** Armed locals fire at T with last rendered content. No delivery-time network.
- **T–lead prefetch:** Single background attempt at **T–lead**; if skipped, delivery still occurs from cache.
- **TTL-at-fire:** No armed local violates TTL at T.
### Android
- **Exact permission path:** With `SCHEDULE_EXACT_ALARM` → within ±1m; else **±10m** window.
- **Reboot recovery:** After reboot, receivers re-arm next 24h and schedule T–lead prefetch.
- **TZ/DST change:** Recompute & re-arm; future slots align to new wall-clock.
### iOS
- **BGTask budget respected:** Prefetch often runs but may be skipped; delivery still occurs via rolling window.
- **Force-quit caveat:** No background execution after user terminate; delivery still occurs if pre-armed.
### Electron
- **Running-app rule:** Delivery only while app runs; with Start-on-Login, after reboot the orchestrator re-arms and subsequent slots deliver.
### Network
- Content fetch timeout **12s**; ACK/Error **8s**; no retries inside lead; ETag honored.
### Observability
- Log/telemetry for `scheduled|shown|error`; ACK payload includes slot, times, device TZ, app version.
### DB Sharing
* **Shared DB visibility:** A background prefetch writes `notif_contents`; the foreground UI **immediately** reads the same row.
* **WAL overlap:** With the app reading while the plugin commits, no user-visible blocking occurs.
* **Version safety:** If `user_version` is behind, the plugin emits an error and does not write (protects against partial installs).
---
## Web-Push Cleanup
Web-push functionality has been retired due to unreliability. All web-push related code paths and documentation sections should be removed or marked as deprecated. See `web-push-cleanup-guide.md` for detailed cleanup steps.
---
_This document consolidates the Native-First notification system strategy, implementation details, capabilities, and acceptance criteria into a single comprehensive reference._

551
doc/web-push-cleanup-guide.md

@ -0,0 +1,551 @@
# TimeSafari Web-Push Cleanup Guide
**Status:** 🚀 Native-First Implementation
**Date:** 2025-01-27T14:30Z (UTC)
**Author:** Matthew Raymer
**Scope:** Web-push code cleanup and deprecation
**Goal:** Remove or quarantine all web-push code paths and mark as deprecated.
---
## Executive Summary
This document provides a comprehensive cleanup guide for removing web-push code
paths from TimeSafari. Web-push has been retired for unreliability, and the
system now focuses on native mobile reliability with Electron best-effort support.
---
## Cleanup Strategy
### Phase 1: Identify Web-Push Code Paths
#### Service Worker Files
- [ ] `sw_scripts/notification-click.js` - Mark as deprecated
- [ ] `sw_scripts/` directory - Review for web-push dependencies
- [ ] Service worker registration code - Remove or quarantine
#### Web-Specific Code
- [ ] Web push notification handlers
- [ ] Service worker event listeners
- [ ] Web notification API usage
- [ ] Push subscription management
#### Configuration Files
- [ ] VitePWA plugin configuration
- [ ] Service worker build configuration
- [ ] Web push manifest files
### Phase 2: Mark as Deprecated
#### Code Comments
```javascript
// DEPRECATED: Web-push notification handling
// This code is kept for reference but not used in production
// Replaced by Native-First notification system
```
#### Documentation Updates
- [ ] Mark web-push sections as deprecated
- [ ] Add deprecation notices
- [ ] Update README files
- [ ] Update API documentation
### Phase 3: Remove or Quarantine
#### Complete Removal
- [ ] Web push subscription code
- [ ] Service worker notification handlers
- [ ] Web-specific notification APIs
- [ ] Push message handling
#### Quarantine (Keep for Reference)
- [ ] Service worker registration code
- [ ] Web push configuration
- [ ] Historical web-push tests
---
## Detailed Cleanup Tasks
### 1. Service Worker Cleanup
#### Files to Deprecate
**`sw_scripts/notification-click.js`**
```javascript
// DEPRECATED: Service worker notification handling
// This code is kept for reference but not used in production
// Replaced by Native-First notification system
// Original web-push notification click handler
self.addEventListener('notificationclick', (event) => {
// DEPRECATED: Web-push only
event.notification.close();
const slotId = event.notification.data?.slotId;
const route = slotId ? '/#/daily' : '/#/notifications';
event.waitUntil(
clients.openWindow(route).catch(() => {
return clients.openWindow('/');
})
);
});
```
**Service Worker Registration**
```javascript
// DEPRECATED: Service worker registration
// This code is kept for reference but not used in production
// Replaced by Native-First notification system
if ('serviceWorker' in navigator && process.env.VITE_PLATFORM === 'web') {
// DEPRECATED: Web-push only
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker registered:', registration);
})
.catch(error => {
console.error('Service Worker registration failed:', error);
});
}
```
### 2. Web Push API Cleanup
#### Push Subscription Management
```javascript
// DEPRECATED: Web push subscription management
// This code is kept for reference but not used in production
// Replaced by Native-First notification system
class WebPushManager {
// DEPRECATED: Web-push only
async subscribeToPush() {
// Implementation kept for reference
}
// DEPRECATED: Web-push only
async unsubscribeFromPush() {
// Implementation kept for reference
}
}
```
#### Push Message Handling
```javascript
// DEPRECATED: Push message handling
// This code is kept for reference but not used in production
// Replaced by Native-First notification system
self.addEventListener('push', (event) => {
// DEPRECATED: Web-push only
const data = event.data ? event.data.json() : {};
const options = {
body: data.body,
icon: '/icon-192x192.png',
badge: '/badge-72x72.png',
data: data
};
event.waitUntil(
self.registration.showNotification(data.title, options)
);
});
```
### 3. Configuration Cleanup
#### VitePWA Plugin Configuration
```javascript
// DEPRECATED: VitePWA plugin configuration
// This configuration is kept for reference but not used in production
// Replaced by Native-First notification system
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
VitePWA({
// DEPRECATED: Web-push only
registerType: 'autoUpdate',
workbox: {
globPatterns: ['**/*.{js,css,html,ico,png,svg}']
},
includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'],
manifest: {
name: 'TimeSafari',
short_name: 'TimeSafari',
description: 'TimeSafari App',
theme_color: '#ffffff',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png'
}
]
}
})
]
})
```
#### Service Worker Build Configuration
```javascript
// DEPRECATED: Service worker build configuration
// This configuration is kept for reference but not used in production
// Replaced by Native-First notification system
export default defineConfig({
build: {
rollupOptions: {
input: {
// DEPRECATED: Web-push only
sw: 'sw_scripts/notification-click.js'
}
}
}
})
```
### 4. Test Cleanup
#### Web Push Tests
```javascript
// DEPRECATED: Web push tests
// These tests are kept for reference but not used in production
// Replaced by Native-First notification system
describe('Web Push Notifications (DEPRECATED)', () => {
// DEPRECATED: Web-push only
it('should handle push notifications', async () => {
// Test implementation kept for reference
});
// DEPRECATED: Web-push only
it('should handle notification clicks', async () => {
// Test implementation kept for reference
});
});
```
#### Service Worker Tests
```javascript
// DEPRECATED: Service worker tests
// These tests are kept for reference but not used in production
// Replaced by Native-First notification system
describe('Service Worker (DEPRECATED)', () => {
// DEPRECATED: Web-push only
it('should register service worker', async () => {
// Test implementation kept for reference
});
// DEPRECATED: Web-push only
it('should handle push events', async () => {
// Test implementation kept for reference
});
});
```
### 5. Documentation Cleanup
#### README Updates
```markdown
# TimeSafari Native-First Notification System
## Web-Push Status: DEPRECATED
Web-push has been retired for unreliability. The system now focuses on native mobile reliability with Electron best-effort support.
### Deprecated Features
- ❌ Web push notifications
- ❌ Service worker notification handling
- ❌ Web notification API
### Active Features
- ✅ Native mobile notifications (Android/iOS)
- ✅ Electron notifications (best-effort)
- ✅ OS-scheduled background prefetch
- ✅ Rolling window safety
```
#### API Documentation Updates
```markdown
## Notification API (Native-First)
### Deprecated Methods
- `subscribeToPush()` - DEPRECATED: Web-push only
- `unsubscribeFromPush()` - DEPRECATED: Web-push only
- `handlePushMessage()` - DEPRECATED: Web-push only
### Active Methods
- `scheduleExact()` - Native exact scheduling
- `scheduleWindow()` - Native windowed scheduling
- `schedulePrefetch()` - Native background prefetch
```
---
## File-by-File Cleanup Checklist
### Service Worker Files
- [ ] `sw_scripts/notification-click.js` - Mark as deprecated
- [ ] `sw_scripts/` directory - Review for web-push dependencies
- [ ] Service worker build configuration - Remove or quarantine
### Web-Specific Code
- [ ] `src/main.web.ts` - Remove service worker registration
- [ ] `src/services/webPush.ts` - Mark as deprecated
- [ ] `src/utils/serviceWorker.ts` - Mark as deprecated
- [ ] Web notification API usage - Remove or quarantine
### Configuration Files
- [ ] `vite.config.web.mts` - Remove VitePWA plugin
- [ ] `package.json` - Remove web-push dependencies
- [ ] `public/manifest.json` - Mark as deprecated
- [ ] Service worker build scripts - Remove or quarantine
### Test Files
- [ ] `test-playwright/web-push.spec.ts` - Mark as deprecated
- [ ] `test/services/webPush.test.ts` - Mark as deprecated
- [ ] Service worker tests - Mark as deprecated
### Documentation Files
- [ ] `README.md` - Update to reflect native-first approach
- [ ] `doc/web-push.md` - Mark as deprecated
- [ ] API documentation - Remove web-push references
---
## Dependencies to Remove
### NPM Packages
```json
{
"dependencies": {
// DEPRECATED: Web-push only
"web-push": "^7.4.0",
"vite-plugin-pwa": "^0.17.0"
},
"devDependencies": {
// DEPRECATED: Web-push only
"workbox-webpack-plugin": "^6.5.0"
}
}
```
### Build Scripts
```json
{
"scripts": {
// DEPRECATED: Web-push only
"build:sw": "workbox generateSW",
"test:sw": "jest --testPathPattern=serviceWorker"
}
}
```
---
## Migration Guide
### From Web-Push to Native-First
#### Step 1: Remove Web-Push Dependencies
```bash
# Remove web-push packages
npm uninstall web-push vite-plugin-pwa workbox-webpack-plugin
# Remove service worker files
rm -rf sw_scripts/
rm -f public/sw.js
rm -f public/workbox-*.js
```
#### Step 2: Update Configuration
```javascript
// Remove VitePWA plugin from vite.config.web.mts
export default defineConfig({
plugins: [
// Remove VitePWA plugin
// VitePWA({ ... })
]
})
```
#### Step 3: Update Service Registration
```javascript
// Remove service worker registration from main.web.ts
// if ('serviceWorker' in navigator) {
// navigator.serviceWorker.register('/sw.js')
// }
```
#### Step 4: Update Tests
```javascript
// Remove web-push tests
// describe('Web Push Notifications', () => { ... })
```
---
## Verification Checklist
### Code Removal Verification
- [ ] No web-push imports remain
- [ ] No service worker registration code
- [ ] No push subscription management
- [ ] No web notification API usage
- [ ] No VitePWA plugin configuration
### Documentation Verification
- [ ] All web-push references marked as deprecated
- [ ] README updated to reflect native-first approach
- [ ] API documentation updated
- [ ] Test documentation updated
### Build Verification
- [ ] Web build succeeds without service worker
- [ ] No service worker files generated
- [ ] No web-push dependencies in bundle
- [ ] Native builds work correctly
### Test Verification
- [ ] Web-push tests are marked as deprecated
- [ ] Native notification tests pass
- [ ] No web-push test failures
- [ ] Test suite runs successfully
---
## Rollback Plan
### Emergency Rollback
If native-first implementation fails, web-push code can be restored:
#### 1. **Restore Dependencies**
```bash
npm install web-push vite-plugin-pwa workbox-webpack-plugin
```
#### 2. **Restore Service Worker Files**
```bash
git checkout HEAD~1 -- sw_scripts/
git checkout HEAD~1 -- public/sw.js
```
#### 3. **Restore Configuration**
```bash
git checkout HEAD~1 -- vite.config.web.mts
git checkout HEAD~1 -- package.json
```
#### 4. **Restore Tests**
```bash
git checkout HEAD~1 -- test-playwright/web-push.spec.ts
git checkout HEAD~1 -- test/services/webPush.test.ts
```
### Rollback Verification
- [ ] Web-push functionality restored
- [ ] Service worker registration works
- [ ] Push notifications work
- [ ] Tests pass
---
## Post-Cleanup Tasks
### Code Review
- [ ] Review all changes for completeness
- [ ] Verify no web-push code remains
- [ ] Check for orphaned references
- [ ] Validate native-first implementation
### Testing
- [ ] Run full test suite
- [ ] Verify native notifications work
- [ ] Check Electron functionality
- [ ] Validate mobile builds
### Documentation
- [ ] Update all documentation
- [ ] Remove web-push references
- [ ] Update API documentation
- [ ] Update user guides
---
## Success Criteria
### Complete Web-Push Removal
- [ ] All web-push code marked as deprecated
- [ ] Service worker files quarantined
- [ ] Dependencies removed
- [ ] Configuration updated
### Native-First Implementation
- [ ] Native notifications work on Android
- [ ] Native notifications work on iOS
- [ ] Electron notifications work
- [ ] Background prefetch works
### Documentation Updated
- [ ] All docs reflect native-first approach
- [ ] Web-push marked as deprecated
- [ ] Migration guide provided
- [ ] Rollback plan documented
---
_This cleanup guide provides comprehensive instructions for removing web-push
code paths from TimeSafari. Web-push has been retired for unreliability, and the
system now focuses on native mobile reliability with Electron best-effort support._

5
doc/z-index-guide.md

@ -5,12 +5,15 @@
**Status**: 🎯 **ACTIVE** - Z-index layering standards **Status**: 🎯 **ACTIVE** - Z-index layering standards
## Objective ## Objective
Establish consistent z-index values across the TimeSafari application to ensure proper layering of UI elements. Establish consistent z-index values across the TimeSafari application to ensure proper layering of UI elements.
## Result ## Result
This document defines the z-index hierarchy for all UI components. This document defines the z-index hierarchy for all UI components.
## Use/Run ## Use/Run
Reference these values when implementing new components or modifying existing ones to maintain consistent layering. Reference these values when implementing new components or modifying existing ones to maintain consistent layering.
## Z-Index Hierarchy ## Z-Index Hierarchy
@ -51,7 +54,7 @@ Reference these values when implementing new components or modifying existing on
## Collaboration Hooks ## Collaboration Hooks
- **Reviewers**: Frontend team, UI/UX designers - **Reviewers**: Frontend team, UI/UX designers
- **Sign-off checklist**: - **Sign-off checklist**:
- [ ] All new components follow z-index guidelines - [ ] All new components follow z-index guidelines
- [ ] Existing components updated to use defined values - [ ] Existing components updated to use defined values
- [ ] Cross-browser testing completed - [ ] Cross-browser testing completed

1
package.json

@ -136,7 +136,6 @@
"*.{js,ts,vue,css,json,yml,yaml}": "eslint --fix || true", "*.{js,ts,vue,css,json,yml,yaml}": "eslint --fix || true",
"*.{md,markdown,mdc}": "markdownlint-cli2 --fix" "*.{md,markdown,mdc}": "markdownlint-cli2 --fix"
}, },
"dependencies": { "dependencies": {
"@capacitor-community/electron": "^5.0.1", "@capacitor-community/electron": "^5.0.1",
"@capacitor-community/sqlite": "6.0.2", "@capacitor-community/sqlite": "6.0.2",

Loading…
Cancel
Save