Pumice profile kinds and settings layout — tracking profiles, a Format tab, one placeholder syntax
State: open/proposed
Summary
Section titled “Summary”Pending — outcomes to be populated when this decision is accepted.
Context
Section titled “Context”Tracking mode shipped as a fourth interval kind on the same session table, started from the same profile list as pomodoro. A profile is a work context (name, default tags, notes template) and a pomodoro recipe (durations, cycle, auto-start) in one row. Track mode ignores the recipe, so a tracking profile’s form shows six fields that mean nothing, and both pickers show every profile.
The vault export (D-PVNF-pumice-vault-note-format) adds a write mode,
a property picker and two templates. Three template systems now exist with
two syntaxes: the profile notes template ({profile_name}, pre-fills the
journal), the vault body template ({{profile}}, renders the note) and the
vault entry template. The write mode sits on the Vault tab, but everything
it changes sits elsewhere.
Settings tabs today: General, Profiles, Vault, Templates, Sounds, Journal, Data. The journal switch reads “Show Journal after Focus” but also governs a tracked End.
Decision
Section titled “Decision”Profile kinds
Section titled “Profile kinds”pomodoro | track | |
|---|---|---|
| Fields | name, default tags, notes template, property rows, recipe (focus, short break, long break, pomodoros per cycle, auto-start) | name, default tags, notes template, property rows |
| Picker | the Pomodoro | Track toggle filters the focus view’s picker to one kind |
| Storage | TimerProfile.kind, #[serde(default)] to pomodoro, in AppConfig.timer_profiles | same list; no second list, no second entity |
| Seed | existing profiles stay pomodoro | one built-in General tracking profile so Track mode starts on day one |
Session rows keep profile_id. The vault format does not change. A
context-and-recipe split into two entities was considered and dropped: it
is cleaner in the abstract, but it adds a second pick to every start.
Settings tabs
Section titled “Settings tabs”General, Profiles, Journal, Sounds, Vault, Format, Data. Journal sits beside Profiles because it is part of the session flow. Templates becomes Format.
| Tab | Owns |
|---|---|
| Profiles | two lists, “Pomodoro profiles” and “Tracking profiles”; the tracking form is the short one |
| Journal | ”Show journal after focus” and “Show journal after a tracked End”, same default |
| Vault | folder, on and off, vault type, daily-note location, status; Advanced: folders, triggers, opener, tracker block |
| Format | ”Write as” at the top, then the controls that depend on it |
Format tab
Section titled “Format tab”| Write as | Below the select |
|---|---|
| A note per session | Properties table (rows of key, value, on and off; tags and cssclasses switches; rename-all action), body template with preview, Bases button |
| A list in the daily note | entry template with preview, daily-note heading |
Both templates are stored whichever mode is on, so switching modes never loses an edit. Vault keeps a stable shape; every mode-dependent control is under the control that decides it.
One placeholder syntax
Section titled “One placeholder syntax”The profile notes template moves to {{token}} with the vault templates’
token names. {profile_name}, {planned_minutes} and {started_at}
become {{profile}}, {{planned}} and {{start}}, migrated once at config
upgrade. One cheat sheet serves both forms. {{planned}} is added to the
token set; it is empty for a tracked session.
Property rows
Section titled “Property rows”Specified in D-PVNF-pumice-vault-note-format. Relevant here: a profile
carries rows of its own, merged by key after the vault’s, which is why the
profile form has the same key and value table as the Format tab. A profile
row with a vault row’s key overrides its value for that profile’s sessions.
- Kind, not two entities. The picker, the session row and the vault note all key off one profile id. A discriminator keeps that and still gives each mode a form with only its own fields.
- Format under the mode. A tab whose meaning changes behind the user’s back is the defect; a select whose choice reshapes the rest of the same tab is the fix.
- One syntax. Two placeholder styles in one app is a support cost with no upside. The profile template is the older and smaller one, so it moves.
Consequences
Section titled “Consequences”TimerProfilegainskindandproperties(rows);ProfileInputand the generated ops follow. Old configs load unchanged.JournalConfiggainsshow_after_tracked, default true.SettingsTemplatesis replaced bySettingsFormat; the property picker and Bases button leaveSettingsVault.- The focus view’s picker filters by the persisted timer mode. With one profile of a kind the picker hides, as it does today for one profile.
Migration
Section titled “Migration”Config upgrade only. kind defaults to pomodoro; a missing General
tracking profile is appended once; notes templates are rewritten to the new
syntax in place with a one-time notice, the same path the legacy vault
template takes.
Out of scope
Section titled “Out of scope”Per-profile template overrides for the vault; a per-profile vault folder; contexts as an entity separate from recipes.
Open questions
Section titled “Open questions”- Whether the
Generaltracking profile should be deletable once another tracking profile exists, or stay built-in likeBasic Pomodoro.