release: v2.0.0 (Semantic Resolution) (#148)

Bump version 1.1.0 -> 2.0.0, finalize the V2 changelog section (add analyzer
config centralization, example-workflow fix, and relational fidelity entries;
note the breaking removals), and update the release-readiness checks.

Co-authored-by: kunail0804 <kunail0804@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Crespin Alexandre
2026-07-16 16:44:54 +02:00
committed by GitHub
co-authored by kunail0804 Claude Opus 4.8
parent b863e53754
commit 6603fe2c83
3 changed files with 36 additions and 6 deletions
+32 -2
View File
@@ -3,7 +3,7 @@
All notable changes to Scene Compiler are documented here. The project follows
[Semantic Versioning](https://semver.org): `MAJOR.MINOR.PATCH`.
## [Unreleased] — V2: Semantic Resolution
## [2.0.0] — 2026-07-16 — V2: Semantic Resolution
### Added
@@ -64,14 +64,37 @@ All notable changes to Scene Compiler are documented here. The project follows
- The Analyzer system prompt now instructs full transcription of list inputs,
and a deterministic post-parse check warns (`SC0021`, advisory) when a
tag-list input yields fewer concepts than it has items.
- The Analyzer system prompt now preserves spatial/postural/possessive
relationships instead of collapsing them to the bare noun — a held object also
yields a `holding <object>` concept (`money in her hand` → `holding money` +
`money`), body positions survive (`hand on own hip`, `... in mouth`), every
conjunct of an "X and Y" enumeration is kept, and explicit/NSFW input gets the
same full fidelity.
- A data-driven fidelity regression suite (`tests/regression/test_fidelity.py`)
pins both failure modes.
pins the modifier, list, relational, and conjunction failure modes.
### Changed
- **`prompt_builder.remove_duplicate_tags` is now wired to real behaviour.** It
gates the Resolver's post-expansion tag deduplication (`SC0007`); it defaults to
`true`, so output is unchanged unless explicitly disabled.
- **Analyzer settings are centralized on the Configuration node.** The Scene
Analyzer node previously carried its own `model_name`/`temperature`/`timeout`
widgets and ignored the Configuration node entirely, so the model was set in two
disconnected places. It now takes an optional `config` input and those duplicated
widgets are removed; without a Configuration node the defaults apply (llama3,
temperature 0) with a 300 s cold-load-friendly timeout. The Knowledge Base Loader
likewise accepts an optional `config` whose path/version take precedence. Every
node input now carries a tooltip.
### Fixed
- **Example workflow widget drift.** The shipped example workflow carried stale
positional widget values from before `trim_empty_outputs` was removed, so ComfyUI
mapped a leftover boolean into `debug_level` (a spurious `false`) and, in older
saved workflows, into `prompt_separator` (`true` instead of `,`). The workflow is
rebuilt against the current node signatures, and a new test asserts every example
node's saved widget count matches the node so this drift fails CI.
### Removed
@@ -79,6 +102,13 @@ All notable changes to Scene Compiler are documented here. The project follows
removal of categories (there are no empty outputs to trim). Removed from the
config dataclass, JSON Schema, Configuration node, and `default_config.json`.
### Breaking
- The Scene Analyzer node's `model_name`/`temperature`/`timeout` widgets and the
`prompt_builder.trim_empty_outputs` config option were removed. Workflows saved
against V1 that set these will lose those widget values — delete and re-add the
affected nodes, or re-import the shipped example workflow.
## [1.1.0] — Flat prompt, no categories
A deliberate simplification of the pipeline's back half.
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "comfyui-scene-compiler"
version = "1.1.0"
version = "2.0.0"
description = "Deterministic natural-language-to-prompt compiler for ComfyUI (Illustrious)."
readme = "README.md"
requires-python = ">=3.11"
+3 -3
View File
@@ -12,13 +12,13 @@ def _pyproject() -> dict:
return tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
def test_version_is_1_1_0() -> None:
assert _pyproject()["project"]["version"] == "1.1.0"
def test_version_is_2_0_0() -> None:
assert _pyproject()["project"]["version"] == "2.0.0"
def test_changelog_documents_current_version() -> None:
changelog = (REPO_ROOT / "CHANGELOG.md").read_text(encoding="utf-8")
assert "1.1.0" in changelog
assert "2.0.0" in changelog
def test_definition_of_done_exists() -> None: