v0.4.0
v0.4.0 (2026-09-06)
Changes since v0.3.0:
Features
- forbid meta-responses in the seed prompts, draft from sparse context (e3675d1)
- make Q a singleton tab and report op-level progress (425c026)
- run CRM-flagged prompts from the picker instead of a fixed draft (3179500)
- build the client per operation and pull on CrmOpened (bacd0ca)
- open the CRM prompt picker from the queue, publish CrmOpened (2be66f8)
- ship the built-in follow-up and reconnect prompts (9c4eb87)
- flag CRM prompts in the command frontmatter (ecbe5c3)
- add the crm.hubspot account context key (c8f5d48)
- add the CrmOpened bus event (beb675f)
- refresh the hubspot token on 401 and wipe the key (69973b1)
- surface the follow-up queue over the index (af1c149)
- write back the follow-up marker on send (7936b2a)
- RunDraft drafts a follow-up and opens a prefilled compose (7deb14e)
- wire the crm adapter and split the lua-crm build (4ad8e5b)
- crm review-queue surface with hooks (e658c34)
- RunAnalyze briefs a contact over the ai entry (70b1fe4)
- runPull publishes the unprocessed queue (12e0b40)
- briefing context builder from contact company and research (d17aa5d)
- research facts over the ai chat connection (6ae532d)
- hubspot client with bearer auth and paged search (d7d525e)
- neutral CRM queue and row event types (f380b90)
- [crm] section with per-vendor hubspot table (8a55579)
Bug Fixes
- resolve the prompt tree from the config dir, not the mail root (40433b0)
- gate the mail-ground query on a plausible email (557eda3)
- close the queue overlay when a crm compose attaches (5ba5a91)
- cover RunDraft error branches and harden split/grounding (c72db3f)
- reconcile CRM queue rows to page order (9a53343)
- distinguish AI step failures in RunAnalyze errors (4f2a45e)
- inline-table keeps grid identity under an ancestor table (6fae09e)
- fill blank research cells and index field errors (ccc1b7c)
- cap research fact and url fields like the snippet (03eae32)
- request explicit properties and bound response decode (fb9379a)
Documentation
- spec the briefing cache and cross-client refresh (a58e54f)
- document the account key and the prompt picker draft (92150f2)
- plan the lazy client, account context, and prompt picker rework (e9ffa70)
- refresh the token on 401, retry once (2f4a32a)
- spec the lazy client, account context, and AI-prompt drafts (6131c46)
- roadmap-land the hubspot follow-up workflow (955bf6d)
- RunPull publishes one queue snapshot per run (7257c58)
- crm job bodies are exported for the app adapter (ac26f67)
- the crm feature gates on lua and crm (1ae50ba)
- client.go is a neutral Client seam; hubspot lives in lib/crm/hubspot (8bb092e)
- CrmQueue snapshot is a tail net, not the full queue (c805225)
- crm core consolidates in src/lib/crm with a thin app adapter (6d8e8cf)
- config lives in a [crm] section with per-vendor tables (43fb369)
Refactoring
- share the bus-wait and poll helpers across packages (a77b7bc)
- export RunPull for the app adapter (265d46f)
- name the error-body cap and wrap the retryable sentinel (cc8e64c)
- split client.go into a neutral Client seam + hubspot subpackage (8afd975)
Testing
- drive the reworked workflow through CrmOpened and the picker (5f1ce63)
- poll the briefing cache before the draft leg; clarify crm docs (d519b71)
- rename integration test to match the plan's run filter (8fc3cc4)
- pin the bounded success decode cap (83092eb)
Build
- require both lua and crm tags for the feature (4e742f6)
Other
- add more html mail test fixtures (daca251)