* chore: initialise BEACON framework with all bootstrap artefacts - Problem statement, constitution, architecture doc, roadmap populated - CHANGELOG.md created (Keep a Changelog); README expanded with What-is-this, Install, and Quickstart sections - pyproject.toml gains [project.urls] (repository + documentation) - beacon doctor: 32 pass, 2 pre-commit warns, 0 failures Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: Phase 1 — add NullHandler to package root, remove hardcoded setLevel T001: logging.getLogger("comfydv").addHandler(NullHandler()) in __init__.py T002: remove logger.setLevel(logging.DEBUG) from format_string.py Also fix pyproject.toml TOML structure (project.urls was inside [project] block) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: failing tests for logging modernisation (T010-T through T030-T) RED phase — 5 tests fail for the correct reasons before implementation: T010-T: format_string produces stdout (print block) T011-T: update_widget emits INFO records on hot path T012-T: random_choice produces stdout (colorama/rich prints) T020-T: load_node_state uses print() on error instead of logger.error T021-T: circuit_breaker uses print() instead of logger T001/T002/T030-T already green: NullHandler registered, setLevel removed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: standardise logging across all nodes (T010-I through T044) GREEN phase — all 11 logging tests pass: T010-I: Remove 8-line diagnostic print block from format_string() T011-I: Downgrade all hot-path logger.info() calls to logger.debug(); switch all logger calls to %-style formatting; remove rich import T012-I: Replace colorama/termcolor/rich print calls in random_choice with logger.debug(); add logger = logging.getLogger(__name__) T020-I: Convert print() on load_node_state error to logger.error() T021-I: Add logger to circuit_breaker; replace print() with logger.debug(); fix logic so status=False triggers the interrupt (per BDD spec) T040: Remove colorama, rich, termcolor from pyproject.toml dependencies T042: ruff check + format clean T044: beacon doctor --strict passes (34/34) Also adds ADR-001 and ADR-002 capturing the stdlib logging and NullHandler decisions, linked from the logging-modernisation epic. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: mark all 001-standardise-logging tasks complete in tasks.md All [x] checkboxes flipped after 11/11 tests pass and beacon doctor --strict reports 0 failures. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: mark logging-modernisation epic success criteria complete All success criteria verified: NullHandler added, setLevel removed, print() calls converted, colorama/rich/termcolor removed from deps, zero stdout in normal operation, errors surface at ERROR level, all tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: commit spec artefacts and dependency lock for 001-standardise-logging Includes spec.md, plan.md, research.md, BDD feature files, contracts, .beacon.toml backlink, and uv.lock after removing colorama/rich/termcolor. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: James Veitch <darthveitcher@office-mac-mini.local> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
3.2 KiB
Problem Statement
Core Problem
ComfyUI ships no general-purpose string formatting, random-selection, or workflow-interruption primitives, forcing workflow creators to work around missing utilities with brittle workarounds or custom Python script nodes that can't be shared easily.
Target User
Who: ComfyUI power users building automated or parameterised image/video generation pipelines
Context: Mid-workflow, when they need to compose prompts from variables, randomly sample a style or subject, or halt a misbehaving pipeline without killing the ComfyUI process
Current pain: They either hard-code values in prompt strings, rely on community nodes with inconsistent APIs, or paste raw Python into script nodes — none of which is reusable, version-controlled, or easy to chain
Success Criteria
How will we know this is working? Make these measurable.
FormatStringnode accepts an arbitrary template (Python f-string or Jinja2) and dynamically exposes detected variables as typed inputs, with pass-through outputs for downstream chainingRandomChoicenode accepts an arbitrary number of typed inputs and returns one at random with reproducible seed controlCircuitBreakernode raisesInterruptProcessingExceptionto halt a run without crashing ComfyUI whenstatus=False- All nodes install via the standard ComfyUI custom-node mechanism (drop into
custom_nodes/, restart server) - Node tests pass outside ComfyUI (no ComfyUI import required in the test suite)
ruff,ty, andbeacon doctorare all clean before any PR merges
Non-Goals
Explicitly naming what we are not solving prevents scope creep.
- NOT a general-purpose Python scripting node — template execution is sandboxed; arbitrary code is not supported
- NOT a ComfyUI Manager listing or PyPI release at this stage — distribution is manual install or git clone
- NOT cross-platform GPU tooling — nodes are CPU-only utilities; the ComfyUI host handles GPU concerns
- NOT a replacement for ComfyUI's native primitive nodes — these nodes fill the gaps, not the core
Why This Matters
ComfyUI workflows are increasingly used for production pipelines — batch prompt generation, style randomisation, asset naming — but the node library has always under-served text manipulation. A small, well-tested utility pack that installs in seconds and requires zero Python knowledge from the end user removes a class of frustrating workarounds and lets workflow creators focus on composition, not plumbing.
Constraints
- Must load inside ComfyUI's existing import system — top-level
__init__.pyexposesNODE_CLASS_MAPPINGSandNODE_DISPLAY_NAME_MAPPINGS - Jinja2 rendering must use
SandboxedEnvironmentto prevent arbitrary code execution from user-supplied templates - Tests must not require a live ComfyUI process —
comfy.*imports are guarded and mocked at test time - Python ≥ 3.10; managed via
uv/.python-version
Created: 2026-06-28
Last updated: 2026-06-28 — initial SEED artefact
Status: Living document — update when requirements evolve