odoo-pulse 1.9.1
A bug-fix release. No tool name, argument, default, or schema changed — only
how a handful of report tools resolve "closed" project stages.
What changed
Closed-stage matching is now always by literal stage name
only_closed_stages / closed_stage_names (project_dashboard,
project_subtask_hours), team_workload's done_stages, and
standup_digest's exclude_stages now match tasks by literal
stage_id.name only.
Previously, on Odoo schemas exposing project.task.state or is_closed —
the common case — those internal Kanban fold/closed markers were preferred
over the caller's named stages. Those flags are configured per stage in the
Kanban view and don't reliably correspond to the named stages a caller
actually asked for: a custom stage folded/closed in the Kanban config but not
named Done/Cancelled/Delivered (or whatever list was passed) could be
miscounted as closed. Worse, when closed_stage_names used its default, no
name check was applied at all — pure internal-state matching.
Practical effect: hour totals and task counts from these tools may shift
for a project whose Kanban stage configuration doesn't align 1:1 with
project.task.state. This is a correctness fix, not a behavior change to
rely on staying put — the new numbers match what the same
stage_id.name in/not in [...] filter returns directly against Odoo.
Verified environments
| Python | Python 3.10-3.13 (+3.14 exercised in CI) |
| Odoo | Odoo 18 and 19 |
Install
Pin the exact version:
pip install "odoo-pulse==1.9.1"Run without installing:
uvx odoo-pulse@1.9.1Container:
docker run -i --rm \
-e ODOO_URL=https://acme.odoo.com \
-e ODOO_DB=acme \
-e ODOO_USERNAME=you@example.com \
-e ODOO_API_KEY=your-api-key \
ghcr.io/minhhq-a1/odoo-pulse:1.9.1The 1.9.1 image tag is immutable. 1.9, 1, and latest also resolve to
this release, but they move when the next release publishes — pin 1.9.1 if
you need reproducibility.
Upgrading from 1.9.0
No configuration change is required. Existing environment variables, tool
calls, and MCP client configuration continue to work unchanged:
pip install --upgrade "odoo-pulse==1.9.1"Expect the closed-stage numbers described above to move for affected
projects. If your integration or dashboard hardcoded the old (incorrect)
totals, re-baseline against this release instead.
Rolling back to 1.9.0
Every channel keeps its previous exact version, so rollback is a downgrade:
pip install "odoo-pulse==1.9.0"docker pull ghcr.io/minhhq-a1/odoo-pulse:1.9.0The MCP surface is identical in both versions, so a rollback needs no client
change.
Write safety is unchanged
odoo-pulse remains read-only by default. A write reaches Odoo only when
all four of these hold:
ODOO_READ_ONLY=false— the master switch, defaulttrue.- The target model is listed in
ODOO_WRITABLE_MODELS. ODOO_ALLOW_DELETE=true, required only fordelete_records, default
false.confirm=Trueon the call — every write tool returns a preview struct
otherwise.
System models such as ir.*, base*, res.users, and res.groups are
permanently blocked regardless of configuration.