plover-store-schema

Diagnose vestigial columns and unreliable timestamp signals in the Plover SQLite store schema.

1|Updated May 24, 2026
One-click install
npx skills add https://github.com/tryplover/Plover --skill plover-store-schema-tryplover
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: plover-store-schema
Source: https://github.com/tryplover/Plover/tree/main/.claude/skills/plover-store-schema
Command: npx skills add https://github.com/tryplover/Plover --skill plover-store-schema-tryplover

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Prevents two recurring schema mistakes in the Plover Electron app's SQLite store: referencing the vestigial calendar_event_id column left over from the removed calendar-sync feature, and misusing tasks.created_at or tasks.updated_at as a "task age" signal when both are silently invalidated by bulk subtask creation and progress-increment writes. ## Core Features & Use Cases - Vestigial Column Guidance: Explains why tasks.calendar_event_id still exists in store/db.ts, why it must not be referenced, and how to drop it properly with an ALTER TABLE tasks DROP COLUMN migration (SQLite >= 3.35) when already touching the tasks schema. - Timestamp Footgun Diagnosis: Details why Planner bulk-creates all subtasks with a shared created_at and why TasksRepo.incrementProgress() bumps updated_at on every call, creating a self-refreshing loop that breaks adaptive polling cadence. - Use Case: While building an adaptive polling cadence for InferenceEngine that polls faster for newly started tasks, use this Skill to learn that task age must be tracked in memory via a Map<taskId, timestampMs> of first-seen-in-progress timestamps rather than any persisted *_at column. ## Quick Start Ask the AI to review your changes to app/src/main/store/db.ts or your InferenceEngine polling logic and check them against the Plover store schema gotchas before referencing calendar_event_id or deriving task age from created_at or updated_at.

Frequently Asked Questions about plover-store-schema

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
Why can't I use created_at to tell when a task started?▼

The tasks.created_at column reflects when the goal was decomposed, not when work on a specific subtask began. Planner bulk-creates all of a goal's subtasks in one pass via TasksRepo.create(), so every subtask shares essentially the same created_at regardless of actual start time.

How do I track task age for adaptive polling cadence?▼

Track first-seen-in-progress timestamps in memory using a Map<taskId, timestampMs>, recording the moment each task is first observed with status in_progress and dropping entries when it leaves that status. Do not derive age from any persisted tasks timestamp column.

Why does updated_at cause a self-refreshing polling loop?▼

TasksRepo.incrementProgress() bumps updated_at on every call, including calls made by the inference pass reading it. Using updated_at as the age signal resets the timestamp each fast-cadence pass, so the task looks freshly started forever and the cadence never backs off.

Can I reference the calendar_event_id column in the tasks table?▼

No, calendar_event_id is vestigial after the calendar-sync removal and no application code reads or writes it. Only touch it via a proper ALTER TABLE tasks DROP COLUMN migration if you are already modifying the tasks schema; SQLite 3.35+ supports dropping columns.

Why wasn't calendar_event_id dropped when calendar sync was removed?▼

Dropping a column requires a new migration, and altering the v1 migration in place would break existing installs. The column was deliberately left in store/db.ts so existing databases stay usable until a proper migration is bundled with other tasks schema changes.