Skip to content

Hardening/v1.3.1#9

Merged
Limbicnation merged 4 commits into
mainfrom
hardening/v1.3.1
Apr 30, 2026
Merged

Hardening/v1.3.1#9
Limbicnation merged 4 commits into
mainfrom
hardening/v1.3.1

Conversation

@Limbicnation
Copy link
Copy Markdown
Owner

@Limbicnation Limbicnation commented Apr 30, 2026

Summary by CodeRabbit

  • New Features

    • Added automated version tag verification to ensure git tags match project version.
    • Introduced pre-commit hooks for code formatting and consistency checks.
  • Tests

    • Lowered unit-test coverage threshold from 70% to 50%.
    • Added new test suites for node registration validation and prompt combining logic.
  • Chores

    • Bumped project version to 1.3.1.
    • Configured linting and formatting tooling with enhanced code quality rules.

Limbicnation and others added 4 commits April 30, 2026 06:14
… mode handling

Changes:
- Add [tool.ruff] config with target-version py310 and a curated rule set
  (E/F/W, I, UP, B, SIM, RUF) so future drift is caught in CI lint.
- PEP 585 sweep across all node modules: drop legacy typing.Dict / List /
  Tuple / Optional in favor of dict / list / tuple / `X | None`. Annotate
  class-level mutable defaults as ClassVar to satisfy RUF012.
- PromptCombinerNode: replace the magic-string mode chain with a CombineMode
  StrEnum + match statement. The dropdown choices in INPUT_TYPES are now
  derived from the same Literal alias used in the function signature, so the
  UI and the type contract can't drift apart.
- Smoke tests for PromptCombinerNode (14 tests) covering enum mapping, all
  three modes, edge cases, and the unknown-mode error path. Brings combiner
  coverage from 28% to 96%.
- Tidy preexisting issues surfaced by the new lint rules: B904 except chaining
  in style_presets, RUF013 implicit Optional, RUF059 unused unpack, SIM117
  nested-with consolidation in tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ests)

Direct response to the v1.1.6 packaging gap, where the prompt-chain nodes
(combiner, refiner, negative) were authored under nodes/ but never wired
into NODE_CLASS_MAPPINGS, so they silently failed to ship.

- __init__.py now raises RuntimeError at import time if NODE_CLASS_MAPPINGS
  and NODE_DISPLAY_NAME_MAPPINGS drift apart. ComfyUI startup logs surface
  the mismatch instead of dropping the node from the menu silently.
- New tests/unit/test_node_registration.py contract suite (8 tests):
  * Expected 5 keys are registered.
  * Display names cover every class.
  * Each registered class satisfies the ComfyUI node interface
    (INPUT_TYPES classmethod, RETURN_TYPES, FUNCTION, CATEGORY,
    and the FUNCTION attribute resolves to a callable method).
  * Every nodes/*_node.py module on disk is reachable from the mapping —
    this is the regression guard that would have caught v1.1.6.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Direct response to the v1.1.x → v1.3.0 silent-skip pattern, where
pyproject.toml was bumped four times without ever pushing the matching
git tag, so .github/workflows/publish.yml never fired and the registry
stayed on v1.1.6.

- scripts/check_version_tag.py: stdlib-only (tomllib) script that fails
  if pyproject.toml's version has no matching git tag locally.
- .pre-commit-config.yaml: wires ruff (check + format) and the local
  version-tag-guard hook. The guard fires only on pyproject.toml edits.
- test.yml: new verify-tag-exists job that fails the main-branch build
  when pyproject.toml's version has no matching tag in the repo. Belt
  and suspenders for the pre-commit hook.
- test.yml validate job: same comfy-cli telemetry fix already applied
  to publish.yml; suppresses the interactive opt-in prompt in CI.
- pytest.ini + test.yml: lower coverage gate from 70 (never enforced;
  failed on every main push since chain nodes were added) to 50 (the
  actual current floor). Comment marks it as a starting point for
  future test growth.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Hardening release. No public API changes — same 5 NODE_CLASS_MAPPINGS
keys as v1.3.0. The bump exists so the registry can serve a build that
includes the version-tag guard, the registration contract tests, the
mapping drift self-check, the modernized typing, and the CI fixes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 30, 2026

📝 Walkthrough

Walkthrough

This pull request modernizes type annotations across the codebase to use PEP 604 builtin unions and generics instead of the typing module, adds a CombineMode enum to the prompt combiner node, introduces an import-time node registration validation guard, updates CI/CD workflows and pre-commit configuration with version tag verification, and adds comprehensive test coverage for node registration.

Changes

Cohort / File(s) Summary
CI/CD Configuration
.github/workflows/test.yml, .pre-commit-config.yaml
Reduced unit-test coverage threshold from 70 to 50, disabled ComfyUI telemetry in validation, added version tag existence verification for main branch pushes, and configured Ruff hooks for linting and formatting via pre-commit.
Type Annotation Modernization
nodes/adapters/ollama_client.py, nodes/negative_prompt_node.py, nodes/prompt_generator_node.py, nodes/prompt_refiner_node.py, nodes/style_applier_node.py, style_presets.py
Replaced legacy typing generics with PEP 604 builtin unions (|) and builtin generics (list[...], dict[...], tuple[...]); marked class constants as ClassVar; updated method signatures accordingly.
Functional Enum & Logic Refactor
nodes/prompt_combiner_node.py
Added CombineMode StrEnum and ModeLiteral type; refactored mode dispatch from string-based conditionals to enum parsing with match statement; improved error messaging for invalid modes.
Node Registration & Validation
__init__.py, scripts/check_version_tag.py
Added import-time guard to detect mismatches between NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS; introduced pre-commit hook script that validates pyproject.toml version has a corresponding git tag.
Configuration & Version Updates
pyproject.toml, pytest.ini
Bumped project version from 1.3.0 to 1.3.1; added Ruff configuration targeting Python 3.10 with 120-character line length and selected rule categories; synchronized coverage threshold with workflow.
Tests
tests/unit/test_node_registration.py, tests/unit/test_prompt_combiner.py, tests/unit/test_extract_final_prompt.py, tests/unit/test_ollama_client.py, tests/unit/test_style_presets.py
Added comprehensive node registration contract tests validating class mappings, interface compliance, and file presence; added prompt combiner mode behavior tests; refactored existing tests into single-line formatting; updated assertions to match new type signatures.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • Pr 7 #8: Directly touches the same node modules and __init__.py registration logic, indicating overlapping changes at the code level.
  • feat: add prompt chain nodes + test infrastructure #7: Modifies __init__.py node registration mappings that are now validated by the new import-time guard and comprehensive test suite introduced in this PR.

Poem

🐰 Types are unified, enums now run clear,
Version tags dance with git's frontier,
Nodes validated, no silent falls,
Pre-commit hooks guard the halls—
A tidy hop through PEP 604's light!

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 53.73% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Hardening/v1.3.1' is vague and does not clearly convey the specific changes in the pull request. It uses a generic term 'Hardening' without explaining what is being hardened or improved. Provide a more descriptive title that summarizes the main changes, such as 'Modernize type annotations and add version tag verification' or 'Update to Python 3.10+ type hints and add pre-commit checks'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hardening/v1.3.1

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@@ -297,9 +290,9 @@ def generate_subprocess(
except FileNotFoundError:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: {e!s} is Python 2 carryover. The !s format specifier was necessary in Python 2 to force string representation, but in Python 3 every value is already a string when formatted. You're essentially writing str(str(e)) with extra steps.

🩹 The Fix:

Suggested change
except FileNotFoundError:
return (False, f"Error: {e}")

📏 Severity: nitpick

@kilo-code-bot
Copy link
Copy Markdown

kilo-code-bot Bot commented Apr 30, 2026

Code Review Roast 🔥

Verdict: 1 Issue Found | Recommendation: Merge (fix the nitpick first)

Overview

Severity Count
🤏 nitpick 1

🏆 Best part: This PR is doing real work. The node registration contract tests (test_node_registration.py) are the kind of guardrails that prevent silent production failures — someone actually learned from the v1.1.6 packaging gap. The CombineMode enum in prompt_combiner_node.py is clean, the pre-commit hooks are solid, and bumping the coverage threshold with a documented rationale shows engineering honesty. The mapping drift detection at import time? Chef's kiss.

💀 Worst part: ollama_client.por at line 290 uses {e!s} — a Python 2 fossil. In Python 3, every value is already a string when formatted. You wrote str(str(e)) with extra steps, and frankly, it's embarrassing for a PR that's otherwise hitting PEP 585 and 604 standards perfectly.

📊 Overall: Like finding a $100 bill in your winter coat — the coverage drop was embarrassing, but this PR is mostly a net positive. Merge it, but clean up that one nitpick on the way out.

Files Reviewed (18 files)
  • .github/workflows/test.ymI - 0 issues
  • .pre-commit-config.yaml - 0 issues
  • __init__.py - 0 issues
  • nodes/adapters/ollama_client.py - 1 issue
  • nodes/negative_poroprompt_node.por - 0 issues
  • nodes/prompt_combiner_node.py - 0 issues
  • nodes/prompt_generator_node.py - 0 issues
  • nodes/prompt_refiner_node.py - 0 issues
  • nodes/style_applier_node.py - 0 issues
  • pyproject.toml - 0 issues
  • pytest.ini - 0 issues
  • scripts/check_version_tag.py - 0 issues
  • style_presets.py - 0 issues
  • tests/unit/test_extract_final_prompt.py - 0 issues
  • tests/unit/test_node_registration.py - 0 issues
  • tests/unit/test_ollama_client.py - 0 issues
  • tests/unit/test_prompt_combiner.py - 0 issues
  • tests/unit/test_style_presets.py - 0 issues

Fix these issues in Kilo Cloud


Reviewed by minimax-m2.5-20260211 · 139,318 tokens

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces Ruff for linting and formatting, adds a pre-commit hook to ensure git tags match version bumps, and refactors several nodes to use modern Python type hints (PEP 585/604). It also includes contract tests for node registration and a refactored PromptCombinerNode. Feedback identifies critical compatibility issues for Python 3.10 users due to the use of StrEnum and tomllib, which were introduced in Python 3.11. Additionally, the move to instance-level caching in OllamaClient is noted as ineffective because the client is re-instantiated on every call, preventing the cache from persisting.

Comment on lines +6 to +15
from enum import StrEnum
from typing import Any, Literal, get_args


class CombineMode(StrEnum):
"""Supported strategies for combining multiple prompts."""

BLEND = "blend"
CONCAT = "concat"
WEIGHTED_AVERAGE = "weighted_average"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

StrEnum was introduced in Python 3.11. Since the project's pyproject.toml specifies requires-python = ">=3.10", using StrEnum will cause an ImportError at runtime for users on Python 3.10. To maintain compatibility with Python 3.10, you can inherit from both str and Enum instead.

Suggested change
from enum import StrEnum
from typing import Any, Literal, get_args
class CombineMode(StrEnum):
"""Supported strategies for combining multiple prompts."""
BLEND = "blend"
CONCAT = "concat"
WEIGHTED_AVERAGE = "weighted_average"
from enum import Enum
from typing import Any, Literal, get_args
class CombineMode(str, Enum):
"""Supported strategies for combining multiple prompts."""
BLEND = "blend"
CONCAT = "concat"
WEIGHTED_AVERAGE = "weighted_average"

import sys
from pathlib import Path

import tomllib
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

tomllib is only available in the standard library starting with Python 3.11. As the project targets Python 3.10, this script will fail with an ImportError when run in a 3.10 environment. Consider using a fallback to tomli (the backport of tomllib) or an alternative parsing method to ensure the pre-commit hook remains functional for all supported Python versions.

Suggested change
import tomllib
try:
import tomllib
except ImportError:
import tomli as tomllib

self.logger_prefix = logger_prefix
# Instance-level cache (was class-level, causing race conditions)
self._cached_models: Optional[List[str]] = None
self._cached_models: list[str] | None = None
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The model cache is currently instance-level (self._cached_models), but OllamaClient is instantiated fresh inside the generate and discover_models methods of the nodes (e.g., PromptGeneratorNode.generate). This means the cache will not persist between node executions, effectively disabling the caching mechanism. To fix this while avoiding race conditions, consider using class-level attributes protected by a class-level threading.Lock.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
nodes/prompt_combiner_node.py (1)

18-20: ⚡ Quick win

Guard against drift between CombineMode and ModeLiteral

CombineMode and ModeLiteral currently duplicate the same mode values. A small import-time consistency check would prevent subtle UI/type drift if one side changes later.

Suggested patch
 # Single source of truth for the choices exposed in INPUT_TYPES and accepted by combine().
 ModeLiteral = Literal["blend", "concat", "weighted_average"]
+MODE_CHOICES = tuple(m.value for m in CombineMode)
+assert set(get_args(ModeLiteral)) == set(MODE_CHOICES)
@@
                 "mode": (
-                    list(get_args(ModeLiteral)),
+                    list(MODE_CHOICES),
                     {"default": CombineMode.BLEND.value},
                 ),

Also applies to: 45-46

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nodes/prompt_combiner_node.py` around lines 18 - 20, Add an import-time
consistency assertion to ensure CombineMode and ModeLiteral remain in sync:
compare the set/list of mode values from the CombineMode enum (or class) with
the tuple/list used to build ModeLiteral and raise/assert a clear error if they
differ; update the check near where ModeLiteral is defined (and repeat for the
other duplicate at the 45-46 region) so that INPUT_TYPES and the combine()
method rely on a single canonical source and fail fast if the two definitions
diverge.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@nodes/adapters/ollama_client.py`:
- Line 130: The current is_loaded check in ollama_client.py (variable is_loaded)
treats any model that startswith the base family as loaded, causing false
positives across tagged variants; change the logic so entries in running_models
that include an explicit tag (contain ":") require exact equality (model == rm),
while only untagged running_models (no ":") may match any variant by comparing
base names (compare model.split(":")[0] to rm). Update the is_loaded expression
to first detect whether rm contains ":" and branch to exact match for tagged
entries and base-name match only for untagged entries.

In `@nodes/prompt_combiner_node.py`:
- Around line 6-15: The file imports StrEnum which is only available in Python
3.11; replace it with the Python 3.10-compatible pattern by importing Enum from
enum and change the CombineMode declaration to use the str + Enum mixin (i.e.,
class CombineMode(str, Enum):) while keeping the existing members BLEND, CONCAT,
WEIGHTED_AVERAGE and the docstring; remove the StrEnum import and leave other
imports (Any, Literal, get_args) as-is so behavior remains identical on Python
3.10.

---

Nitpick comments:
In `@nodes/prompt_combiner_node.py`:
- Around line 18-20: Add an import-time consistency assertion to ensure
CombineMode and ModeLiteral remain in sync: compare the set/list of mode values
from the CombineMode enum (or class) with the tuple/list used to build
ModeLiteral and raise/assert a clear error if they differ; update the check near
where ModeLiteral is defined (and repeat for the other duplicate at the 45-46
region) so that INPUT_TYPES and the combine() method rely on a single canonical
source and fail fast if the two definitions diverge.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 981620e0-b4f3-49f4-9070-2b1892ed40c1

📥 Commits

Reviewing files that changed from the base of the PR and between 8e19db8 and fc5d023.

📒 Files selected for processing (18)
  • .github/workflows/test.yml
  • .pre-commit-config.yaml
  • __init__.py
  • nodes/adapters/ollama_client.py
  • nodes/negative_prompt_node.py
  • nodes/prompt_combiner_node.py
  • nodes/prompt_generator_node.py
  • nodes/prompt_refiner_node.py
  • nodes/style_applier_node.py
  • pyproject.toml
  • pytest.ini
  • scripts/check_version_tag.py
  • style_presets.py
  • tests/unit/test_extract_final_prompt.py
  • tests/unit/test_node_registration.py
  • tests/unit/test_ollama_client.py
  • tests/unit/test_prompt_combiner.py
  • tests/unit/test_style_presets.py

model == rm or model.startswith(rm.split(":")[0])
for rm in running_models
)
is_loaded = any(model == rm or model.startswith(rm.split(":")[0]) for rm in running_models)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Model-loaded detection can return false positives across tags

model.startswith(rm.split(":")[0]) marks different variants of the same base family as “loaded” (e.g., qwen3:8b vs qwen3:14b), which can misreport health status.

Suggested fix
-            is_loaded = any(model == rm or model.startswith(rm.split(":")[0]) for rm in running_models)
+            requested_name, _, requested_tag = model.partition(":")
+            is_loaded = any(
+                rm == model
+                or (
+                    not requested_tag
+                    and rm.partition(":")[0] == requested_name
+                )
+                for rm in running_models
+            )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
is_loaded = any(model == rm or model.startswith(rm.split(":")[0]) for rm in running_models)
requested_name, _, requested_tag = model.partition(":")
is_loaded = any(
rm == model
or (
not requested_tag
and rm.partition(":")[0] == requested_name
)
for rm in running_models
)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nodes/adapters/ollama_client.py` at line 130, The current is_loaded check in
ollama_client.py (variable is_loaded) treats any model that startswith the base
family as loaded, causing false positives across tagged variants; change the
logic so entries in running_models that include an explicit tag (contain ":")
require exact equality (model == rm), while only untagged running_models (no
":") may match any variant by comparing base names (compare model.split(":")[0]
to rm). Update the is_loaded expression to first detect whether rm contains ":"
and branch to exact match for tagged entries and base-name match only for
untagged entries.

Comment on lines +6 to +15
from enum import StrEnum
from typing import Any, Literal, get_args


class CombineMode(StrEnum):
"""Supported strategies for combining multiple prompts."""

BLEND = "blend"
CONCAT = "concat"
WEIGHTED_AVERAGE = "weighted_average"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Workflow Python versions:"
fd -H -I '.*\.ya?ml' .github/workflows | xargs -r rg -n 'python-version|matrix|3\.10' -C2

echo
echo "Remaining StrEnum usages in Python files:"
rg -n '\bStrEnum\b' --type py

Repository: Limbicnation/ComfyUI-PromptGenerator

Length of output: 1701


Replace StrEnum with str + Enum mixin for Python 3.10 compatibility

StrEnum was introduced in Python 3.11 and is not available in Python 3.10, which is the target version in your CI workflows. This causes an ImportError when running tests. Use the str mixin with Enum instead to maintain equivalent behavior while supporting Python 3.10.

Suggested patch
-from enum import StrEnum
+from enum import Enum
 from typing import Any, Literal, get_args
 
 
-class CombineMode(StrEnum):
+class CombineMode(str, Enum):
     """Supported strategies for combining multiple prompts."""
🧰 Tools
🪛 GitHub Actions: Test

[error] 6-6: Test collection failed: ImportError: cannot import name 'StrEnum' from 'enum' (Python 3.10). The file attempts from enum import StrEnum, but StrEnum is not available in this Python version.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@nodes/prompt_combiner_node.py` around lines 6 - 15, The file imports StrEnum
which is only available in Python 3.11; replace it with the Python
3.10-compatible pattern by importing Enum from enum and change the CombineMode
declaration to use the str + Enum mixin (i.e., class CombineMode(str, Enum):)
while keeping the existing members BLEND, CONCAT, WEIGHTED_AVERAGE and the
docstring; remove the StrEnum import and leave other imports (Any, Literal,
get_args) as-is so behavior remains identical on Python 3.10.

Limbicnation added a commit that referenced this pull request Apr 30, 2026
- fix(scripts): tomllib fallback for Python 3.10 compat
- fix(ci): remove verify-tag-exists from test.yml (publish.yml already guards)
- fix(tests): ensure local nodes/ import in test_node_registration.py
- fix(adapter): shared module-level model cache across OllamaClient instances
- fix(adapter): exact model tag match in check_health() to avoid prefix conflation
- fix(refiner): per-pass seed increment so multi-pass refinement varies
- feat(generator): strip DeepSeek <think> and markdown <details> blocks
- test: add prompt_refiner seed tests, cache sharing tests, exact match tests
- chore(deps): add dev extras with tomli fallback
Limbicnation added a commit that referenced this pull request Apr 30, 2026
- fix(scripts): tomllib fallback for Python 3.10 compat
- fix(ci): remove verify-tag-exists from test.yml (publish.yml already guards)
- fix(tests): ensure local nodes/ import in test_node_registration.py
- fix(adapter): shared module-level model cache across OllamaClient instances
- fix(adapter): exact model tag match in check_health() to avoid prefix conflation
- fix(refiner): per-pass seed increment so multi-pass refinement varies
- feat(generator): strip DeepSeek <think> and markdown <details> blocks
- test: add prompt_refiner seed tests, cache sharing tests, exact match tests
- chore(deps): add dev extras with tomli fallback
Limbicnation added a commit that referenced this pull request Apr 30, 2026
- fix(scripts): tomllib fallback for Python 3.10 compat
- fix(ci): remove verify-tag-exists from test.yml (publish.yml already guards)
- fix(tests): ensure local nodes/ import in test_node_registration.py
- fix(adapter): shared module-level model cache across OllamaClient instances
- fix(adapter): exact model tag match in check_health() to avoid prefix conflation
- fix(refiner): per-pass seed increment so multi-pass refinement varies
- feat(generator): strip DeepSeek <think> and markdown <details> blocks
- test: add prompt_refiner seed tests, cache sharing tests, exact match tests
- chore(deps): add dev extras with tomli fallback
Limbicnation added a commit that referenced this pull request Apr 30, 2026
- fix(scripts): tomllib fallback for Python 3.10 compat
- fix(ci): remove verify-tag-exists from test.yml (publish.yml already guards)
- fix(tests): ensure local nodes/ import in test_node_registration.py
- fix(adapter): shared module-level model cache across OllamaClient instances
- fix(adapter): exact model tag match in check_health() to avoid prefix conflation
- fix(refiner): per-pass seed increment so multi-pass refinement varies
- fix(combiner): validate mode before single-prompt fast path
- feat(generator): strip DeepSeek <think> and markdown <details> blocks
- test: add prompt_refiner seed tests, cache sharing tests, exact match tests
- chore(deps): add dev extras with tomli fallback
@Limbicnation Limbicnation merged commit fc5d023 into main Apr 30, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant