Skip to content

Commit a60f7e0

Browse files
agr77oneagcycleclaude
authored
2.1.1: meeting batch-skip fix + audit cleanup (#30)
Fix: content-less Quill meetings no longer re-queue forever. A meeting with neither minutes nor transcript is marked skipped (data/meeting_skips.jsonl, 2-day age guard) instead of re-failing every batch run as "0 of N, N errors". Batch result gains a `skipped` count; per-meeting reasons stay in daemon.log. LLM/provider failures are never skip-marked. Audit cleanup: - T11: open_chat default ^+t -> ^!c (first-run, grammar_fix snapshot, dashboard fallback) - T19: first-run wizard "chat popup" -> "Open chat" (tkinter popup retired in 2.0) - T13: bootstrap.cmd build banner no longer hardcodes a stale version - T15: README dashboard tab list 7 -> 8 (added Benchmark) - T12: seed-vs-schema drift guard test (test_config_seeds) - T20: audited docs; no stale daemon-log path to change Version bump 2.1.0 -> 2.1.1 (_version.py, pyproject.toml, installer.iss, README). SPEC: +V23, +B7, task statuses; CHANGELOG 2.1.1 section. Co-authored-by: agrechenkov <arseniy.grechenkov@cyclelabs.io> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 7835d4b commit a60f7e0

16 files changed

Lines changed: 343 additions & 31 deletions

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
22

33
## Unreleased
44

5+
## 2.1.1
6+
7+
**Maintenance.** Fixes a recurring meetings-batch error and clears a batch of small audit/doc items.
8+
9+
### Fixed
10+
11+
- **Meeting batch no longer retries content-less meetings forever.** A meeting Quill has neither minutes nor a transcript for (aborted/duplicate stub recordings) used to re-queue and re-fail on every batch run, so "Run batch now" and the after-hours scheduler kept reporting errors (e.g. "processed 0 of 5, 5 errors"). Such meetings are now marked skipped (`data/meeting_skips.jsonl`) and excluded from future queues — but only when the meeting is older than 2 days, so a just-ended meeting whose transcript is still syncing keeps retrying. LLM/provider failures are never skip-marked. The batch result now reports a `skipped` count, and per-meeting error reasons remain in `logs/daemon.log`.
12+
- The `open_chat` hotkey default is now `Ctrl+Alt+C` (`^!c`) everywhere. The retired `Ctrl+Shift+T` (`^+t`) still lingered as a fallback in the first-run wizard, the daemon's config snapshot, and the dashboard hotkey field, so a fresh config could surface the colliding old binding.
13+
14+
### Internal / docs
15+
16+
- First-run wizard text updated ("Open chat popup" → "Open chat") — the tkinter chat popup was retired in 2.0.
17+
- Installer bootstrapper (`bootstrap.cmd`) no longer prints a hardcoded stale version in its build banner.
18+
- README dashboard tab list corrected (added **Benchmark** → 8 tabs).
19+
- New seed-vs-schema drift guard test (`test_config_seeds`) freezes the known delta between the shipped first-run seed and `DEFAULT_CONFIG`.
20+
521
## 2.1.0
622

723
**Meetings, on your own time.** Flowkey can now read your local Quill meetings and answer questions about them on the local model — and an after-hours scheduler pre-computes each meeting's digest (summary / goals / action items) during your idle window, so daytime reads are instant.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Flowkey is a Windows desktop assistant that adds local-LLM hotkeys for grammar f
44

55
Everything runs locally through [FastFlowLM](https://fastflowlm.com) (AMD Ryzen AI NPU) or, on machines without the NPU, through [Ollama](https://ollama.com) (CPU/GPU) as a secondary provider. No cloud service, analytics, or telemetry is used by the app.
66

7-
Current version: `2.1.0`
7+
Current version: `2.1.1`
88

99
## What's new in 2.1
1010

@@ -112,7 +112,7 @@ Prefix tip: put the keyword on the first line of your selection — `prompt: rou
112112

113113
The dashboard is a web page served by the local daemon — open it from the tray menu ("Dashboard") or browse to `http://127.0.0.1:52650/`. It is loopback-only and works in any browser.
114114

115-
- **Tabs:** Overview, Chat, Telemetry, History, Notes, Meetings, Config.
115+
- **Tabs:** Overview, Chat, Telemetry, History, Notes, Meetings, Config, Benchmark.
116116
- **Theme:** auto-follows your OS day/night setting; the topbar button cycles auto → light → dark.
117117
- **Custom modes:** Config → Custom modes lets you add your own `prefix:` commands (id + system prompt). Changes apply to the running app within a second.
118118
- **Models:** pull models with live progress — pick a suggestion or type any name (on Ollama, anything from the [library](https://ollama.com/library) works); set active, remove. Suggestions are hardware-aware: detected RAM/VRAM caps the model size (e.g. 32 GB RAM → ~4B on the NPU; 8 GB VRAM → ~9B on the GPU), oversized models are hidden, and free-typing one asks before pulling.

SPEC.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
1616
- LLM: FastFlowLM NPU @ `:52625` | Ollama @ `:11434`, OpenAI-compat `POST /v1/chat/completions`
1717
- dashboard: daemon-served `scripts/ui/web/{index.html,app.js,styles.css}`, CSP `default-src 'self'`
1818
- paths: `scripts/paths.py` → USER_ROOT/{config,data,logs}; `_version.py` = version src of truth
19-
- version: `2.1.0` merged to `main`, tag/installer/Release NOT yet cut; public `2.0.0`; repo `agr77one/Fastflow`
19+
- version: `2.1.1` (this branch, maintenance); `2.1.0` released (tag on `7835d4b`); repo `agr77one/Fastflow`
2020
- run tree = `flowkey-pub2` (worktree, branch `live`=origin/main). old `FastFlowPrompt_Local_Setup`=1.5.0 stale.
2121

2222
## §I interfaces
@@ -30,15 +30,15 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
3030
- action: `quill_search_meetings {query,limit}``{meetings:[{id,title,date,duration,participants,url}]}`
3131
- action: `meeting_overview``{enabled,reachable,today:{count,minutes},week:{count,minutes}}`
3232
- action: `meeting_process {meeting_id,title,date,url}` → digest rec (writes `meeting_digests.jsonl`)
33-
- action: `meeting_batch_run {max_per_run?}``{ok,processed,queued,errors}`; `meeting_batch_status` → status
33+
- action: `meeting_batch_run {max_per_run?}``{ok,processed,queued,errors,skipped}`; `meeting_batch_status` → status
3434
- action: `meeting_digest_get {meeting_id}``{found,digest_md,...}`; `meeting_digests_list``{digests,count}`
3535
- action: `meeting_ask {meeting_id,question}``{ok,answer,source,seconds}`
3636
- action: `meeting_actions_list {range:week|month}``{range,items:[{id,text,owner,status,...}],counts}`
3737
- action: `meeting_action_set_status {id,status:pending|accepted|rejected}``{ok}`
3838
- action: `meeting_week_summary {week_offset}``{ok,week_label,meeting_count,summary}`
3939
- mcp: Quill @ `http://127.0.0.1:19532/mcp` — Streamable-HTTP, SSE `data:`, `Mcp-Session-Id` header; init→notifications/initialized→tools/call
4040
- cmd: `flm serve <model> --pmode turbo --host 127.0.0.1 --port 52625`
41-
- data: `data/{meeting_digests,meeting_action_status,notifications,chat_threads}.jsonl`
41+
- data: `data/{meeting_digests,meeting_action_status,meeting_skips,notifications,chat_threads}.jsonl`
4242
- autostart: HKCU Run `FastFlowPrompt` → bundled `AutoHotkey64.exe` + `grammarFix.ahk`; `FlowkeyGitSync``sync.ps1`
4343
- sched: Windows task `FlowkeyGitSync` daily 12:00 → `sync.ps1` (ff-only pull, guarded)
4444
- ACTIONS count = 73
@@ -67,6 +67,7 @@ Caveman-encoded (compression, not amputation). Paths / ids / action names / numb
6767
- V20: change gates ! pass: `ruff check scripts tests`, `pytest`, `node --check scripts/ui/web/app.js`, AHK parse-check (PowerShell `/ErrorStdOut`)
6868
- V21: local data (config/data/logs/vendor/certs) ∈ `.gitignore` ∴ pull moves code only, never user data
6969
- V22: `sync.ps1` ∃ uncommitted tracked changes → skip pull (⊥ clobber un-pushed WIP)
70+
- V23: meeting `NoContentError` & age ≥ 2d → skip-marker (`meeting_skips.jsonl`) ∴ ⊥ re-queue ever; age < 2d → retry (Quill transcript may still sync); non-content errors ⊥ skip-mark. batch errors → `daemon.log` only (⊥ UI panel, per user)
7071

7172
## §T tasks
7273

@@ -78,20 +79,20 @@ T3|x|notifications gate+log+panel (`ffp_notifications`)|V8,V9,V10
7879
T4|x|Quill meetings + after-hours digest scheduler (`ffp_quill`,`ffp_meetings`)|V11,V12,V14
7980
T5|x|overview meeting hours + action-item board + weekly review|V15,V16
8081
T6|x|git autosync: `sync.ps1` + daily task + autostart→flowkey-pub2|V21,V22
81-
T7|~|2.1.0 release held on `release/v2.1.0` → land after user test|V18,V19
82+
T7|x|2.1.0 released (tag on `7835d4b`); 2.1.1 maintenance batch on `fix/2.1.1-meeting-skip-and-audit`|V18,V19
8283
T8|.|installer clean-VM smoke test|—
8384
T9|.|[AUDIT] dead-code: unused daemon helper + 2 AHK wrappers + stale chat-popup config key + obsolete settings ref in test fixture + deprecated install shims|—
8485
T10|x|[AUDIT-P1] autostart: unify 3 divergent Run keys (daemon/src-installer/pkg-installer) → single HKCU entry|V20,B6
85-
T11|.|[AUDIT] old open_chat default `^+t` still appears in first-run + web config fallback → replace with `^!c`|B5
86-
T12|.|[AUDIT] first-run seed thinner than DEFAULT_CONFIG schema → add seed-vs-schema drift guard (compare keys on first-run copy)|—
87-
T13|.|[AUDIT] installer bootstrap wrapper hardcodes old installer filename → derive from `_version.py`|V18
86+
T11|x|[AUDIT] old open_chat default `^+t` in first-run + `grammar_fix` snapshot + web config fallback → all `^!c` (2.1.1)|B5
87+
T12|x|[AUDIT] seed thinner than DEFAULT_CONFIG (deep-merge fills at runtime ∴ harmless) → drift guard freezes known delta in `test_config_seeds` (2.1.1)|—
88+
T13|x|[AUDIT] `bootstrap.cmd` hardcoded stale `1.6.0` in build banner → version-neutral `<version>` (2.1.1)|V18
8889
T14|.|[AUDIT] quality-gate gaps: installer policy drift, autostart reg-name drift, bootstrap output name, README/dashboard tab count|V20
89-
T15|.|[DOCS] dashboard docs: 7 tabs listed, live = 8 (add Benchmark)|—
90+
T15|x|[DOCS] dashboard docs: 7 tabs 8 (added Benchmark) in README (2.1.1)|—
9091
T16|x|[DOCS] autostart docs conflict: main says no machine-wide entry; installer docs+impl still describe it → align on HKCU-only|B6
9192
T17|.|[DOCS] installer layout: build script says flattened, installer.md still shows nested layout|—
9293
T18|.|[DOCS] provider roadmap marks selector/status UX incomplete → update to reflect it exists|—
93-
T19|.|[DOCS] first-run wizard text: "chat popup" + retired hotkey → update to current|B5
94-
T20|.|[DOCS] daemon log location stale in docs → update to current path|—
94+
T19|x|[DOCS] first-run wizard text "chat popup" → "Open chat" + hotkey now `^!c` (2.1.1)|B5
95+
T20|x|[DOCS] daemon log location — audited 2.1.1: no stale ref in README/docs; nothing to change|—
9596
```
9697

9798
## §B bugs
@@ -104,4 +105,5 @@ B3|2026-06|autostart → stale tree / empty `flowkey-public`|repoint HKCU Run
104105
B4|2026-06|install launch: AHK called `.py`, shipped only `.exe`|flatten bundle to {app} + AHK→exe bridge (PR #19)
105106
B5|2026-06|`Ctrl+Shift+T` open_chat collided w/ browser reopen-tab|default → `^!c`; tray label = configured hotkey
106107
B6|2026-07|3 divergent autostart Run keys: daemon HKCU\Run\FastFlowPrompt, `install.ps1` HKCU\Run\Flowkey (different name!), `installer.iss` optional HKLM\Run\Flowkey → toggle blind to other 2, could double-launch|unify on HKCU\Run\FastFlowPrompt everywhere; drop installer.iss HKLM task; uninstall now cleans the HKCU value; guarded by `test_installer_autostart.py`
108+
B7|2026-07|"Run batch now" → "0 of 5, 5 errors" ∀ run: 5 Quill stub recordings (⊥ minutes ⊥ transcript) re-queued forever ∵ idempotency = digest_exists only|typed `NoContentError` → skip store `meeting_skips.jsonl` (age ≥ 2d guard) + `skipped` count in result; queue checks digest ∧ skip; reasons stay in daemon.log|V23
107109
```

installer/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ Steps the script runs:
7171
3. Download `vendor\ahk\AutoHotkey64.exe` if missing (`-BundleAhk`)
7272
4. Download `vendor\flm\flm-setup.exe` if missing (`-BundleFlm`)
7373
5. Run `pyinstaller --clean --noconfirm fastflowprompt.spec``dist\FastFlowPrompt\`
74-
6. Run `iscc installer.iss``out\Flowkey-Setup-2.1.0.exe`
74+
6. Run `iscc installer.iss``out\Flowkey-Setup-<version>.exe`
7575
7. Run `sign.ps1` against the output (`-Sign`)
7676

7777
Debug flags:

installer/bootstrap.cmd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ echo.
2121
echo This will:
2222
echo 1. Install Python, Inno Setup, and pyinstaller if missing (via winget)
2323
echo 2. Download AutoHotkey v2 and the FastFlowLM installer
24-
echo 3. Build out\Flowkey-Setup-1.6.0.exe (~50 MB)
24+
echo 3. Build out\Flowkey-Setup-^<version^>.exe (version from scripts\_version.py)
2525
echo.
2626
echo First run can take 5-10 minutes. Re-runs are much faster.
2727
echo.
@@ -37,7 +37,7 @@ if "%EXITCODE%"=="0" (
3737
echo The installer is at:
3838
echo %~dp0..\out\
3939
echo.
40-
echo Look for Flowkey-Setup-1.6.0.exe and double-click it
40+
echo Look for Flowkey-Setup-^<version^>.exe and double-click it
4141
echo to install the app.
4242
) else (
4343
echo === BUILD FAILED (exit %EXITCODE%) ===

installer/installer.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
#define AppURL "https://github.com/agr77one/Fastflow"
4242
#define AppExeName "Flowkey.exe" ; symbolic — actual launchers below
4343
; Keep in lockstep with scripts\_version.py.
44-
#define AppVersion "2.1.0"
44+
#define AppVersion "2.1.1"
4545

4646
[Setup]
4747
AppId={{8A4F1E6C-9B3D-4E62-9F7A-FASTFLOW140}}

installer/sign.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
.EXAMPLE
5353
# Sign the installer
5454
$env:FFP_SIGN_PFX_PASSWORD = "ChangeMe!"
55-
.\sign.ps1 -FilePath ..\out\Flowkey-Setup-2.1.0.exe
55+
.\sign.ps1 -FilePath ..\out\Flowkey-Setup-2.1.1.exe
5656
#>
5757

5858
[CmdletBinding(DefaultParameterSetName = "Sign")]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ build-backend = "setuptools.build_meta"
1717

1818
[project]
1919
name = "fastflowprompt"
20-
version = "2.1.0"
20+
version = "2.1.1"
2121
description = "Local-LLM-powered grammar fix, prompt rewrite, chat, and dashboard for Windows."
2222
readme = "README.md"
2323
requires-python = ">=3.11"

scripts/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Single source of truth for the app version. Read by grammar_fix.py."""
22

3-
__version__ = "2.1.0"
3+
__version__ = "2.1.1"

0 commit comments

Comments
 (0)