Releases: warith-harchaoui/standpoint
Release list
v0.8.5
Fixed
render_figures()/export_all()wrote SVG/PNG/export files non-atomically (plainopen(path, "w")), so a crash or a concurrent reader (e.g. a dev-server auto-reloader watching the output directory) could observe or persist a truncated file. Both now write via a new_atomic_write()helper (temp file +os.replace).
Added
- Pre-push git hook (
.githooks/pre-push,git config core.hooksPath .githooks) delegating to the repo's ownscripts/check.sh, soruff check/ruff format --check/pytestfailures are caught before reachingorigin/maininstead of only in CI.
v0.8.4
[0.8.4] - 2026-08-17
Documentation
- PCA/ACP was named repeatedly in README.md, LISEZMOI.md, and the
package's own module docstring, expanded once as an acronym, but never
actually explained — added a plain-language gloss at each file's first
substantive use: PCA finds the few directions along which the rows
differ the most, collapsing many criteria into a readable two-axis map.
Fixed
export_all()never forwardedattributestoto_svg(), so every
actually-exported figure (the CLI/GUI deliverable) got the degraded
role+coordinates hover tooltip instead of the intended per-criterion one —
Positioning.to_svg()(a separate convenience method) already did this
correctly,export_all()did not.run()'s vision self-check printed the wrong verdict key:
vlm_assess()'s returned schema key isaxis_labels_visible, but the
printed summary looked uplegend_visible, which never exists in the
dict — always printingNoneinstead of the model's actual verdict.- Test collection could wander into
distillation/checkpoints/llama.cpp/'s
vendored test suites on a machine that has done thedistillation/
setup, failing at import time on unrelated deps (appium,wget). Scoped
[tool.pytest.ini_options] testpaths = ["tests"]so every invocation is
safe by construction.
Added
tests/test_docstrings.py: an AST-walker guard over every
standpoint/*.pymodule — fails with the exact missing names if any
function or class ever ships without a docstring. The project has had
100% coverage so far, but only by discipline; nothing in the lint gate
actually enforced it.
v0.8.3
[0.8.3] - 2026-08-15
Fixed
- CLI: a library exception on either console-script entry point
(standpoint,standpoint-click) propagated as a raw Python traceback
instead of a clean error.standpoint's argparsemain()had no
try/except aroundrun(); click's ownmain()only special-cases
ClickException/Abort. Both now printError: ...to stderr and exitstandpoint-click's console-script entry point moves to a new
click_cli.main()wrapper (was the baremain_clickcommand).
v0.8.2
[0.8.2] - 2026-08-10
Fixed
requirements.txtdrifted frompyproject.toml. It still listedollamaas a
runtime dependency and was missingbest-engine-ai-helper, left over from the
0.7.0 migration that madebest-engine-ai-helperthe hard runtime dependency
and dropped the directollamaimport.ollamais only needed by
tests/conftest.pyfor@needs_modeltests, so it moves to thedevextra.
v0.8.0
GUI chrome now matches the sprezzature design reference (neutral grays, pixel-exact sizing). Several fixes: broken mcp extra pin, duplicate label placement, dark-mode checkerboard, Autofill-defeating default, reference/competitor coordinate collision, half-translated GUI title on language override. See CHANGELOG.md.
Standpoint 0.4.2
A cleaner positioning map, produced by running the Ralph Eyeball Loop on the map itself: render, look at the pixels, fix the source, repeat.
Changed
- The map drops its redundant colour legend. Every dot is already labelled in place, so a 12-row colour key beside the plot just repeated all the names and squeezed the chart. It is now hidden whenever every dot is labelled (the common case), and the map uses the whole canvas. It reappears only as a fallback when a crowded map forces a label to drop, so densely packed dots stay identifiable.
- The
--checkvision self-check now reportsaxis_labels_visible(are the four italic pole labels legible) instead oflegend_visible, since the legend is now conditional. The four pole labels are always drawn. - Every shipped example and landscape figure was regenerated. At temperature 0 the landscape top-vertical pole re-named from Comprehensive / Compréhensibilité to Completeness / Complétude; the LANDSCAPE.md and PAYSAGE.md prose was updated to match.
Full local gate green (ruff + format + 50 tests).
Standpoint 0.4.1
Patch release: a crash fix, a writing-standard pass on the generated output, GUI polish, and a CI repair.
Fixed
- The skill helper
scripts/positioning_summary.pycrashed on every run (it still passed the removeduse_llm=keyword to the engine). It now takes--modeland calls the current API, with a fast regression test (tests/test_skill_script.py) so it cannot break again silently. - Stale
--no-llm/use_llm=references across README, LISEZMOI, EXAMPLES, the Dockerfile,SKILL.md, andreferences/interfaces.md, including a non-existentuse_llmfield in the documentedPOST /api/positionbody (corrected tomodel). - Red CI: making the local model a hard prerequisite had turned the test guard into a fixture that errored the whole suite when Ollama was absent (as on the hosted runner). Only the model-backed tests are gated now (
@pytest.mark.needs_model); they skip in CI and still fail loudly on a developer machine, so the model-free core suite runs on the runner again.
Changed
- Writing standard: the generated deliverable no longer uses dash punctuation. The en/fr/es prompt templates were reworded (and no longer nudge the model to emit dashes), the Axes section reads
Horizontal (X ↔ Y), and the front-door docs were cleaned to match. - GUI: a self-explaining header (tagline + how to read the map) and a Generate button that locks during a run (no concurrent submits). The browser GUI is now documented as a shipped access surface.
- The FastAPI app version tracks
standpoint.__version__; added a__main__module docstring and aPCAResultclass docstring.
Removed
- The
--no-llmflag /use_llm=parameter (the local model is always used; pick one with--model/model=).
Standpoint 0.4.0 — multi-surface
Standpoint 0.4.0 completes the AI Helpers surface set: the same positioning()
engine — turn a comparison table into a labelled 2D positioning map + written analysis —
now reachable six ways, with nothing reimplemented across them.
Six surfaces, one engine
Library · CLI ×2 (standpoint argparse + standpoint-click) · GUI (standpoint-gui) ·
HTTP API (POST /api/position) · MCP (standpoint-mcp, tools at /mcp) · Claude/OpenCode skill.
Added
- MCP (
[mcp]extra):fastapi-mcppublishes the FastAPI endpoints as MCP tools. - Skill (
skills/standpoint/): trigger-richSKILL.md+references/+ a
positioning_summary.pyhelper; exhaustiveTRIGGERS.mdreferenced from the READMEs. - Docker (installs
requirements.txt, serves API + MCP) +.dockerignore; a thin
condaenvironment.yaml; a fullerrequirements-dev.txt. - Prompts moved to
standpoint/locales/i18n.yaml(en/fr/es).
Install: pip install standpoint (core) · "standpoint[gui]" · "standpoint[mcp]".
Full notes: CHANGELOG.
Standpoint 0.3.0
Browser GUI (optional gui extra) + a decision-useful, colour-coded analysis rewrite. See CHANGELOG.
v0.2.0 — AI Helpers suite + first PyPI release
Standpoint joins the AI Helpers suite (Misc group) and ships to PyPI for the first time.
pip install standpoint- Suite framing + logo, canonical Documentation section, self-referential positioning map wired into LANDSCAPE.md / PAYSAGE.md from the committed assets/*.csv source.
- Absolute URLs in README/LISEZMOI so they render on PyPI.
See CHANGELOG.md for the full 0.2.0 notes (domain-agnostic highlight roles, localized figure title, transparent + white figure backgrounds, bilingual docs, CI).