Release 2.1.0 — Quill meetings, notifications, quality digests, audit fixes#28
Conversation
… fixes Rebuilt on origin/main after the local git store was lost to external agent activity (.git wiped); all working files were preserved and re-verified. 2.1.0 includes: - Quill meetings integration + after-hours digest scheduler (ffp_quill / ffp_meetings): search / ask / process, cached digests, action-item review board (accept/reject), weekly review, Overview meeting hours. - Digest quality flags + strict re-digest (meeting_redigest). - Notifications settings panel + telemetry feed. - Fixes: Run-now autosave, benchmark empty-row, meetings scroll + counter, active-hours telemetry, packaging parity (ffp_meetings/notifications/quill now in pyproject + PyInstaller spec, guarded by test), config-seed de-dup. - Removed dead ffp_tools.py; refreshed README/installer docs; added SPEC.md. Version 2.0.0 -> 2.1.0. Gates: ruff, 320 pytest, node --check, AHK parse-check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2cd8afad96
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| c = client or ffp_quill.QuillClient(str(mcfg.get("mcp_url") or ffp_quill.DEFAULT_MCP_URL)) | ||
| if not c.connect(): | ||
| return {"enabled": True, "reachable": False} | ||
| meetings = ffp_quill.list_recent_meetings(limit=30, client=c) |
There was a problem hiding this comment.
Page through meetings before aggregating overview
When a user has more than 30 Quill meetings in the current week or day, this overview only aggregates the first limit=30 page returned by list_recent_meetings, so the dashboard underreports meeting counts and hours. The Quill wrapper already supports offset and the batch runner pages through results; this should keep fetching pages until no more results or until dates are older than the week boundary.
Useful? React with 👍 / 👎.
| def _action_id(meeting_id: str, text: str) -> str: | ||
| norm = re.sub(r"\s+", " ", str(text or "").strip().lower()) | ||
| return hashlib.sha1(f"{meeting_id}|{norm}".encode()).hexdigest()[:16] |
There was a problem hiding this comment.
Include owner in action item IDs
For a digest that contains two action bullets in the same meeting with the same task text but different owners, both rows get the same persisted ID because the hash only includes meeting_id and normalized text. Accepting or rejecting one row will then apply the saved status to both after reload, so the review board cannot track those assignments independently; include the owner or another stable per-bullet discriminator in the ID.
Useful? React with 👍 / 👎.
Flowkey 2.1.0 — Quill meetings + notifications + polish + audit fixes.
Highlights
ffp_quill,ffp_meetings): search / ask / process meetings on the local model, cached digests, action-item review board (accept/reject/pending), weekly review, and Overview meeting hours. Off by default (opt-in).meeting_redigest).ffp_meetings/ffp_notifications/ffp_quillnow inpyproject+ PyInstaller spec, guarded bytest_packaging_modules); config-seed de-dup.ffp_tools.py; refreshed README/installer docs; addedSPEC.md.Version 2.0.0 → 2.1.0.
Note
This branch was rebuilt on
origin/mainafter the local git store was lost to external agent activity; all working files were preserved and re-verified. Includes a "digest quality / strict re-digest" feature contributed by that agent, whoseapp.jssmart-quote breakage was fixed and covered by tests.Gates: ruff · 320 pytest ·
node --check app.js· AHK parse-check.🤖 Generated with Claude Code