Implement explicit Base FL2VA and Ref2VA profiles, sigma node and native workflow contracts; add Diffusers and ComfyUI-native parity runners, golden evidence, CI jobs, compatibility contracts, and package/release updates. Progress: tracked index and reviewed .secrets.baseline reconciled across 56 public paths; performance matrix regenerated; local Diffusers and native ComfyUI H3 parity PASS; wheel audit PASS (102 files, zero mandatory runtime dependencies). Linux full gate passed pre-pytest stages and reached 2603 passed, 3 skipped, 2 failed. Blockers: the remaining pytest failures are stale native-Windows receipt/matrix fingerprints; this WSL environment cannot execute powershell.exe, cmd.exe, wsl.exe, or PE32+ Windows Python. Hosted Actions evidence is unavailable because GH_TOKEN is invalid. Canonical pinned H1/H2 was not launched because reference/ComfyUI requires comfy-aimdo==0.4.11 while the selected executable environment has 0.4.10. Handoff: regenerate tests/compatibility/fixtures/windows_py313_v1.json natively, regenerate/check the derived compatibility matrix, rerun the Linux full gate, publish the candidate through authenticated hosted CI, then run scripts/run_comfyui_e2e.py --minimax-h3-only against ComfyUI 14b05228 with comfy-aimdo==0.4.11. Keep M6-05 IN_PROGRESS until all gates pass. Detailed local-only records remain in ignored .planning/ and reference/; no weights or credentials are included.
312 lines
13 KiB
Python
312 lines
13 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
import textwrap
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
BOOTSTRAP_PROBE = textwrap.dedent(
|
|
"""
|
|
import importlib.util
|
|
import json
|
|
import pathlib
|
|
import sys
|
|
import types
|
|
|
|
repository_root = pathlib.Path(sys.argv[1])
|
|
|
|
fake_torch = types.ModuleType("torch")
|
|
fake_torch_nn = types.ModuleType("torch.nn")
|
|
|
|
class FakeModule:
|
|
def __call__(self, *args, **kwargs):
|
|
return (args, kwargs)
|
|
|
|
original_module_call = FakeModule.__call__
|
|
fake_torch_nn.Module = FakeModule
|
|
fake_torch.nn = fake_torch_nn
|
|
|
|
sys.modules["torch"] = fake_torch
|
|
sys.modules["torch.nn"] = fake_torch_nn
|
|
sys.modules["numpy"] = types.ModuleType("numpy")
|
|
|
|
spec = importlib.util.spec_from_file_location(
|
|
"comfyui_sigmax_bootstrap_probe",
|
|
repository_root / "__init__.py",
|
|
submodule_search_locations=[str(repository_root)],
|
|
)
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[spec.name] = module
|
|
spec.loader.exec_module(module)
|
|
|
|
payload = {
|
|
"class_mappings": {
|
|
key: value.__name__
|
|
for key, value in module.NODE_CLASS_MAPPINGS.items()
|
|
},
|
|
"display_mappings": module.NODE_DISPLAY_NAME_MAPPINGS,
|
|
"version": module.__version__,
|
|
"web_directory": module.WEB_DIRECTORY,
|
|
"uses_package_mappings": (
|
|
module.NODE_CLASS_MAPPINGS
|
|
is sys.modules[
|
|
"comfyui_sigmax_bootstrap_probe.comfyui_sigmax"
|
|
].NODE_CLASS_MAPPINGS
|
|
and module.NODE_DISPLAY_NAME_MAPPINGS
|
|
is sys.modules[
|
|
"comfyui_sigmax_bootstrap_probe.comfyui_sigmax"
|
|
].NODE_DISPLAY_NAME_MAPPINGS
|
|
),
|
|
"torch_call_unchanged": fake_torch_nn.Module.__call__ is original_module_call,
|
|
"diffusers_loaded": any(
|
|
name == "diffusers" or name.startswith("diffusers.")
|
|
for name in sys.modules
|
|
),
|
|
"comfy_loaded": any(
|
|
name == "comfy" or name.startswith("comfy.")
|
|
for name in sys.modules
|
|
),
|
|
}
|
|
print(json.dumps(payload, sort_keys=True))
|
|
"""
|
|
)
|
|
|
|
|
|
class ImportSafetyTests(unittest.TestCase):
|
|
def test_bootstrap_contract_is_dependency_free(self) -> None:
|
|
result = subprocess.run(
|
|
[
|
|
sys.executable,
|
|
"-I",
|
|
"-c",
|
|
BOOTSTRAP_PROBE,
|
|
str(REPOSITORY_ROOT),
|
|
],
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
self.assertEqual(
|
|
0,
|
|
result.returncode,
|
|
msg=f"stdout:\n{result.stdout}\nstderr:\n{result.stderr}",
|
|
)
|
|
self.assertEqual("", result.stderr)
|
|
self.assertEqual(
|
|
{
|
|
"class_mappings": {
|
|
"Sigmax.AdvancedFlowMatchScheduler": "AdvancedFlowMatchScheduler",
|
|
"Sigmax.AnimaSigmaScheduler": "AnimaSigmaScheduler",
|
|
"Sigmax.AuraFlowSigmaScheduler": "AuraFlowSigmaScheduler",
|
|
"Sigmax.CheckpointEvidenceInspector": "CheckpointEvidenceInspector",
|
|
"Sigmax.Flux1SchnellSigmaScheduler": "Flux1SchnellSigmaScheduler",
|
|
"Sigmax.HunyuanImage21SigmaScheduler": "HunyuanImage21SigmaScheduler",
|
|
"Sigmax.Krea2ConditioningRebalance": "Krea2ConditioningRebalance",
|
|
"Sigmax.Krea2SigmaScheduler": "Krea2SigmaScheduler",
|
|
"Sigmax.LTXSigmaScheduler": "LTXSigmaScheduler",
|
|
"Sigmax.Lumina2SigmaScheduler": "Lumina2SigmaScheduler",
|
|
"Sigmax.MiniMaxH3SigmaScheduler": "MiniMaxH3SigmaScheduler",
|
|
"Sigmax.ModelAwareSigmaScheduler": "ModelAwareSigmaScheduler",
|
|
"Sigmax.ProfileInspector": "ProfileInspector",
|
|
"Sigmax.QwenImageSigmaScheduler": "QwenImageSigmaScheduler",
|
|
"Sigmax.RawWorkflowOutput": "RawWorkflowOutput",
|
|
"Sigmax.SD3SigmaScheduler": "SD3SigmaScheduler",
|
|
"Sigmax.ScheduleComparison": "ScheduleComparison",
|
|
"Sigmax.ScheduleConcatenate": "ScheduleConcatenate",
|
|
"Sigmax.ScheduleInspector": "ScheduleInspector",
|
|
"Sigmax.ScheduleResample": "ScheduleResample",
|
|
"Sigmax.ScheduleSlice": "ScheduleSlice",
|
|
"Sigmax.TurboWorkflowOutput": "TurboWorkflowOutput",
|
|
"Sigmax.WanSigmaScheduler": "WanSigmaScheduler",
|
|
"Sigmax.ZImageSigmaScheduler": "ZImageSigmaScheduler",
|
|
},
|
|
"comfy_loaded": False,
|
|
"diffusers_loaded": False,
|
|
"display_mappings": {
|
|
"Sigmax.AdvancedFlowMatchScheduler": "Advanced FlowMatch Scheduler",
|
|
"Sigmax.AnimaSigmaScheduler": "Anima Sigma Scheduler",
|
|
"Sigmax.AuraFlowSigmaScheduler": "AuraFlow Sigma Scheduler",
|
|
"Sigmax.CheckpointEvidenceInspector": "Checkpoint Evidence Inspector",
|
|
"Sigmax.Flux1SchnellSigmaScheduler": "FLUX.1-schnell Sigma Scheduler",
|
|
"Sigmax.HunyuanImage21SigmaScheduler": "HunyuanImage 2.1 Sigma Scheduler",
|
|
"Sigmax.Krea2ConditioningRebalance": "Krea 2 Conditioning Rebalance",
|
|
"Sigmax.Krea2SigmaScheduler": "Krea 2 Sigma Scheduler",
|
|
"Sigmax.LTXSigmaScheduler": "LTX Sigma Scheduler",
|
|
"Sigmax.Lumina2SigmaScheduler": "Lumina-Image 2.0 Sigma Scheduler",
|
|
"Sigmax.MiniMaxH3SigmaScheduler": "MiniMax H3 Sigma Scheduler",
|
|
"Sigmax.ModelAwareSigmaScheduler": "Model-Aware Sigma Scheduler",
|
|
"Sigmax.ProfileInspector": "Profile Inspector",
|
|
"Sigmax.QwenImageSigmaScheduler": "Qwen Image Sigma Scheduler",
|
|
"Sigmax.RawWorkflowOutput": "RAW Workflow Output",
|
|
"Sigmax.SD3SigmaScheduler": "Stable Diffusion 3 Sigma Scheduler",
|
|
"Sigmax.ScheduleComparison": "Schedule Comparison",
|
|
"Sigmax.ScheduleConcatenate": "Schedule Concatenate",
|
|
"Sigmax.ScheduleInspector": "Schedule Inspector",
|
|
"Sigmax.ScheduleResample": "Schedule Resample",
|
|
"Sigmax.ScheduleSlice": "Schedule Slice",
|
|
"Sigmax.TurboWorkflowOutput": "Turbo Workflow Output",
|
|
"Sigmax.WanSigmaScheduler": "Wan Sigma Scheduler",
|
|
"Sigmax.ZImageSigmaScheduler": "Z-Image Sigma Scheduler",
|
|
},
|
|
"torch_call_unchanged": True,
|
|
"uses_package_mappings": True,
|
|
"version": "1.0.0",
|
|
"web_directory": "./web",
|
|
},
|
|
json.loads(result.stdout),
|
|
)
|
|
|
|
def test_unrelated_legacy_modules_are_removed(self) -> None:
|
|
for relative_path in (
|
|
"nunchaku_compat.py",
|
|
"extract_metadata_node.py",
|
|
):
|
|
with self.subTest(path=relative_path):
|
|
self.assertFalse(
|
|
(REPOSITORY_ROOT / relative_path).exists(),
|
|
msg=f"unrelated legacy module remains: {relative_path}",
|
|
)
|
|
|
|
def test_bootstrap_supports_pytest_style_top_level_import(self) -> None:
|
|
probe = textwrap.dedent(
|
|
"""
|
|
import sys
|
|
|
|
sys.path.insert(0, sys.argv[1])
|
|
import __init__ as bootstrap
|
|
|
|
assert bootstrap.__version__ == "1.0.0"
|
|
assert bootstrap.WEB_DIRECTORY == "./web"
|
|
assert sorted(bootstrap.NODE_CLASS_MAPPINGS) == [
|
|
"Sigmax.AdvancedFlowMatchScheduler",
|
|
"Sigmax.AnimaSigmaScheduler",
|
|
"Sigmax.AuraFlowSigmaScheduler",
|
|
"Sigmax.CheckpointEvidenceInspector",
|
|
"Sigmax.Flux1SchnellSigmaScheduler",
|
|
"Sigmax.HunyuanImage21SigmaScheduler",
|
|
"Sigmax.Krea2ConditioningRebalance",
|
|
"Sigmax.Krea2SigmaScheduler",
|
|
"Sigmax.LTXSigmaScheduler",
|
|
"Sigmax.Lumina2SigmaScheduler",
|
|
"Sigmax.MiniMaxH3SigmaScheduler",
|
|
"Sigmax.ModelAwareSigmaScheduler",
|
|
"Sigmax.ProfileInspector",
|
|
"Sigmax.QwenImageSigmaScheduler",
|
|
"Sigmax.RawWorkflowOutput",
|
|
"Sigmax.SD3SigmaScheduler",
|
|
"Sigmax.ScheduleComparison",
|
|
"Sigmax.ScheduleConcatenate",
|
|
"Sigmax.ScheduleInspector",
|
|
"Sigmax.ScheduleResample",
|
|
"Sigmax.ScheduleSlice",
|
|
"Sigmax.TurboWorkflowOutput",
|
|
"Sigmax.WanSigmaScheduler",
|
|
"Sigmax.ZImageSigmaScheduler",
|
|
]
|
|
assert bootstrap.NODE_DISPLAY_NAME_MAPPINGS == {
|
|
"Sigmax.AdvancedFlowMatchScheduler": "Advanced FlowMatch Scheduler",
|
|
"Sigmax.AnimaSigmaScheduler": "Anima Sigma Scheduler",
|
|
"Sigmax.AuraFlowSigmaScheduler": "AuraFlow Sigma Scheduler",
|
|
"Sigmax.CheckpointEvidenceInspector": "Checkpoint Evidence Inspector",
|
|
"Sigmax.Flux1SchnellSigmaScheduler": "FLUX.1-schnell Sigma Scheduler",
|
|
"Sigmax.HunyuanImage21SigmaScheduler": "HunyuanImage 2.1 Sigma Scheduler",
|
|
"Sigmax.Krea2ConditioningRebalance": "Krea 2 Conditioning Rebalance",
|
|
"Sigmax.Krea2SigmaScheduler": "Krea 2 Sigma Scheduler",
|
|
"Sigmax.LTXSigmaScheduler": "LTX Sigma Scheduler",
|
|
"Sigmax.Lumina2SigmaScheduler": "Lumina-Image 2.0 Sigma Scheduler",
|
|
"Sigmax.MiniMaxH3SigmaScheduler": "MiniMax H3 Sigma Scheduler",
|
|
"Sigmax.ModelAwareSigmaScheduler": "Model-Aware Sigma Scheduler",
|
|
"Sigmax.ProfileInspector": "Profile Inspector",
|
|
"Sigmax.QwenImageSigmaScheduler": "Qwen Image Sigma Scheduler",
|
|
"Sigmax.RawWorkflowOutput": "RAW Workflow Output",
|
|
"Sigmax.SD3SigmaScheduler": "Stable Diffusion 3 Sigma Scheduler",
|
|
"Sigmax.ScheduleComparison": "Schedule Comparison",
|
|
"Sigmax.ScheduleConcatenate": "Schedule Concatenate",
|
|
"Sigmax.ScheduleInspector": "Schedule Inspector",
|
|
"Sigmax.ScheduleResample": "Schedule Resample",
|
|
"Sigmax.ScheduleSlice": "Schedule Slice",
|
|
"Sigmax.TurboWorkflowOutput": "Turbo Workflow Output",
|
|
"Sigmax.WanSigmaScheduler": "Wan Sigma Scheduler",
|
|
"Sigmax.ZImageSigmaScheduler": "Z-Image Sigma Scheduler",
|
|
}
|
|
"""
|
|
)
|
|
result = subprocess.run(
|
|
[sys.executable, "-I", "-c", probe, str(REPOSITORY_ROOT)],
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
self.assertEqual(
|
|
0,
|
|
result.returncode,
|
|
msg=f"stdout:\n{result.stdout}\nstderr:\n{result.stderr}",
|
|
)
|
|
|
|
|
|
def test_bootstrap_supports_dynamic_comfyui_custom_node_loader() -> None:
|
|
probe = textwrap.dedent(
|
|
"""
|
|
import importlib.util
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
root = Path(sys.argv[1]).resolve()
|
|
spec = importlib.util.spec_from_file_location(
|
|
"custom_nodes.ComfyUI_Sigmax",
|
|
root / "__init__.py",
|
|
submodule_search_locations=[str(root)],
|
|
)
|
|
assert spec is not None and spec.loader is not None
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[spec.name] = module
|
|
spec.loader.exec_module(module)
|
|
assert module.WEB_DIRECTORY == "./web"
|
|
print(json.dumps(sorted(module.NODE_CLASS_MAPPINGS)))
|
|
"""
|
|
)
|
|
result = subprocess.run(
|
|
[sys.executable, "-I", "-S", "-c", probe, str(REPOSITORY_ROOT)],
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
assert result.returncode == 0, result.stderr
|
|
assert json.loads(result.stdout) == [
|
|
"Sigmax.AdvancedFlowMatchScheduler",
|
|
"Sigmax.AnimaSigmaScheduler",
|
|
"Sigmax.AuraFlowSigmaScheduler",
|
|
"Sigmax.CheckpointEvidenceInspector",
|
|
"Sigmax.Flux1SchnellSigmaScheduler",
|
|
"Sigmax.HunyuanImage21SigmaScheduler",
|
|
"Sigmax.Krea2ConditioningRebalance",
|
|
"Sigmax.Krea2SigmaScheduler",
|
|
"Sigmax.LTXSigmaScheduler",
|
|
"Sigmax.Lumina2SigmaScheduler",
|
|
"Sigmax.MiniMaxH3SigmaScheduler",
|
|
"Sigmax.ModelAwareSigmaScheduler",
|
|
"Sigmax.ProfileInspector",
|
|
"Sigmax.QwenImageSigmaScheduler",
|
|
"Sigmax.RawWorkflowOutput",
|
|
"Sigmax.SD3SigmaScheduler",
|
|
"Sigmax.ScheduleComparison",
|
|
"Sigmax.ScheduleConcatenate",
|
|
"Sigmax.ScheduleInspector",
|
|
"Sigmax.ScheduleResample",
|
|
"Sigmax.ScheduleSlice",
|
|
"Sigmax.TurboWorkflowOutput",
|
|
"Sigmax.WanSigmaScheduler",
|
|
"Sigmax.ZImageSigmaScheduler",
|
|
]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|