v0.4.0 — adoption-surface batch
Theme: Adoption surface — scriptable chat, friendlier errors, completed CRUD.
Three focused features that close the v0.4.0 Tier 2 plan (D-050 / D-051 /
D-052). All three target adoption: making the CLI usable from scripts /
CI, making transport failures self-actionable, and completing the gaps
in the engagement-entity verbs that previous releases left behind.
Added
-
D-050 —
praxis chat --message/-m "..."runs one turn through
the fullChatRuntime(tools, session, slash commands) and exits 0.
The REPL banner is suppressed so stdout stays clean for callers piping
intojqor similar. PII guard (D-043) still fires on the single
turn. Difference vs.praxis ask:chat -mkeeps the runtime, so the
agent can call engagement / queue tools;askis stateless. -
D-052 — Completed CRUD verbs on
praxis engagement assumption
andpraxis engagement constraint:assumption get|update|removeconstraint get|update|remove
Updates are partial (only supplied flags are written) and preserve
untouched fields including thevalidatedflag on assumptions. Both
getvariants support--jsonfor scripting. Closes NEW-001. -
D-052 —
praxis engagement question opennow accepts
--answerers <stakeholder-ids>and--blocks <artifact-ids>(both
comma-separated). The repo accepted these fields since 0.2.x; only
the CLI binding was missing. Closes NEW-004.
Changed
-
D-051 — Transport errors are now provider-specific and actionable.
Newpraxis.transport.errors.translate_provider_exception()duck-types
ontype(exc).__module__+ class name (both OpenAI and Anthropic
SDKs share the Stainless-generated exception hierarchy) and maps each
kind to a tailored message:auth→ names the env var to setpermission→ names the model the key lacks access torate_limit→ suggests retry / tier upgradenot_found→ names the missing modelbad_request→ carries the SDK's detailserver_error→ tells the user to retry laterconnection→ blames the network with the SDK's detailtimeout→ identifies a timed-out request
Each
TransportErrorcarriesdetails["kind"]so future retry logic
can branch programmatically without string-matching. Unknown
exceptions fall through to today's generic message — behaviour is
strictly additive, no existing assertion breaks. Closes
NEW-003.
Breaking (CLI)
- D-050 —
praxis chat --modelno longer accepts the-mshort
alias.-mis now bound to--message, matchinggit commit -mand
praxis queue commit -mconvention. The full--model gpt-4.1
long form still works.--model -mis intact onartifact,check,
andelicit(those have no--messageconflict).
Documentation
- D-050 —
docs/how-to/first-engagement.mdgains a "Scripting and
CI" section with achat -mvsaskcomparison table.
Quality
- 571 tests passing (+32 since v0.3.1), coverage 84.42%.
- All four gates green per commit:
pytest,ruff check,
ruff format,mypy --strict src/praxis. - 5 conventional commits since v0.3.1 (D-050 ×2 / D-051 / D-052 + bump).
Known limitations / deferred to v1.0.0
- D-055 — Multi-engagement awareness (
praxis engagements list/ show/switch, registry, TUI header) deferred. Larger feature; queued
for a dedicated cycle. - D-053 / D-054 / D-056 — Superseded by v1.0.0 plan items
(D-067 TUI regenerate, D-062 pilot tests, D-066doctorexpansion).
See~/praxis-realworld-eval/v1.0.0-plan.mdin the eval workspace.