chore(release): cut v1.0.0 — a new foundation for production Vision AI#98
Conversation
OpenFilter 1.0. Bumps `VERSION` to `v1.0.0` and adds the 1.0 release notes to `RELEASE.md`. v0.2.1's entry stays below as preserved history of the preview cycle. OpenFilter 1.0 transitions the runtime from an evolving framework into a stable, production-grade platform. The typed declarative-config surface (`FilterConfigBase`, `FilterOutputSchema`, the `openfilter emit-schema` CLI) introduced during the v0.2.x preview cycle is committed as 1.0's public API. Filters can rely on these surfaces under SemVer. OpenFilter 1.0 ships 2026-05-18. - `VERSION` and `RELEASE.md` agree on `v1.0.0`. - `changelog-parser-action` parses the new header cleanly. - [FILTER-441](https://plainsight-ai.atlassian.net/browse/FILTER-441) — typed `FilterConfigBase` + `emit_schema` - [FILTER-442](https://plainsight-ai.atlassian.net/browse/FILTER-442) — `emit-schema` CLI - [FILTER-444](https://plainsight-ai.atlassian.net/browse/FILTER-444) — `FilterOutputSchema` + shape catalog - [FILTER-452](https://plainsight-ai.atlassian.net/browse/FILTER-452) — `$id` inheritance fix - [FILTER-461](https://plainsight-ai.atlassian.net/browse/FILTER-461) — Python 3.10 shutdown race - [FILTER-462](https://plainsight-ai.atlassian.net/browse/FILTER-462) — release-pipeline cascade trigger - [x] I have read and agreed to the terms of the [LICENSE](../LICENSE) - [x] I have read the [CONTRIBUTING](../CONTRIBUTING.md) guide - [x] I have followed the [coding style](../CONTRIBUTING.md#coding-style) - [x] I have signed all commits in compliance with the DCO (`git commit -s`) - [x] I have added or updated **tests** as needed (no test impact; release-notes + version-bump only) - [x] I have added or updated **documentation** as needed (this PR *is* the documentation change — release notes for 1.0) Signed-off-by: stwilt <swilt@plainsight.ai>
shingonoide
left a comment
There was a problem hiding this comment.
Thanks for cutting v1.0.0. The VERSION / RELEASE.md pairing is consistent and the version-match check at .github/workflows/create-release.yaml:67-80 will pass. Three observations before workflow_dispatch fires.
1. Release date stamped one day in the future — RELEASE.md:5
## v1.0.0 - 2026-05-18
Today is 2026-05-17. If the workflow is triggered today the published GH release notes will carry tomorrow's date while the actual PyPI/Docker publish timestamps will be today's. Either advance the heading to 2026-05-17 or hold the workflow_dispatch until 2026-05-18.
2. ResolveHint is a public export not covered by stability commitments — openfilter/filter_runtime/__init__.py:8,56; RELEASE.md:39-43
ResolveHint is imported and listed in __all__ of openfilter.filter_runtime, but the "Stability commitments" section commits only FilterConfigBase (with Managed/Resolve), FilterOutputSchema+shape catalog, and openfilter emit-schema. ResolveHint is the Literal that parameterizes the resolve= argument of Managed/Resolve, so callers annotating their config fields with it are implicitly relying on it. Either add it to the committed surface or document it as explicitly excluded so a future rename does not require a 2.0 bump.
3. Conflicting `dev` groups across PEP 621 and PEP 735 — `pyproject.toml:61-71` and `:123-127`
`dev` is defined under `[project.optional-dependencies]` (PEP 621, ~10 packages including `pytest`, `twine`, `build`) and again under `[dependency-groups]` (PEP 735, only `pytest>=9.0.2` and `pytest-benchmark>=5.1.0`). The two groups give silently different environments depending on the tool: `pip install ".[dev]"` resolves the PEP 621 set while `uv sync --group dev` resolves the PEP 735 set. For a v1.0.0 cut it would be worth either consolidating to one source of truth or renaming one of the groups (e.g. `dev-bench`) so the divergence is explicit.
No blockers found. Items unchanged from prior reviews still apply: VERSION match check, changelog-parser format, breaking-change docs for `OTLP_GRPC_ENDPOINT_SECURITY` and `frame.image` read-only, cascade tag pattern matching `v1.0.0`, and `GH_BOT_USER_PAT` wiring all look correct.
- RELEASE.md: correct the release-date heading to 2026-05-17 (was 2026-05-18, one day ahead — would have led the actual PyPI/Docker publish timestamps on the day of dispatch). - RELEASE.md: extend the stability commitments to name the ResolveHint literal that parameterizes Managed/Resolve. Callers annotating their config fields with explicit ResolveHint were already implicitly depending on it; committing it explicitly means a future rename requires a 2.0 bump rather than silently breaking type-annotated consumers. - pyproject.toml: drop the orphaned PEP 735 [dependency-groups] block. Nothing under Makefile / CI / docs / scripts uses `uv sync --group` or `--group dev`; the canonical dev install is `pip install -e .[all,dev]` via the PEP 621 extra (Makefile:82). The PEP 735 dev group held a strict subset of the PEP 621 dev extra (pytest + pytest-benchmark only, vs 9 packages including build / twine / pytest-cov), so `uv sync --group dev` would have silently produced a different dev env than the documented install path. Signed-off-by: stwilt <swilt@plainsight.ai>
lucasmundim
left a comment
There was a problem hiding this comment.
Code review
Approving. Two non-blocking suggestions inline:
-
v1.0.0's preamble frames the release as additive ("filters built against earlier versions keep running unchanged"), and
### Breaking Changesonly lists the OTLP scheme inference (#90). TheFrame.imageread-only break introduced in v0.1.28 is a real source-incompatible change with explicit migration notes. Consumers who skip the preview cycle and jump straight to 1.0 lose that signal. Either re-surface it under v1.0.0### Breaking Changes, or soften the preamble. -
Section order in the new v1.0.0 entry is
Fixed -> Removed -> Infrastructure. Keep-a-Changelog and the prior v0.1.30 entry putRemovedbeforeFixed. Same nit raised on #96 but not addressed; recurring here.
shingonoide
left a comment
There was a problem hiding this comment.
Thanks. Re-review against ff1566e:
- Release date —
RELEASE.md:5now reads## v1.0.0 - 2026-05-17. Addressed. ResolveHintin stability commitments —RELEASE.md:41explicitly names theResolveHintliteral alongsideFilterConfigBase/Managed/Resolve. Addressed.- PEP 735
[dependency-groups]— removed frompyproject.toml; PEP 621[project.optional-dependencies].devremains the single source of truth, consistent with the.[all,dev]install path atMakefile:82. Addressed.
Approving.
- Re-surface the v0.1.28 `Frame.image` read-only break under v1.0's ### Breaking Changes. v1.0 is the SemVer-stable rollup of the preview cycle, so users upgrading from pre-v0.1.28 directly to v1.0.0 need this listed under v1.0's breaking section, not buried under the v0.1.28 preview-cycle entry. Includes the same migration guidance (`image = frame.image.copy()` / construct new frame) and symptom (`ValueError: assignment destination is read-only`) as the v0.1.28 source entry. - Tighten the preamble so it no longer claims every addition is additive — that claim is contradicted by ### Breaking Changes existing at all. Point readers there for behavioral changes; the "purely additive" framing now correctly scopes only to the typed config surface coexisting with `dict`-based FilterConfig. - Reorder ### Removed before ### Fixed under v1.0 to match the Keep-a-Changelog canonical ordering (https://keepachangelog.com) and the precedent set by the v0.1.30 entry already in this file. Signed-off-by: stwilt <swilt@plainsight.ai>
lucasmundim
left a comment
There was a problem hiding this comment.
Re-review against bfba5af. Both items from my prior approval are addressed:
frame.imageread-only break is re-surfaced under v1.0.0### Breaking Changeswith explicit migration guidance and theValueErrorsymptom; preamble atRELEASE.md:7softened to scope behavioral changes to the list. Addressed.- Section order swapped to
Removed -> Fixed -> Infrastructure, matching Keep-a-Changelog and v0.1.30. Addressed.
Approving. One small date-stamp observation inline.
Per lucasmundim's inline review on PR #98 (RELEASE.md:5), today's UTC date is 2026-05-18 and the heading still read 2026-05-17. Bumping the stamp so the published GH release notes align with the same-day PyPI / Docker publish timestamps. Signed-off-by: stwilt <swilt@plainsight.ai>
lucasmundim
left a comment
There was a problem hiding this comment.
Re-review against c31ede6. Date bump from 2026-05-17 → 2026-05-18 addresses my prior inline comment — RELEASE.md:5 now matches today's UTC date and the imminent publish timestamps. No other changes since bfba5af. VERSION/RELEASE.md heading agree on v1.0.0 and the create-release version-match check will pass.
Approving. Safe to fire workflow_dispatch.
📋 What does this PR do?
OpenFilter 1.0. Bumps
VERSIONtov1.0.0and adds the 1.0 release notes toRELEASE.md. v0.2.1's entry stays below as preserved history of the preview cycle.🔍 Why is this needed?
OpenFilter 1.0 transitions the runtime from an evolving framework into a stable, production-grade platform. The typed declarative-config surface (
FilterConfigBase,FilterOutputSchema, theopenfilter emit-schemaCLI) introduced during the v0.2.x preview cycle is committed as 1.0's public API. Filters can rely on these surfaces under SemVer.OpenFilter 1.0 ships 2026-05-18.
🧪 How was it tested?
VERSIONandRELEASE.mdagree onv1.0.0.changelog-parser-actionparses the new header cleanly.🔗 Related Issues
FilterConfigBase+emit_schemaemit-schemaCLIFilterOutputSchema+ shape catalog$idinheritance fix✅ Checklist
git commit -s)