Skip to content

Latest commit

 

History

History
2952 lines (2839 loc) · 148 KB

File metadata and controls

2952 lines (2839 loc) · 148 KB

redeploy

SUMD - Structured Unified Markdown Descriptor for AI-aware project refactorization

Contents

Metadata

  • name: redeploy
  • version: 0.2.77
  • python_requires: >=3.11
  • license: Apache-2.0
  • ai_model: openrouter/qwen/qwen3-coder-next
  • ecosystem: SUMD + DOQL + testql + taskfile
  • generated_from: pyproject.toml, Makefile, testql(2), app.doql.less, pyqual.yaml, goal.yaml, .env.example, src(13 mod), project/(6 analysis files)

Architecture

SUMD (description) → DOQL/source (code) → taskfile (automation) → testql (verification)

DOQL Application Declaration (app.doql.less)

// LESS format — define @variables here as needed
// Generated by sumd for redeploy

app {
  name: redeploy;
  version: 0.2.77;
}

interface[type="cli"] {
  framework: click;
}

workflow[name="install"] {
  trigger: manual;
  step-1: run cmd=pip install -e .;
}

workflow[name="dev"] {
  trigger: manual;
  step-1: run cmd=pip install -e ".[dev]";
}

workflow[name="build"] {
  trigger: manual;
  step-1: run cmd=python -m build;
}

workflow[name="test"] {
  trigger: manual;
  step-1: run cmd=pytest -q;
}

workflow[name="lint"] {
  trigger: manual;
  step-1: run cmd=ruff check .;
}

workflow[name="fmt"] {
  trigger: manual;
  step-1: run cmd=ruff format .;
}

workflow[name="clean"] {
  trigger: manual;
  step-1: run cmd=rm -rf build/ dist/ *.egg-info;
}

workflow[name="help"] {
  trigger: manual;
  step-1: run cmd=task --list;
}

deploy {
  target: pip;
}

environment[name="local"] {
  runtime: python;
}

Source Modules

  • redeploy.cli
  • redeploy.data_sync
  • redeploy.fleet
  • redeploy.heal
  • redeploy.mcp_server
  • redeploy.observe
  • redeploy.parse
  • redeploy.patterns
  • redeploy.schema
  • redeploy.spec_loader
  • redeploy.ssh
  • redeploy.verify
  • redeploy.version

Workflows

Quality Pipeline (pyqual.yaml)

pipeline:
  name: redeploy-quality

  metrics:
    cc_max: 15
    critical_max: 80

  stages:
    - name: analyze
      tool: code2llm-filtered

    - name: validate
      tool: vallm-filtered

    - name: prefact
      tool: prefact
      optional: true
      when: any_stage_fail
      timeout: 900

    - name: test
      tool: pytest
      timeout: 600

  loop:
    max_iterations: 3
    on_fail: report
    ticket_backends:
      - markdown

  env:
    LLM_MODEL: openrouter/qwen/qwen3-coder-next

Dependencies

Runtime

pydantic>=2.0
pyyaml>=6.0
markdown-it-py>=3.0
click>=8.0
loguru>=0.7
paramiko>=3.0
httpx>=0.25
rich>=13.0
jmespath>=1.0
goal>=2.1.0
costs>=0.1.20
pfix>=0.1.60

Development

pytest>=8.0
ruff>=0.4
goal>=2.1.0
costs>=0.1.20
pfix>=0.1.60

Source Map

Top 5 modules by symbol density — signatures for LLM orientation.

redeploy.observe (redeploy/observe.py)

class AuditEntry:  # Single audit log entry — immutable snapshot of one deploymen
    def __init__(data)  # CC=1
    def ts()  # CC=1
    def host()  # CC=1
    def app()  # CC=1
    def from_strategy()  # CC=1
    def to_strategy()  # CC=1
    def ok()  # CC=1
    def elapsed_s()  # CC=1
    def steps_total()  # CC=1
    def steps_ok()  # CC=1
    def steps_failed()  # CC=1
    def pattern()  # CC=1
    def version()  # CC=1
    def dry_run()  # CC=1
    def steps()  # CC=1
    def error()  # CC=1
    def to_dict()  # CC=1
    def __repr__()  # CC=2
class DeployAuditLog:  # Persistent audit log — newline-delimited JSON at ``path``.
    def __init__(path)  # CC=1
    def record(plan, completed_steps)  # CC=11 ⚠
    def _append(entry)  # CC=1
    def load(limit)  # CC=5
    def tail(n)  # CC=1
    def filter(host, app, ok, since)  # CC=12 ⚠
    def clear()  # CC=2
class DeployReport:  # Human-readable post-deploy report from an AuditEntry.
    def __init__(entry)  # CC=1
    def text()  # CC=8
    def yaml()  # CC=1
    def summary_line()  # CC=2

redeploy.fleet (redeploy/fleet.py)

class DeviceArch:
class Stage:
class DeviceExpectation:  # Declarative assertions about required infrastructure on a de
class FleetDevice:  # Generic device descriptor — superset of ``deploy``'s DeviceC
    def ssh_user()  # CC=2
    def ssh_ip()  # CC=2
    def is_local()  # CC=1
    def is_prod()  # CC=2
    def has_tag(tag)  # CC=1
    def has_expectation(exp)  # CC=1
    def verify_expectations(state)  # CC=25 ⚠
class FleetConfig:  # Top-level fleet manifest — list of devices with stage / tag 
    def get_device(device_id)  # CC=3
    def by_tag(tag)  # CC=3
    def by_stage(stage)  # CC=3
    def by_strategy(strategy)  # CC=3
    def prod_devices()  # CC=1
    def from_file(cls, path, workspace_root)  # CC=1
class Fleet:  # Unified first-class fleet — wraps FleetConfig and/or DeviceR
    def __init__(devices)  # CC=1
    def from_file(cls, path)  # CC=1
    def from_registry(cls, path)  # CC=6
    def from_config(cls, config)  # CC=1
    def devices()  # CC=1
    def get(device_id)  # CC=3
    def by_tag(tag)  # CC=3
    def by_stage(stage)  # CC=3
    def by_strategy(strategy)  # CC=3
    def prod()  # CC=1
    def reachable(within_seconds)  # CC=5
    def merge(other)  # CC=3
    def __len__()  # CC=1
    def __iter__()  # CC=1
    def __repr__()  # CC=1

redeploy.ssh (redeploy/ssh.py)

class SshResult:
    def ok()  # CC=1
    def success()  # CC=1
    def out()  # CC=1
class SshClient:  # Execute commands on a remote host via SSH (or locally).
    def __init__(host, port, key, ssh_id)  # CC=1
    def key()  # CC=1
    def key(v)  # CC=1
    def run(cmd, timeout)  # CC=5
    def rsync(local_path, remote_path, exclude, delete, timeout)  # CC=7
    def scp(local_path, remote_path, timeout)  # CC=4
    def put_file(content, remote_path, mode)  # CC=5
    def is_reachable(timeout)  # CC=3
    def is_ssh_ready()  # CC=2
    def ping()  # CC=4
    def _run_local(cmd, timeout)  # CC=3
    def _ssh_opts()  # CC=2
    def _scp_opts()  # CC=2
    def _detect_ssh_key()  # CC=1
    def _detect_key()  # CC=6
class RemoteProbe:  # Thin wrapper kept for redeploy.detect compatibility.
    def __init__(host)  # CC=1
    def is_local()  # CC=1
    def is_local(v)  # CC=1
class RemoteExecutor:  # Thin wrapper kept for deploy.core compatibility.
    def __init__(device)  # CC=1
    def ssh_target()  # CC=1
    def ssh_opts()  # CC=1
    def scp_opts()  # CC=1

redeploy.heal (redeploy/heal.py)

def _ssh(host, command)  # CC=3, fan=2
def collect_diagnostics(host, failed_step)  # CC=2, fan=4
def ask_llm(failed_step, step_output, diag, spec_text, fix_hint)  # CC=8, fan=5
def apply_fix_to_spec(spec_path, failed_step, llm_response)  # CC=6, fan=10
def write_repair_log(spec_path, version, repairs)  # CC=6, fan=9
def parse_failed_step(executor_summary, executor)  # CC=8, fan=7
class HealLoopDetector:  # Detect repeated non-converging heal hints for a given step.
    def __init__(max_identical_hints)  # CC=2
    def observe(step_id, hint)  # CC=5
    def reset(step_id)  # CC=1
class HealRunner:  # Wraps Executor with self-healing loop.
    def __init__(migration, spec_path, host, fix_hint, max_retries, dry_run, console, version)  # CC=2
    def _make_executor(resume)  # CC=4
    def _reload_migration()  # CC=1
    def _run_executor_attempt(executor)  # CC=1
    def _collect_diag_with_hint(failed_step)  # CC=2
    def _extract_diag_hint(diag)  # CC=5
    def _ask_and_apply_fix(failed_step, step_output, diag)  # CC=7
    def _record_repair(failed_step, attempt, summary, diag_hint, fixed)  # CC=1
    def _is_repeating_loop(failed_step, summary, diag_hint)  # CC=1
    def _retry_after_heal()  # CC=1
    def run()  # CC=8

redeploy.mcp_server (redeploy/mcp_server.py)

def _redeploy_bin()  # CC=5, fan=4
def _run()  # CC=4, fan=4
def _validate_exec_ssh_inputs(host, command)  # CC=5, fan=3
def schema(directory)  # CC=1, fan=5
def plan_spec(spec, cwd)  # CC=1, fan=2
def run_spec(spec, force, dry_run, heal, fix_hint, cwd)  # CC=5, fan=3
def fix_spec(spec_or_dir, hint, bump, retries, dry_run, cwd)  # CC=4, fan=4
def bump_version(spec_or_dir, level, cwd)  # CC=3, fan=3
def diagnose(host)  # CC=1, fan=2
def list_specs(directory)  # CC=1, fan=6
def exec_ssh(host, command)  # CC=4, fan=4
def nlp_command(instruction, dry_run, cwd)  # CC=2, fan=2
def get_spec_content(path)  # CC=3, fan=5
def get_workspace()  # CC=1, fan=3
def serve(transport, host, port)  # CC=4, fan=4

Call Graph

438 nodes · 406 edges · 118 modules · CC̄=5.0

Hubs (by degree)

Function CC in out total
list (in redeploy.steps.StepLibrary) 1 51 2 53
snapshot_to_hardware_info (in redeploy.integrations.op3_bridge) 10 ⚠ 2 49 51
gh_workflow_run (in redeploy.cli.commands.gh_workflow) 19 ⚠ 0 49 49
lint (in redeploy.cli.commands.lint) 19 ⚠ 0 44 44
_heal_step (in redeploy.heal.runner.HealRunner) 14 ⚠ 0 40 40
exec_cmd (in redeploy.cli.commands.exec_) 9 0 40 40
_bump_single (in redeploy.cli.commands.version.helpers) 25 ⚠ 4 35 39
version_list (in redeploy.cli.commands.version.commands) 13 ⚠ 0 38 38
# code2llm call graph | /home/tom/github/maskservice/redeploy
# generated in 0.22s
# nodes: 438 | edges: 406 | modules: 118
# CC̄=5.0

HUBS[20]:
  redeploy.steps.StepLibrary.list
    CC=1  in:51  out:2  total:53
  redeploy.integrations.op3_bridge.snapshot_to_hardware_info
    CC=10  in:2  out:49  total:51
  redeploy.cli.commands.gh_workflow.gh_workflow_run
    CC=19  in:0  out:49  total:49
  redeploy.cli.commands.lint.lint
    CC=19  in:0  out:44  total:44
  redeploy.heal.runner.HealRunner._heal_step
    CC=14  in:0  out:40  total:40
  redeploy.cli.commands.exec_.exec_cmd
    CC=9  in:0  out:40  total:40
  redeploy.cli.commands.version.helpers._bump_single
    CC=25  in:4  out:35  total:39
  redeploy.cli.commands.version.commands.version_list
    CC=13  in:0  out:38  total:38
  redeploy.iac.config_hints.ConfigHintsParser._parse_k8s_yaml
    CC=26  in:0  out:38  total:38
  redeploy.cli.commands.plugin.plugin_cmd
    CC=13  in:0  out:38  total:38
  redeploy.cli.commands.prompt_cmd.prompt_cmd
    CC=15  in:0  out:37  total:37
  redeploy.discovery.auto_probe.auto_probe
    CC=7  in:4  out:33  total:37
  redeploy.blueprint.sources.compose._merge_compose
    CC=21  in:1  out:33  total:34
  redeploy.plugins.builtin.hardware_diagnostic._analyze_hardware
    CC=14  in:1  out:32  total:33
  redeploy.cli.commands.target.target
    CC=10  in:1  out:31  total:32
  redeploy.heal.hint_provider.apply_fix_to_spec
    CC=16  in:0  out:30  total:30
  redeploy.detect.detector.Detector.run
    CC=9  in:0  out:30  total:30
  examples.redeploy_iac_parsers.helm_kustomize.HelmTemplatesParser.parse
    CC=17  in:0  out:27  total:27
  redeploy.apply.executor.Executor._execute_step
    CC=4  in:0  out:27  total:27
  redeploy.apply.state_apply.HardwareStateHandler.apply
    CC=18  in:0  out:27  total:27

MODULES:
  examples.redeploy_iac_parsers.gitops_ci  [2 funcs]
    can_parse  CC=11  out:9
    _is_gitops_command  CC=2  out:2
  examples.redeploy_iac_parsers.helm_kustomize  [1 funcs]
    parse  CC=17  out:27
  redeploy.analyze.checkers.binary  [2 funcs]
    check  CC=7  out:8
    extract_binaries  CC=14  out:8
  redeploy.analyze.checkers.command_ref  [1 funcs]
    _check_external_ref  CC=6  out:8
  redeploy.analyze.checkers.compose  [6 funcs]
    check  CC=7  out:7
    _check_build_section  CC=7  out:12
    _check_env_files  CC=6  out:8
    _check_volumes  CC=11  out:12
    _is_ignored  CC=2  out:4
    scan_compose_file  CC=6  out:9
  redeploy.analyze.checkers.docker_build  [6 funcs]
    _check_remote_context  CC=12  out:12
    check  CC=4  out:8
    collect_sync_mappings  CC=5  out:10
    match_local_src  CC=5  out:3
    parse_docker_build  CC=9  out:7
    resolve_local_dockerfile  CC=3  out:6
  redeploy.analyze.checkers.path  [4 funcs]
    check  CC=9  out:13
    _check_field  CC=9  out:15
    is_inside  CC=2  out:3
    resolve_local_path  CC=3  out:6
  redeploy.analyze.ignore  [2 funcs]
    is_ignored  CC=9  out:10
    ensure_redeployignore  CC=2  out:2
  redeploy.analyze.models  [1 funcs]
    add  CC=2  out:2
  redeploy.analyze.preflight_schema  [6 funcs]
    _collect_local_artifacts  CC=6  out:16
    _collect_remote_checks  CC=8  out:14
    _resolve_command_refs  CC=11  out:20
    _resolve_local_path  CC=4  out:7
    generate_preflight_schema  CC=14  out:25
    save_preflight_schema  CC=1  out:3
  redeploy.analyze.spec_analyzer  [2 funcs]
    __init__  CC=3  out:2
    analyze_file  CC=7  out:10
  redeploy.apply.executor  [3 funcs]
    __init__  CC=14  out:8
    _execute_step  CC=4  out:27
    _rollback  CC=1  out:1
  redeploy.apply.handlers  [15 funcs]
    _all_containers_healthy  CC=5  out:2
    _ensure_remote_parent_dir  CC=7  out:6
    _format_step_output  CC=6  out:7
    _parse_container_statuses  CC=6  out:8
    _resolve_command_ref  CC=6  out:10
    run_docker_build  CC=1  out:1
    run_docker_health_wait  CC=10  out:11
    run_ensure_autostart_entry  CC=16  out:21
    run_ensure_config_line  CC=7  out:9
    run_inline_script  CC=6  out:7
  redeploy.apply.rollback  [1 funcs]
    rollback_steps  CC=8  out:8
  redeploy.apply.state  [6 funcs]
    reset  CC=1  out:2
    save  CC=5  out:11
    _now_iso  CC=1  out:2
    _slug  CC=5  out:3
    default_state_path  CC=2  out:2
    state_key  CC=1  out:7
  redeploy.apply.state_apply  [4 funcs]
    apply  CC=18  out:27
    _update_kanshi  CC=9  out:17
    apply_state  CC=2  out:4
    detect_handler  CC=3  out:1
  redeploy.apply.utils.run_container_build  [1 funcs]
    run_container_build  CC=10  out:21
  redeploy.audit  [1 funcs]
    audit_spec  CC=1  out:3
  redeploy.audit.extractor  [1 funcs]
    _from_target  CC=7  out:9
  redeploy.audit.paths  [2 funcs]
    extract_port  CC=5  out:6
    normalize_path  CC=3  out:5
  redeploy.blueprint.extractor  [1 funcs]
    extract_blueprint  CC=22  out:23
  redeploy.blueprint.generators.docker_compose  [2 funcs]
    _build_service  CC=20  out:8
    generate_twin  CC=11  out:3
  redeploy.blueprint.sources.compose  [6 funcs]
    _merge_compose  CC=21  out:33
    _parse_compose_env  CC=7  out:8
    _parse_compose_healthcheck  CC=6  out:6
    _parse_compose_ports  CC=7  out:21
    _parse_compose_volumes  CC=8  out:13
    merge_compose_files  CC=2  out:1
  redeploy.blueprint.sources.hardware  [1 funcs]
    build_hw_requirements  CC=13  out:15
  redeploy.blueprint.sources.infra  [1 funcs]
    infer_app_url  CC=8  out:1
  redeploy.cli  [3 funcs]
    _resolve_device  CC=5  out:12
    _setup_logging  CC=2  out:2
    cli  CC=1  out:5
  redeploy.cli.commands.blueprint  [2 funcs]
    _execute_query_blueprint  CC=1  out:1
    show  CC=4  out:18
  redeploy.cli.commands.bump_fix  [9 funcs]
    _bump_patch  CC=2  out:7
    _bump_version_file  CC=1  out:5
    _detect_version  CC=2  out:3
    _find_spec  CC=15  out:22
    _find_version_file  CC=3  out:2
    _prompt_choose_spec  CC=5  out:9
    _update_migration_header  CC=2  out:7
    _update_quadlet_service_version  CC=6  out:9
    bump_cmd  CC=6  out:23
  redeploy.cli.commands.device_map_actions  [2 funcs]
    execute_query_device_map  CC=1  out:1
    probe_device_map  CC=9  out:15
  redeploy.cli.commands.device_map_renderers  [5 funcs]
    _build_drm_table  CC=9  out:8
    _build_header_panel  CC=4  out:3
    _build_issues_table  CC=3  out:12
    _build_services_table  CC=7  out:9
    render_rich  CC=22  out:22
  redeploy.cli.commands.devices  [1 funcs]
    devices  CC=4  out:14
  redeploy.cli.commands.devices_display  [2 funcs]
    filter_devices  CC=13  out:0
    render_devices_table  CC=7  out:16
  redeploy.cli.commands.diagnose  [1 funcs]
    diagnose  CC=5  out:19
  redeploy.cli.commands.exec_  [3 funcs]
    _extract_all_scripts  CC=3  out:7
    _extract_script_for_ref  CC=2  out:1
    exec_cmd  CC=9  out:40
  redeploy.cli.commands.export  [4 funcs]
    _export_to_css  CC=2  out:2
    _find_export_source  CC=9  out:10
    _load_manifest_from_css  CC=1  out:1
    export_cmd  CC=7  out:23
  redeploy.cli.commands.gh_workflow  [12 funcs]
    _collect_workflow_meta  CC=3  out:10
    _find_repo_root  CC=4  out:3
    _has_workflow_dispatch  CC=4  out:3
    _load_yaml  CC=4  out:5
    _on_section  CC=1  out:2
    _resolve_repo_root  CC=3  out:5
    _resolve_workflow_identifier  CC=10  out:11
    _trigger_list  CC=6  out:6
    _workflows_dir  CC=2  out:2
    gh_workflow_analyze  CC=7  out:20
  redeploy.cli.commands.hardware  [4 funcs]
    _apply_fix  CC=8  out:18
    _apply_transform  CC=4  out:4
    _execute_query  CC=1  out:2
    _probe_hardware  CC=4  out:6
  redeploy.cli.commands.import_  [4 funcs]
    _copy_plugin_template  CC=3  out:12
    _examples_plugin_dir  CC=1  out:2
    _plugin_templates  CC=1  out:0
    _print_plugin_templates  CC=2  out:4
  redeploy.cli.commands.inspect  [2 funcs]
    _find_css_path  CC=4  out:4
    inspect  CC=4  out:22
  redeploy.cli.commands.lint  [1 funcs]
    lint  CC=19  out:44
  redeploy.cli.commands.mcp_cmd  [1 funcs]
    mcp_cmd  CC=1  out:6
  redeploy.cli.commands.plan_apply_report  [10 funcs]
    _parse_rsync_output  CC=13  out:8
    _render_checksum_section  CC=7  out:13
    _run_rsync_checksum  CC=6  out:10
    _skipped_checksum  CC=1  out:1
    build_checksum_verification  CC=14  out:15
    default_report_path  CC=1  out:0
    render_markdown_report  CC=12  out:13
    resolve_audit_entry  CC=10  out:16
    step_command_block  CC=14  out:5
    write_markdown_report  CC=2  out:7
  redeploy.cli.commands.plan_apply_run  [1 funcs]
    run_preflight_phase  CC=8  out:19
  redeploy.cli.commands.plan_apply_shared  [2 funcs]
    apply_manifest_to_spec  CC=8  out:9
    load_spec_for_run  CC=4  out:6
  redeploy.cli.commands.plugin  [1 funcs]
    plugin_cmd  CC=13  out:38
  redeploy.cli.commands.probe_display  [1 funcs]
    collect_probe_hosts  CC=6  out:8
  redeploy.cli.commands.prompt_cmd  [1 funcs]
    prompt_cmd  CC=15  out:37
  redeploy.cli.commands.state  [4 funcs]
    _get_state_path  CC=5  out:5
    _list_checkpoints  CC=7  out:17
    _show_checkpoint  CC=4  out:11
    state_cmd  CC=4  out:16
  redeploy.cli.commands.target  [1 funcs]
    target  CC=10  out:31
  redeploy.cli.commands.version.commands  [2 funcs]
    version_list  CC=13  out:38
    version_verify  CC=7  out:18
  redeploy.cli.commands.version.helpers  [10 funcs]
    _build_package_version_manifest  CC=2  out:5
    _bump_single  CC=25  out:35
    _load_live_version_diff  CC=3  out:4
    _load_spec_version_diff  CC=8  out:13
    _print_source_drift_status  CC=7  out:6
    _print_verify_result  CC=6  out:5
    _resolve_monorepo_targets  CC=8  out:11
    _resolve_package_release_changelog_config  CC=5  out:2
    _resolve_package_release_git_config  CC=5  out:5
    _run_version_diff_for_manifest  CC=7  out:11
  redeploy.cli.commands.version.monorepo  [5 funcs]
    _create_version_set_git  CC=6  out:3
    _create_version_set_taggers  CC=2  out:2
    _finalize_monorepo_version_set  CC=11  out:8
    _print_monorepo_set_dry_run  CC=3  out:5
    _set_monorepo_version  CC=8  out:13
  redeploy.cli.commands.version.release  [5 funcs]
    _create_release_tags  CC=3  out:5
    _format_release_tag  CC=1  out:1
    _resolve_package_release_changelog_config  CC=5  out:2
    _update_monorepo_release_changelogs  CC=5  out:12
    _update_release_changelog  CC=7  out:7
  redeploy.cli.commands.version.scanner  [17 funcs]
    _classify_version_scan_source_confidence  CC=3  out:0
    _default_keep_scanned_source  CC=2  out:0
    _derive_scanned_package_name  CC=4  out:5
    _detect_source_version  CC=2  out:1
    _detect_version_sources_in_dir  CC=13  out:17
    _format_version_scan_source_status  CC=2  out:2
    _is_scannable_version_path  CC=2  out:1
    _iter_version_scan_groups  CC=4  out:1
    _print_version_scan_group  CC=3  out:4
    _print_version_scan_review  CC=6  out:5
  redeploy.cli.commands.workflow  [2 funcs]
    _execute_workflow  CC=6  out:8
    workflow_cmd  CC=10  out:21
  redeploy.cli.core  [5 funcs]
    find_manifest_path  CC=3  out:5
    load_spec_or_exit  CC=2  out:3
    load_spec_with_manifest  CC=5  out:8
    resolve_device  CC=5  out:12
    run_detect_workflow  CC=4  out:8
  redeploy.cli.display  [18 funcs]
    _format_workflow_header  CC=2  out:1
    _get_plugin_hint  CC=5  out:1
    _get_status_color  CC=3  out:0
    _print_alternatives  CC=5  out:2
    _print_host_header  CC=1  out:1
    _print_services_table  CC=9  out:14
    _print_spec_metadata  CC=4  out:6
    _print_template_match  CC=5  out:7
    _print_workflow_step  CC=4  out:4
    generate_workflow_output_css  CC=8  out:9
  redeploy.cli.query  [1 funcs]
    execute_query  CC=5  out:9
  redeploy.config_apply.applier  [3 funcs]
    _normalize_hardware  CC=4  out:2
    apply_config_dict  CC=1  out:2
    apply_config_file  CC=4  out:6
  redeploy.config_apply.handlers.display  [2 funcs]
    _validate_display_inputs  CC=3  out:4
    apply_display_transform  CC=7  out:25
  redeploy.config_apply.loader  [1 funcs]
    load_config_file  CC=3  out:4
  redeploy.detect.detector  [2 funcs]
    probe_hardware  CC=2  out:4
    run  CC=9  out:30
  redeploy.detect.hardware  [2 funcs]
    _wrap_remote_probe  CC=1  out:2
    probe_hardware  CC=4  out:10
  redeploy.detect.hardware_rules  [3 funcs]
    _hw_info_to_dict  CC=2  out:2
    _op3_diag_to_hw_diag  CC=1  out:5
    analyze  CC=3  out:4
  redeploy.detect.probes  [4 funcs]
    detect_conflicts  CC=13  out:12
    probe_iptables_dnat  CC=7  out:5
    probe_ports  CC=6  out:11
    probe_runtime  CC=5  out:16
  redeploy.detect.templates  [4 funcs]
    detect  CC=2  out:3
    _build_templates  CC=1  out:1
    _load_templates_from_yaml  CC=9  out:22
    build_context  CC=2  out:1
  redeploy.detect.workflow  [2 funcs]
    _collect_hosts  CC=18  out:14
    _probe_ssh  CC=3  out:3
  redeploy.discovery.auto_probe  [6 funcs]
    auto_probe  CC=7  out:33
    build_probe_command  CC=1  out:0
    build_ssh_command  CC=1  out:1
    detect_strategy_remote  CC=3  out:5
    parse_probe_input  CC=4  out:1
    run_ssh_probe  CC=3  out:1
  redeploy.discovery.helpers  [2 funcs]
    is_ip  CC=1  out:2
    run_shell  CC=2  out:1
  redeploy.discovery.registry  [3 funcs]
    _new_discovered_device  CC=3  out:2
    _update_existing_device  CC=7  out:1
    update_registry  CC=9  out:9
  redeploy.discovery.scanners  [8 funcs]
    detect_local_subnet  CC=9  out:11
    discover  CC=14  out:22
    merge_hosts  CC=11  out:2
    ping_sweep  CC=6  out:20
    probe_ssh_batch  CC=1  out:6
    scan_arp_cache  CC=10  out:23
    scan_known_hosts  CC=10  out:18
    scan_mdns  CC=6  out:11
  redeploy.discovery.ssh_credentials  [3 funcs]
    collect_ssh_keys  CC=14  out:16
    tcp_reachable  CC=2  out:1
    try_ssh_credentials  CC=14  out:15
  redeploy.discovery_probe  [2 funcs]
    infer_strategy  CC=8  out:5
    parse_probe_output  CC=16  out:20
  redeploy.dsl.loader  [9 funcs]
    _build_from_nodes  CC=1  out:4
    _build_manifest  CC=25  out:23
    _build_templates  CC=14  out:24
    _build_workflows  CC=8  out:16
    _condition_key  CC=4  out:5
    load_css  CC=1  out:4
    load_css_text  CC=2  out:4
    manifest_to_css  CC=14  out:17
    templates_to_css  CC=6  out:13
  redeploy.dsl.parser  [3 funcs]
    __repr__  CC=2  out:4
    parse  CC=6  out:23
    _strip_comments  CC=1  out:3
  redeploy.dsl_python.runner  [1 funcs]
    list_migrations  CC=5  out:13
  redeploy.dsl_python.steps  [2 funcs]
    ssh  CC=4  out:4
    version_check  CC=7  out:10
  redeploy.fleet  [4 funcs]
    __init__  CC=1  out:1
    from_registry  CC=6  out:5
    get  CC=3  out:1
    merge  CC=3  out:3
  redeploy.hardware.config_txt  [2 funcs]
    ensure_line  CC=14  out:20
    ensure_lines  CC=4  out:4
  redeploy.hardware.fixes  [6 funcs]
    _detect_port  CC=6  out:0
    _step  CC=1  out:1
    fix_dsi_not_enabled  CC=6  out:20
    fix_enable_i2c  CC=1  out:1
    fix_enable_spi  CC=1  out:1
    generate_fix_plan  CC=7  out:3
  redeploy.hardware.kiosk.autostart  [1 funcs]
    ensure_autostart_entry  CC=6  out:6
  redeploy.hardware.kiosk.browsers  [1 funcs]
    build_launch_cmd  CC=5  out:3
  redeploy.hardware.panels  [1 funcs]
    infer_from_hardware  CC=1  out:0
  redeploy.hardware.raspi_config  [1 funcs]
    build_raspi_config_command  CC=3  out:2
  redeploy.heal  [12 funcs]
    observe  CC=5  out:4
    _ask_and_apply_fix  CC=7  out:15
    _collect_diag_with_hint  CC=2  out:2
    _record_repair  CC=1  out:2
    _reload_migration  CC=1  out:4
    run  CC=8  out:19
    _ssh  CC=3  out:2
    apply_fix_to_spec  CC=6  out:15
    ask_llm  CC=8  out:8
    collect_diagnostics  CC=2  out:4
  redeploy.heal.hint_provider  [6 funcs]
    _extract_step_block  CC=2  out:4
    _parse_step_block  CC=6  out:4
    _ssh  CC=3  out:2
    apply_fix_to_spec  CC=16  out:30
    ask_llm  CC=12  out:22
    collect_diagnostics  CC=2  out:4
  redeploy.heal.loop_detector  [1 funcs]
    observe  CC=5  out:4
  redeploy.heal.runner  [3 funcs]
    _heal_step  CC=14  out:40
    _reload_migration  CC=1  out:4
    run  CC=10  out:24
  redeploy.iac.config_hints  [1 funcs]
    _parse_k8s_yaml  CC=26  out:38
  redeploy.iac.docker_compose  [11 funcs]
    _load_merged  CC=6  out:9
    _parse_service_depends_on  CC=4  out:6
    _parse_service_env  CC=2  out:4
    _parse_service_networks  CC=4  out:6
    _parse_service_ports  CC=5  out:6
    _parse_service_volumes  CC=4  out:3
    _resolve_image_and_build  CC=7  out:8
    _env_dict  CC=7  out:6
    _parse_port  CC=10  out:21
    _parse_volume  CC=5  out:14
  redeploy.iac.parsers.compose  [2 funcs]
    _parse_depends_on  CC=5  out:6
    _parse_service_networks  CC=2  out:2
  redeploy.integrations.op3_bridge  [3 funcs]
    snapshot_to_device_map  CC=7  out:10
    snapshot_to_hardware_info  CC=10  out:49
    snapshot_to_infra_state  CC=3  out:2
  redeploy.markpact.compiler  [6 funcs]
    _deep_merge  CC=5  out:4
    _extract_steps  CC=9  out:20
    _load_block_payload  CC=8  out:7
    _normalize_config_payload  CC=11  out:18
    compile_markpact_document  CC=2  out:4
    compile_markpact_document_to_data  CC=6  out:8
  redeploy.markpact.parser  [10 funcs]
    _check_heading  CC=5  out:5
    _handle_fence_line  CC=7  out:7
    _normalize_section_id  CC=1  out:3
    _parse_markpact_fence_info  CC=14  out:10
    extract_script_by_ref  CC=12  out:11
    extract_script_from_markdown  CC=10  out:10
    parse_markpact_file  CC=1  out:3
    parse_markpact_file_with_refs  CC=6  out:6
    parse_markpact_text  CC=7  out:8
    resolve_script_ref  CC=6  out:5
  redeploy.mcp_server  [14 funcs]
    _redeploy_bin  CC=5  out:4
    _run  CC=4  out:4
    _validate_exec_ssh_inputs  CC=5  out:3
    bump_version  CC=3  out:4
    diagnose  CC=1  out:2
    exec_ssh  CC=4  out:4
    fix_spec  CC=4  out:5
    get_workspace  CC=1  out:3
    list_specs  CC=1  out:6
    nlp_command  CC=2  out:2
  redeploy.models.manifest  [2 funcs]
    find_and_load  CC=6  out:9
    find_css  CC=4  out:4
  redeploy.models.spec  [3 funcs]
    from_file  CC=2  out:5
    to_target_config  CC=2  out:2
    _migrate_legacy_post_deploy  CC=5  out:20
  redeploy.observe  [1 funcs]
    record  CC=11  out:20
  redeploy.parse  [7 funcs]
    _apply_git_line  CC=3  out:3
    _apply_health_line  CC=2  out:1
    _apply_network_line  CC=3  out:2
    _apply_system_line  CC=8  out:10
    _parse_section_line  CC=7  out:6
    parse_container_line  CC=3  out:3
    parse_diagnostics  CC=5  out:4
  redeploy.patterns  [6 funcs]
    expand  CC=2  out:14
    expand  CC=5  out:13
    expand  CC=1  out:8
    _step  CC=1  out:1
    get_pattern  CC=1  out:1
    list_patterns  CC=1  out:2
  redeploy.plan.planner  [1 funcs]
    _plan_pattern  CC=10  out:17
  redeploy.plugins  [5 funcs]
    _ensure_builtins  CC=2  out:1
    names  CC=1  out:2
    _load_builtin_plugins  CC=6  out:7
    load_user_plugins  CC=3  out:4
    register_plugin  CC=1  out:1
  redeploy.plugins.builtin.browser_reload  [1 funcs]
    browser_reload  CC=16  out:26
  redeploy.plugins.builtin.hardware_diagnostic  [11 funcs]
    _analyze_hardware  CC=14  out:32
    _check_gpio  CC=2  out:2
    _detect_platform  CC=10  out:6
    _get_audio_devices  CC=3  out:5
    _get_cpu_info  CC=5  out:10
    _get_memory_mb  CC=3  out:5
    _get_network_interfaces  CC=5  out:6
    _get_storage_gb  CC=6  out:11
    _get_usb_devices  CC=4  out:5
    _run_command  CC=2  out:3
  redeploy.plugins.builtin.notify  [6 funcs]
    _fmt  CC=1  out:3
    _http_post  CC=5  out:10
    _notify_slack  CC=3  out:7
    _notify_webhook  CC=6  out:16
    _resolve_env  CC=1  out:1
    notify  CC=4  out:5
  redeploy.plugins.builtin.process_control  [2 funcs]
    _find_pid_on_port  CC=11  out:14
    process_control  CC=9  out:19
  redeploy.plugins.builtin.systemd_reload  [1 funcs]
    systemd_reload  CC=12  out:23
  redeploy.schema  [5 funcs]
    _discover_specs  CC=14  out:26
    _git_branch  CC=3  out:2
    _iac_info  CC=2  out:0
    _read_version  CC=3  out:4
    build_schema  CC=2  out:7
  redeploy.spec_loader  [1 funcs]
    load_migration_spec  CC=4  out:8
  redeploy.steps  [2 funcs]
    all  CC=2  out:2
    list  CC=1  out:2
  redeploy.version  [1 funcs]
    read_remote_version  CC=4  out:3
  redeploy.version.bump  [6 funcs]
    _calculate_bump  CC=8  out:10
    bump_all_packages  CC=3  out:5
    bump_package  CC=9  out:13
    bump_version  CC=6  out:9
    bump_version_with_git  CC=13  out:14
    verify_sources  CC=4  out:7
  redeploy.version.changelog  [2 funcs]
    _categorize_commits  CC=3  out:3
    get_commits_since_tag  CC=5  out:3
  redeploy.version.commits  [3 funcs]
    analyze_commits  CC=18  out:25
    format_analysis_report  CC=2  out:3
    parse_conventional  CC=4  out:6
  redeploy.version.diff  [2 funcs]
    diff_manifest_vs_live  CC=2  out:2
    diff_manifest_vs_spec  CC=4  out:7
  redeploy.version.manifest  [1 funcs]
    list_packages  CC=2  out:2
  redeploy.version.sources  [1 funcs]
    get_adapter  CC=2  out:1
  redeploy.version.transaction  [1 funcs]
    _stage_one  CC=6  out:7

EDGES:
  redeploy.schema.build_schema → redeploy.schema._read_version
  redeploy.schema.build_schema → redeploy.schema._git_branch
  redeploy.schema.build_schema → redeploy.schema._discover_specs
  redeploy.schema.build_schema → redeploy.schema._iac_info
  redeploy.observe.DeployAuditLog.record → redeploy.steps.StepLibrary.list
  redeploy.heal.collect_diagnostics → redeploy.heal._ssh
  redeploy.heal.HealLoopDetector.observe → redeploy.steps.StepLibrary.all
  redeploy.heal.HealRunner._reload_migration → redeploy.spec_loader.load_migration_spec
  redeploy.heal.HealRunner._collect_diag_with_hint → redeploy.heal.collect_diagnostics
  redeploy.heal.HealRunner._ask_and_apply_fix → redeploy.heal.ask_llm
  redeploy.heal.HealRunner._ask_and_apply_fix → redeploy.heal.apply_fix_to_spec
  redeploy.heal.HealRunner._record_repair → redeploy.heal.write_repair_log
  redeploy.heal.HealRunner.run → redeploy.heal.write_repair_log
  redeploy.heal.HealRunner.run → redeploy.heal.parse_failed_step
  redeploy.parse.parse_diagnostics → redeploy.parse._parse_section_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_system_line
  redeploy.parse._parse_section_line → redeploy.parse.parse_container_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_git_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_health_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_network_line
  redeploy.fleet.Fleet.__init__ → redeploy.steps.StepLibrary.list
  redeploy.fleet.Fleet.from_registry → redeploy.steps.StepLibrary.list
  redeploy.fleet.Fleet.merge → redeploy.steps.StepLibrary.list
  redeploy.spec_loader.load_migration_spec → redeploy.markpact.compiler.compile_markpact_document
  redeploy.spec_loader.load_migration_spec → redeploy.markpact.parser.parse_markpact_file
  redeploy.patterns.BlueGreenPattern.expand → redeploy.patterns._step
  redeploy.patterns.CanaryPattern.expand → redeploy.patterns._step
  redeploy.patterns.RollbackOnFailurePattern.expand → redeploy.patterns._step
  redeploy.patterns.list_patterns → redeploy.steps.StepLibrary.list
  redeploy.mcp_server._run → redeploy.mcp_server._redeploy_bin
  redeploy.mcp_server.schema → redeploy.schema.build_schema
  redeploy.mcp_server.plan_spec → redeploy.mcp_server._run
  redeploy.mcp_server.run_spec → redeploy.mcp_server._run
  redeploy.mcp_server.fix_spec → redeploy.mcp_server._run
  redeploy.mcp_server.bump_version → redeploy.mcp_server._run
  redeploy.mcp_server.diagnose → redeploy.mcp_server._run
  redeploy.mcp_server.list_specs → redeploy.schema.build_schema
  redeploy.mcp_server.exec_ssh → redeploy.mcp_server._validate_exec_ssh_inputs
  redeploy.mcp_server.nlp_command → redeploy.mcp_server._run
  redeploy.mcp_server.get_workspace → redeploy.schema.build_schema
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_runtime
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_ports
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_iptables_dnat
  redeploy.detect.hardware.probe_hardware → redeploy.detect.hardware._wrap_remote_probe
  redeploy.detect.hardware.probe_hardware → redeploy.integrations.op3_bridge.snapshot_to_hardware_info
  redeploy.detect.hardware.probe_hardware → redeploy.steps.StepLibrary.list
  redeploy.detect.hardware_rules.analyze → redeploy.detect.hardware_rules._hw_info_to_dict
  redeploy.detect.hardware_rules.analyze → redeploy.detect.hardware_rules._op3_diag_to_hw_diag
  redeploy.detect.templates._build_templates → redeploy.detect.templates._load_templates_from_yaml
  redeploy.detect.templates.TemplateEngine.detect → redeploy.detect.templates.build_context

Test Contracts

Scenarios as contract signatures — what the system guarantees.

Cli (1)

CLI Command Tests

Integration (1)

Auto-generated from Python Tests

Refactoring Analysis

Pre-refactoring snapshot — use this section to identify targets. Generated from project/ toon files.

Call Graph & Complexity (project/calls.toon.yaml)

# code2llm call graph | /home/tom/github/maskservice/redeploy
# generated in 0.22s
# nodes: 438 | edges: 406 | modules: 118
# CC̄=5.0

HUBS[20]:
  redeploy.steps.StepLibrary.list
    CC=1  in:51  out:2  total:53
  redeploy.integrations.op3_bridge.snapshot_to_hardware_info
    CC=10  in:2  out:49  total:51
  redeploy.cli.commands.gh_workflow.gh_workflow_run
    CC=19  in:0  out:49  total:49
  redeploy.cli.commands.lint.lint
    CC=19  in:0  out:44  total:44
  redeploy.heal.runner.HealRunner._heal_step
    CC=14  in:0  out:40  total:40
  redeploy.cli.commands.exec_.exec_cmd
    CC=9  in:0  out:40  total:40
  redeploy.cli.commands.version.helpers._bump_single
    CC=25  in:4  out:35  total:39
  redeploy.cli.commands.version.commands.version_list
    CC=13  in:0  out:38  total:38
  redeploy.iac.config_hints.ConfigHintsParser._parse_k8s_yaml
    CC=26  in:0  out:38  total:38
  redeploy.cli.commands.plugin.plugin_cmd
    CC=13  in:0  out:38  total:38
  redeploy.cli.commands.prompt_cmd.prompt_cmd
    CC=15  in:0  out:37  total:37
  redeploy.discovery.auto_probe.auto_probe
    CC=7  in:4  out:33  total:37
  redeploy.blueprint.sources.compose._merge_compose
    CC=21  in:1  out:33  total:34
  redeploy.plugins.builtin.hardware_diagnostic._analyze_hardware
    CC=14  in:1  out:32  total:33
  redeploy.cli.commands.target.target
    CC=10  in:1  out:31  total:32
  redeploy.heal.hint_provider.apply_fix_to_spec
    CC=16  in:0  out:30  total:30
  redeploy.detect.detector.Detector.run
    CC=9  in:0  out:30  total:30
  examples.redeploy_iac_parsers.helm_kustomize.HelmTemplatesParser.parse
    CC=17  in:0  out:27  total:27
  redeploy.apply.executor.Executor._execute_step
    CC=4  in:0  out:27  total:27
  redeploy.apply.state_apply.HardwareStateHandler.apply
    CC=18  in:0  out:27  total:27

MODULES:
  examples.redeploy_iac_parsers.gitops_ci  [2 funcs]
    can_parse  CC=11  out:9
    _is_gitops_command  CC=2  out:2
  examples.redeploy_iac_parsers.helm_kustomize  [1 funcs]
    parse  CC=17  out:27
  redeploy.analyze.checkers.binary  [2 funcs]
    check  CC=7  out:8
    extract_binaries  CC=14  out:8
  redeploy.analyze.checkers.command_ref  [1 funcs]
    _check_external_ref  CC=6  out:8
  redeploy.analyze.checkers.compose  [6 funcs]
    check  CC=7  out:7
    _check_build_section  CC=7  out:12
    _check_env_files  CC=6  out:8
    _check_volumes  CC=11  out:12
    _is_ignored  CC=2  out:4
    scan_compose_file  CC=6  out:9
  redeploy.analyze.checkers.docker_build  [6 funcs]
    _check_remote_context  CC=12  out:12
    check  CC=4  out:8
    collect_sync_mappings  CC=5  out:10
    match_local_src  CC=5  out:3
    parse_docker_build  CC=9  out:7
    resolve_local_dockerfile  CC=3  out:6
  redeploy.analyze.checkers.path  [4 funcs]
    check  CC=9  out:13
    _check_field  CC=9  out:15
    is_inside  CC=2  out:3
    resolve_local_path  CC=3  out:6
  redeploy.analyze.ignore  [2 funcs]
    is_ignored  CC=9  out:10
    ensure_redeployignore  CC=2  out:2
  redeploy.analyze.models  [1 funcs]
    add  CC=2  out:2
  redeploy.analyze.preflight_schema  [6 funcs]
    _collect_local_artifacts  CC=6  out:16
    _collect_remote_checks  CC=8  out:14
    _resolve_command_refs  CC=11  out:20
    _resolve_local_path  CC=4  out:7
    generate_preflight_schema  CC=14  out:25
    save_preflight_schema  CC=1  out:3
  redeploy.analyze.spec_analyzer  [2 funcs]
    __init__  CC=3  out:2
    analyze_file  CC=7  out:10
  redeploy.apply.executor  [3 funcs]
    __init__  CC=14  out:8
    _execute_step  CC=4  out:27
    _rollback  CC=1  out:1
  redeploy.apply.handlers  [15 funcs]
    _all_containers_healthy  CC=5  out:2
    _ensure_remote_parent_dir  CC=7  out:6
    _format_step_output  CC=6  out:7
    _parse_container_statuses  CC=6  out:8
    _resolve_command_ref  CC=6  out:10
    run_docker_build  CC=1  out:1
    run_docker_health_wait  CC=10  out:11
    run_ensure_autostart_entry  CC=16  out:21
    run_ensure_config_line  CC=7  out:9
    run_inline_script  CC=6  out:7
  redeploy.apply.rollback  [1 funcs]
    rollback_steps  CC=8  out:8
  redeploy.apply.state  [6 funcs]
    reset  CC=1  out:2
    save  CC=5  out:11
    _now_iso  CC=1  out:2
    _slug  CC=5  out:3
    default_state_path  CC=2  out:2
    state_key  CC=1  out:7
  redeploy.apply.state_apply  [4 funcs]
    apply  CC=18  out:27
    _update_kanshi  CC=9  out:17
    apply_state  CC=2  out:4
    detect_handler  CC=3  out:1
  redeploy.apply.utils.run_container_build  [1 funcs]
    run_container_build  CC=10  out:21
  redeploy.audit  [1 funcs]
    audit_spec  CC=1  out:3
  redeploy.audit.extractor  [1 funcs]
    _from_target  CC=7  out:9
  redeploy.audit.paths  [2 funcs]
    extract_port  CC=5  out:6
    normalize_path  CC=3  out:5
  redeploy.blueprint.extractor  [1 funcs]
    extract_blueprint  CC=22  out:23
  redeploy.blueprint.generators.docker_compose  [2 funcs]
    _build_service  CC=20  out:8
    generate_twin  CC=11  out:3
  redeploy.blueprint.sources.compose  [6 funcs]
    _merge_compose  CC=21  out:33
    _parse_compose_env  CC=7  out:8
    _parse_compose_healthcheck  CC=6  out:6
    _parse_compose_ports  CC=7  out:21
    _parse_compose_volumes  CC=8  out:13
    merge_compose_files  CC=2  out:1
  redeploy.blueprint.sources.hardware  [1 funcs]
    build_hw_requirements  CC=13  out:15
  redeploy.blueprint.sources.infra  [1 funcs]
    infer_app_url  CC=8  out:1
  redeploy.cli  [3 funcs]
    _resolve_device  CC=5  out:12
    _setup_logging  CC=2  out:2
    cli  CC=1  out:5
  redeploy.cli.commands.blueprint  [2 funcs]
    _execute_query_blueprint  CC=1  out:1
    show  CC=4  out:18
  redeploy.cli.commands.bump_fix  [9 funcs]
    _bump_patch  CC=2  out:7
    _bump_version_file  CC=1  out:5
    _detect_version  CC=2  out:3
    _find_spec  CC=15  out:22
    _find_version_file  CC=3  out:2
    _prompt_choose_spec  CC=5  out:9
    _update_migration_header  CC=2  out:7
    _update_quadlet_service_version  CC=6  out:9
    bump_cmd  CC=6  out:23
  redeploy.cli.commands.device_map_actions  [2 funcs]
    execute_query_device_map  CC=1  out:1
    probe_device_map  CC=9  out:15
  redeploy.cli.commands.device_map_renderers  [5 funcs]
    _build_drm_table  CC=9  out:8
    _build_header_panel  CC=4  out:3
    _build_issues_table  CC=3  out:12
    _build_services_table  CC=7  out:9
    render_rich  CC=22  out:22
  redeploy.cli.commands.devices  [1 funcs]
    devices  CC=4  out:14
  redeploy.cli.commands.devices_display  [2 funcs]
    filter_devices  CC=13  out:0
    render_devices_table  CC=7  out:16
  redeploy.cli.commands.diagnose  [1 funcs]
    diagnose  CC=5  out:19
  redeploy.cli.commands.exec_  [3 funcs]
    _extract_all_scripts  CC=3  out:7
    _extract_script_for_ref  CC=2  out:1
    exec_cmd  CC=9  out:40
  redeploy.cli.commands.export  [4 funcs]
    _export_to_css  CC=2  out:2
    _find_export_source  CC=9  out:10
    _load_manifest_from_css  CC=1  out:1
    export_cmd  CC=7  out:23
  redeploy.cli.commands.gh_workflow  [12 funcs]
    _collect_workflow_meta  CC=3  out:10
    _find_repo_root  CC=4  out:3
    _has_workflow_dispatch  CC=4  out:3
    _load_yaml  CC=4  out:5
    _on_section  CC=1  out:2
    _resolve_repo_root  CC=3  out:5
    _resolve_workflow_identifier  CC=10  out:11
    _trigger_list  CC=6  out:6
    _workflows_dir  CC=2  out:2
    gh_workflow_analyze  CC=7  out:20
  redeploy.cli.commands.hardware  [4 funcs]
    _apply_fix  CC=8  out:18
    _apply_transform  CC=4  out:4
    _execute_query  CC=1  out:2
    _probe_hardware  CC=4  out:6
  redeploy.cli.commands.import_  [4 funcs]
    _copy_plugin_template  CC=3  out:12
    _examples_plugin_dir  CC=1  out:2
    _plugin_templates  CC=1  out:0
    _print_plugin_templates  CC=2  out:4
  redeploy.cli.commands.inspect  [2 funcs]
    _find_css_path  CC=4  out:4
    inspect  CC=4  out:22
  redeploy.cli.commands.lint  [1 funcs]
    lint  CC=19  out:44
  redeploy.cli.commands.mcp_cmd  [1 funcs]
    mcp_cmd  CC=1  out:6
  redeploy.cli.commands.plan_apply_report  [10 funcs]
    _parse_rsync_output  CC=13  out:8
    _render_checksum_section  CC=7  out:13
    _run_rsync_checksum  CC=6  out:10
    _skipped_checksum  CC=1  out:1
    build_checksum_verification  CC=14  out:15
    default_report_path  CC=1  out:0
    render_markdown_report  CC=12  out:13
    resolve_audit_entry  CC=10  out:16
    step_command_block  CC=14  out:5
    write_markdown_report  CC=2  out:7
  redeploy.cli.commands.plan_apply_run  [1 funcs]
    run_preflight_phase  CC=8  out:19
  redeploy.cli.commands.plan_apply_shared  [2 funcs]
    apply_manifest_to_spec  CC=8  out:9
    load_spec_for_run  CC=4  out:6
  redeploy.cli.commands.plugin  [1 funcs]
    plugin_cmd  CC=13  out:38
  redeploy.cli.commands.probe_display  [1 funcs]
    collect_probe_hosts  CC=6  out:8
  redeploy.cli.commands.prompt_cmd  [1 funcs]
    prompt_cmd  CC=15  out:37
  redeploy.cli.commands.state  [4 funcs]
    _get_state_path  CC=5  out:5
    _list_checkpoints  CC=7  out:17
    _show_checkpoint  CC=4  out:11
    state_cmd  CC=4  out:16
  redeploy.cli.commands.target  [1 funcs]
    target  CC=10  out:31
  redeploy.cli.commands.version.commands  [2 funcs]
    version_list  CC=13  out:38
    version_verify  CC=7  out:18
  redeploy.cli.commands.version.helpers  [10 funcs]
    _build_package_version_manifest  CC=2  out:5
    _bump_single  CC=25  out:35
    _load_live_version_diff  CC=3  out:4
    _load_spec_version_diff  CC=8  out:13
    _print_source_drift_status  CC=7  out:6
    _print_verify_result  CC=6  out:5
    _resolve_monorepo_targets  CC=8  out:11
    _resolve_package_release_changelog_config  CC=5  out:2
    _resolve_package_release_git_config  CC=5  out:5
    _run_version_diff_for_manifest  CC=7  out:11
  redeploy.cli.commands.version.monorepo  [5 funcs]
    _create_version_set_git  CC=6  out:3
    _create_version_set_taggers  CC=2  out:2
    _finalize_monorepo_version_set  CC=11  out:8
    _print_monorepo_set_dry_run  CC=3  out:5
    _set_monorepo_version  CC=8  out:13
  redeploy.cli.commands.version.release  [5 funcs]
    _create_release_tags  CC=3  out:5
    _format_release_tag  CC=1  out:1
    _resolve_package_release_changelog_config  CC=5  out:2
    _update_monorepo_release_changelogs  CC=5  out:12
    _update_release_changelog  CC=7  out:7
  redeploy.cli.commands.version.scanner  [17 funcs]
    _classify_version_scan_source_confidence  CC=3  out:0
    _default_keep_scanned_source  CC=2  out:0
    _derive_scanned_package_name  CC=4  out:5
    _detect_source_version  CC=2  out:1
    _detect_version_sources_in_dir  CC=13  out:17
    _format_version_scan_source_status  CC=2  out:2
    _is_scannable_version_path  CC=2  out:1
    _iter_version_scan_groups  CC=4  out:1
    _print_version_scan_group  CC=3  out:4
    _print_version_scan_review  CC=6  out:5
  redeploy.cli.commands.workflow  [2 funcs]
    _execute_workflow  CC=6  out:8
    workflow_cmd  CC=10  out:21
  redeploy.cli.core  [5 funcs]
    find_manifest_path  CC=3  out:5
    load_spec_or_exit  CC=2  out:3
    load_spec_with_manifest  CC=5  out:8
    resolve_device  CC=5  out:12
    run_detect_workflow  CC=4  out:8
  redeploy.cli.display  [18 funcs]
    _format_workflow_header  CC=2  out:1
    _get_plugin_hint  CC=5  out:1
    _get_status_color  CC=3  out:0
    _print_alternatives  CC=5  out:2
    _print_host_header  CC=1  out:1
    _print_services_table  CC=9  out:14
    _print_spec_metadata  CC=4  out:6
    _print_template_match  CC=5  out:7
    _print_workflow_step  CC=4  out:4
    generate_workflow_output_css  CC=8  out:9
  redeploy.cli.query  [1 funcs]
    execute_query  CC=5  out:9
  redeploy.config_apply.applier  [3 funcs]
    _normalize_hardware  CC=4  out:2
    apply_config_dict  CC=1  out:2
    apply_config_file  CC=4  out:6
  redeploy.config_apply.handlers.display  [2 funcs]
    _validate_display_inputs  CC=3  out:4
    apply_display_transform  CC=7  out:25
  redeploy.config_apply.loader  [1 funcs]
    load_config_file  CC=3  out:4
  redeploy.detect.detector  [2 funcs]
    probe_hardware  CC=2  out:4
    run  CC=9  out:30
  redeploy.detect.hardware  [2 funcs]
    _wrap_remote_probe  CC=1  out:2
    probe_hardware  CC=4  out:10
  redeploy.detect.hardware_rules  [3 funcs]
    _hw_info_to_dict  CC=2  out:2
    _op3_diag_to_hw_diag  CC=1  out:5
    analyze  CC=3  out:4
  redeploy.detect.probes  [4 funcs]
    detect_conflicts  CC=13  out:12
    probe_iptables_dnat  CC=7  out:5
    probe_ports  CC=6  out:11
    probe_runtime  CC=5  out:16
  redeploy.detect.templates  [4 funcs]
    detect  CC=2  out:3
    _build_templates  CC=1  out:1
    _load_templates_from_yaml  CC=9  out:22
    build_context  CC=2  out:1
  redeploy.detect.workflow  [2 funcs]
    _collect_hosts  CC=18  out:14
    _probe_ssh  CC=3  out:3
  redeploy.discovery.auto_probe  [6 funcs]
    auto_probe  CC=7  out:33
    build_probe_command  CC=1  out:0
    build_ssh_command  CC=1  out:1
    detect_strategy_remote  CC=3  out:5
    parse_probe_input  CC=4  out:1
    run_ssh_probe  CC=3  out:1
  redeploy.discovery.helpers  [2 funcs]
    is_ip  CC=1  out:2
    run_shell  CC=2  out:1
  redeploy.discovery.registry  [3 funcs]
    _new_discovered_device  CC=3  out:2
    _update_existing_device  CC=7  out:1
    update_registry  CC=9  out:9
  redeploy.discovery.scanners  [8 funcs]
    detect_local_subnet  CC=9  out:11
    discover  CC=14  out:22
    merge_hosts  CC=11  out:2
    ping_sweep  CC=6  out:20
    probe_ssh_batch  CC=1  out:6
    scan_arp_cache  CC=10  out:23
    scan_known_hosts  CC=10  out:18
    scan_mdns  CC=6  out:11
  redeploy.discovery.ssh_credentials  [3 funcs]
    collect_ssh_keys  CC=14  out:16
    tcp_reachable  CC=2  out:1
    try_ssh_credentials  CC=14  out:15
  redeploy.discovery_probe  [2 funcs]
    infer_strategy  CC=8  out:5
    parse_probe_output  CC=16  out:20
  redeploy.dsl.loader  [9 funcs]
    _build_from_nodes  CC=1  out:4
    _build_manifest  CC=25  out:23
    _build_templates  CC=14  out:24
    _build_workflows  CC=8  out:16
    _condition_key  CC=4  out:5
    load_css  CC=1  out:4
    load_css_text  CC=2  out:4
    manifest_to_css  CC=14  out:17
    templates_to_css  CC=6  out:13
  redeploy.dsl.parser  [3 funcs]
    __repr__  CC=2  out:4
    parse  CC=6  out:23
    _strip_comments  CC=1  out:3
  redeploy.dsl_python.runner  [1 funcs]
    list_migrations  CC=5  out:13
  redeploy.dsl_python.steps  [2 funcs]
    ssh  CC=4  out:4
    version_check  CC=7  out:10
  redeploy.fleet  [4 funcs]
    __init__  CC=1  out:1
    from_registry  CC=6  out:5
    get  CC=3  out:1
    merge  CC=3  out:3
  redeploy.hardware.config_txt  [2 funcs]
    ensure_line  CC=14  out:20
    ensure_lines  CC=4  out:4
  redeploy.hardware.fixes  [6 funcs]
    _detect_port  CC=6  out:0
    _step  CC=1  out:1
    fix_dsi_not_enabled  CC=6  out:20
    fix_enable_i2c  CC=1  out:1
    fix_enable_spi  CC=1  out:1
    generate_fix_plan  CC=7  out:3
  redeploy.hardware.kiosk.autostart  [1 funcs]
    ensure_autostart_entry  CC=6  out:6
  redeploy.hardware.kiosk.browsers  [1 funcs]
    build_launch_cmd  CC=5  out:3
  redeploy.hardware.panels  [1 funcs]
    infer_from_hardware  CC=1  out:0
  redeploy.hardware.raspi_config  [1 funcs]
    build_raspi_config_command  CC=3  out:2
  redeploy.heal  [12 funcs]
    observe  CC=5  out:4
    _ask_and_apply_fix  CC=7  out:15
    _collect_diag_with_hint  CC=2  out:2
    _record_repair  CC=1  out:2
    _reload_migration  CC=1  out:4
    run  CC=8  out:19
    _ssh  CC=3  out:2
    apply_fix_to_spec  CC=6  out:15
    ask_llm  CC=8  out:8
    collect_diagnostics  CC=2  out:4
  redeploy.heal.hint_provider  [6 funcs]
    _extract_step_block  CC=2  out:4
    _parse_step_block  CC=6  out:4
    _ssh  CC=3  out:2
    apply_fix_to_spec  CC=16  out:30
    ask_llm  CC=12  out:22
    collect_diagnostics  CC=2  out:4
  redeploy.heal.loop_detector  [1 funcs]
    observe  CC=5  out:4
  redeploy.heal.runner  [3 funcs]
    _heal_step  CC=14  out:40
    _reload_migration  CC=1  out:4
    run  CC=10  out:24
  redeploy.iac.config_hints  [1 funcs]
    _parse_k8s_yaml  CC=26  out:38
  redeploy.iac.docker_compose  [11 funcs]
    _load_merged  CC=6  out:9
    _parse_service_depends_on  CC=4  out:6
    _parse_service_env  CC=2  out:4
    _parse_service_networks  CC=4  out:6
    _parse_service_ports  CC=5  out:6
    _parse_service_volumes  CC=4  out:3
    _resolve_image_and_build  CC=7  out:8
    _env_dict  CC=7  out:6
    _parse_port  CC=10  out:21
    _parse_volume  CC=5  out:14
  redeploy.iac.parsers.compose  [2 funcs]
    _parse_depends_on  CC=5  out:6
    _parse_service_networks  CC=2  out:2
  redeploy.integrations.op3_bridge  [3 funcs]
    snapshot_to_device_map  CC=7  out:10
    snapshot_to_hardware_info  CC=10  out:49
    snapshot_to_infra_state  CC=3  out:2
  redeploy.markpact.compiler  [6 funcs]
    _deep_merge  CC=5  out:4
    _extract_steps  CC=9  out:20
    _load_block_payload  CC=8  out:7
    _normalize_config_payload  CC=11  out:18
    compile_markpact_document  CC=2  out:4
    compile_markpact_document_to_data  CC=6  out:8
  redeploy.markpact.parser  [10 funcs]
    _check_heading  CC=5  out:5
    _handle_fence_line  CC=7  out:7
    _normalize_section_id  CC=1  out:3
    _parse_markpact_fence_info  CC=14  out:10
    extract_script_by_ref  CC=12  out:11
    extract_script_from_markdown  CC=10  out:10
    parse_markpact_file  CC=1  out:3
    parse_markpact_file_with_refs  CC=6  out:6
    parse_markpact_text  CC=7  out:8
    resolve_script_ref  CC=6  out:5
  redeploy.mcp_server  [14 funcs]
    _redeploy_bin  CC=5  out:4
    _run  CC=4  out:4
    _validate_exec_ssh_inputs  CC=5  out:3
    bump_version  CC=3  out:4
    diagnose  CC=1  out:2
    exec_ssh  CC=4  out:4
    fix_spec  CC=4  out:5
    get_workspace  CC=1  out:3
    list_specs  CC=1  out:6
    nlp_command  CC=2  out:2
  redeploy.models.manifest  [2 funcs]
    find_and_load  CC=6  out:9
    find_css  CC=4  out:4
  redeploy.models.spec  [3 funcs]
    from_file  CC=2  out:5
    to_target_config  CC=2  out:2
    _migrate_legacy_post_deploy  CC=5  out:20
  redeploy.observe  [1 funcs]
    record  CC=11  out:20
  redeploy.parse  [7 funcs]
    _apply_git_line  CC=3  out:3
    _apply_health_line  CC=2  out:1
    _apply_network_line  CC=3  out:2
    _apply_system_line  CC=8  out:10
    _parse_section_line  CC=7  out:6
    parse_container_line  CC=3  out:3
    parse_diagnostics  CC=5  out:4
  redeploy.patterns  [6 funcs]
    expand  CC=2  out:14
    expand  CC=5  out:13
    expand  CC=1  out:8
    _step  CC=1  out:1
    get_pattern  CC=1  out:1
    list_patterns  CC=1  out:2
  redeploy.plan.planner  [1 funcs]
    _plan_pattern  CC=10  out:17
  redeploy.plugins  [5 funcs]
    _ensure_builtins  CC=2  out:1
    names  CC=1  out:2
    _load_builtin_plugins  CC=6  out:7
    load_user_plugins  CC=3  out:4
    register_plugin  CC=1  out:1
  redeploy.plugins.builtin.browser_reload  [1 funcs]
    browser_reload  CC=16  out:26
  redeploy.plugins.builtin.hardware_diagnostic  [11 funcs]
    _analyze_hardware  CC=14  out:32
    _check_gpio  CC=2  out:2
    _detect_platform  CC=10  out:6
    _get_audio_devices  CC=3  out:5
    _get_cpu_info  CC=5  out:10
    _get_memory_mb  CC=3  out:5
    _get_network_interfaces  CC=5  out:6
    _get_storage_gb  CC=6  out:11
    _get_usb_devices  CC=4  out:5
    _run_command  CC=2  out:3
  redeploy.plugins.builtin.notify  [6 funcs]
    _fmt  CC=1  out:3
    _http_post  CC=5  out:10
    _notify_slack  CC=3  out:7
    _notify_webhook  CC=6  out:16
    _resolve_env  CC=1  out:1
    notify  CC=4  out:5
  redeploy.plugins.builtin.process_control  [2 funcs]
    _find_pid_on_port  CC=11  out:14
    process_control  CC=9  out:19
  redeploy.plugins.builtin.systemd_reload  [1 funcs]
    systemd_reload  CC=12  out:23
  redeploy.schema  [5 funcs]
    _discover_specs  CC=14  out:26
    _git_branch  CC=3  out:2
    _iac_info  CC=2  out:0
    _read_version  CC=3  out:4
    build_schema  CC=2  out:7
  redeploy.spec_loader  [1 funcs]
    load_migration_spec  CC=4  out:8
  redeploy.steps  [2 funcs]
    all  CC=2  out:2
    list  CC=1  out:2
  redeploy.version  [1 funcs]
    read_remote_version  CC=4  out:3
  redeploy.version.bump  [6 funcs]
    _calculate_bump  CC=8  out:10
    bump_all_packages  CC=3  out:5
    bump_package  CC=9  out:13
    bump_version  CC=6  out:9
    bump_version_with_git  CC=13  out:14
    verify_sources  CC=4  out:7
  redeploy.version.changelog  [2 funcs]
    _categorize_commits  CC=3  out:3
    get_commits_since_tag  CC=5  out:3
  redeploy.version.commits  [3 funcs]
    analyze_commits  CC=18  out:25
    format_analysis_report  CC=2  out:3
    parse_conventional  CC=4  out:6
  redeploy.version.diff  [2 funcs]
    diff_manifest_vs_live  CC=2  out:2
    diff_manifest_vs_spec  CC=4  out:7
  redeploy.version.manifest  [1 funcs]
    list_packages  CC=2  out:2
  redeploy.version.sources  [1 funcs]
    get_adapter  CC=2  out:1
  redeploy.version.transaction  [1 funcs]
    _stage_one  CC=6  out:7

EDGES:
  redeploy.schema.build_schema → redeploy.schema._read_version
  redeploy.schema.build_schema → redeploy.schema._git_branch
  redeploy.schema.build_schema → redeploy.schema._discover_specs
  redeploy.schema.build_schema → redeploy.schema._iac_info
  redeploy.observe.DeployAuditLog.record → redeploy.steps.StepLibrary.list
  redeploy.heal.collect_diagnostics → redeploy.heal._ssh
  redeploy.heal.HealLoopDetector.observe → redeploy.steps.StepLibrary.all
  redeploy.heal.HealRunner._reload_migration → redeploy.spec_loader.load_migration_spec
  redeploy.heal.HealRunner._collect_diag_with_hint → redeploy.heal.collect_diagnostics
  redeploy.heal.HealRunner._ask_and_apply_fix → redeploy.heal.ask_llm
  redeploy.heal.HealRunner._ask_and_apply_fix → redeploy.heal.apply_fix_to_spec
  redeploy.heal.HealRunner._record_repair → redeploy.heal.write_repair_log
  redeploy.heal.HealRunner.run → redeploy.heal.write_repair_log
  redeploy.heal.HealRunner.run → redeploy.heal.parse_failed_step
  redeploy.parse.parse_diagnostics → redeploy.parse._parse_section_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_system_line
  redeploy.parse._parse_section_line → redeploy.parse.parse_container_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_git_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_health_line
  redeploy.parse._parse_section_line → redeploy.parse._apply_network_line
  redeploy.fleet.Fleet.__init__ → redeploy.steps.StepLibrary.list
  redeploy.fleet.Fleet.from_registry → redeploy.steps.StepLibrary.list
  redeploy.fleet.Fleet.merge → redeploy.steps.StepLibrary.list
  redeploy.spec_loader.load_migration_spec → redeploy.markpact.compiler.compile_markpact_document
  redeploy.spec_loader.load_migration_spec → redeploy.markpact.parser.parse_markpact_file
  redeploy.patterns.BlueGreenPattern.expand → redeploy.patterns._step
  redeploy.patterns.CanaryPattern.expand → redeploy.patterns._step
  redeploy.patterns.RollbackOnFailurePattern.expand → redeploy.patterns._step
  redeploy.patterns.list_patterns → redeploy.steps.StepLibrary.list
  redeploy.mcp_server._run → redeploy.mcp_server._redeploy_bin
  redeploy.mcp_server.schema → redeploy.schema.build_schema
  redeploy.mcp_server.plan_spec → redeploy.mcp_server._run
  redeploy.mcp_server.run_spec → redeploy.mcp_server._run
  redeploy.mcp_server.fix_spec → redeploy.mcp_server._run
  redeploy.mcp_server.bump_version → redeploy.mcp_server._run
  redeploy.mcp_server.diagnose → redeploy.mcp_server._run
  redeploy.mcp_server.list_specs → redeploy.schema.build_schema
  redeploy.mcp_server.exec_ssh → redeploy.mcp_server._validate_exec_ssh_inputs
  redeploy.mcp_server.nlp_command → redeploy.mcp_server._run
  redeploy.mcp_server.get_workspace → redeploy.schema.build_schema
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_runtime
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_ports
  redeploy.detect.detector.Detector.run → redeploy.detect.probes.probe_iptables_dnat
  redeploy.detect.hardware.probe_hardware → redeploy.detect.hardware._wrap_remote_probe
  redeploy.detect.hardware.probe_hardware → redeploy.integrations.op3_bridge.snapshot_to_hardware_info
  redeploy.detect.hardware.probe_hardware → redeploy.steps.StepLibrary.list
  redeploy.detect.hardware_rules.analyze → redeploy.detect.hardware_rules._hw_info_to_dict
  redeploy.detect.hardware_rules.analyze → redeploy.detect.hardware_rules._op3_diag_to_hw_diag
  redeploy.detect.templates._build_templates → redeploy.detect.templates._load_templates_from_yaml
  redeploy.detect.templates.TemplateEngine.detect → redeploy.detect.templates.build_context

Code Analysis (project/analysis.toon.yaml)

# code2llm | 310f 40584L | python:220,md:44,yaml:37,yml:3,shell:2,json:1,toml:1 | 2026-05-20
# generated in 0.07s
# CC̄=5.0 | critical:37/985 | dups:0 | cycles:0

HEALTH[20]:
  🟡 CC    verify_expectations CC=25 (limit:15)
  🟡 CC    _collect_hosts CC=18 (limit:15)
  🟡 CC    apply_fix_to_spec CC=16 (limit:15)
  🟡 CC    parse_probe_output CC=16 (limit:15)
  🟡 CC    apply_to_spec CC=20 (limit:15)
  🟡 CC    render_rich CC=22 (limit:15)
  🟡 CC    _find_spec CC=15 (limit:15)
  🟡 CC    fix_cmd CC=17 (limit:15)
  🟡 CC    _print_blueprint CC=20 (limit:15)
  🟡 CC    import_cmd CC=21 (limit:15)
  🟡 CC    _print_import_spec CC=15 (limit:15)
  🟡 CC    _spec_to_migration_yaml CC=22 (limit:15)
  🟡 CC    gh_workflow_run CC=19 (limit:15)
  🟡 CC    lint CC=19 (limit:15)
  🟡 CC    prompt_cmd CC=15 (limit:15)
  🟡 CC    push CC=15 (limit:15)
  🟡 CC    audit CC=18 (limit:15)
  🟡 CC    version_init CC=26 (limit:15)
  🟡 CC    _bump_single CC=25 (limit:15)
  🟡 CC    browser_reload CC=16 (limit:15)

REFACTOR[1]:
  1. split 20 high-CC methods  (CC>15)

PIPELINES[518]:
  [1] Src [to_dict]: to_dict
      PURITY: 100% pure
  [2] Src [record]: record → list
      PURITY: 100% pure
  [3] Src [_append]: _append
      PURITY: 100% pure
  [4] Src [load]: load
      PURITY: 100% pure
  [5] Src [tail]: tail
      PURITY: 100% pure

LAYERS:
  examples/                       CC̄=8.7    ←in:0  →out:0
  │ migration.md               312L  0C    0m  CC=0.0    ←0
  │ migration.md               255L  0C    0m  CC=0.0    ←0
  │ rpi5-waveshare-kiosk.md    196L  0C    0m  CC=0.0    ←0
  │ migration.md               145L  0C    0m  CC=0.0    ←0
  │ migration.md               138L  0C    0m  CC=0.0    ←0
  │ !! gitops_ci                  137L  2C    5m  CC=16     ←0
  │ argocd_flux                129L  2C    4m  CC=13     ←0
  │ fleet.yaml                 128L  0C    0m  CC=0.0    ←0
  │ !! helm_kustomize             113L  2C    5m  CC=17     ←0
  │ helm_ansible                94L  2C    4m  CC=11     ←0
  │ migration-rpi5.yaml         85L  0C    0m  CC=0.0    ←0
  │ README.md                   81L  0C    0m  CC=0.0    ←0
  │ migration.yaml              72L  0C    0m  CC=0.0    ←0
  │ README.md                   67L  0C    0m  CC=0.0    ←0
  │ waveshare-8-inch-dsi.md     64L  0C    0m  CC=0.0    ←0
  │ README.md                   63L  0C    0m  CC=0.0    ←0
  │ fleet.yaml                  62L  0C    0m  CC=0.0    ←0
  │ migration.yaml              62L  0C    0m  CC=0.0    ←0
  │ README.md                   62L  0C    0m  CC=0.0    ←0
  │ migration.yaml              61L  0C    0m  CC=0.0    ←0
  │ official-dsi-7-inch.md      58L  0C    0m  CC=0.0    ←0
  │ README.md                   55L  0C    0m  CC=0.0    ←0
  │ migration.yaml              52L  0C    0m  CC=0.0    ←0
  │ migration.yaml              52L  0C    0m  CC=0.0    ←0
  │ migration.md                51L  0C    0m  CC=0.0    ←0
  │ README.md                   49L  0C    0m  CC=0.0    ←0
  │ README.md                   48L  0C    0m  CC=0.0    ←0
  │ migration.yaml              46L  0C    0m  CC=0.0    ←0
  │ enable-i2c-spi.md           45L  0C    0m  CC=0.0    ←0
  │ README.md                   45L  0C    0m  CC=0.0    ←0
  │ migration.md                45L  0C    0m  CC=0.0    ←0
  │ migration.yaml              44L  0C    0m  CC=0.0    ←0
  │ README.md                   44L  0C    0m  CC=0.0    ←0
  │ migration.yaml              43L  0C    0m  CC=0.0    ←0
  │ README.md                   41L  0C    0m  CC=0.0    ←0
  │ README.md                   41L  0C    0m  CC=0.0    ←0
  │ README.md                   40L  0C    0m  CC=0.0    ←0
  │ README.md                   40L  0C    0m  CC=0.0    ←0
  │ migration.yaml              40L  0C    0m  CC=0.0    ←0
  │ migration.md                39L  0C    0m  CC=0.0    ←0
  │ 14-blue-green.yaml          38L  0C    0m  CC=0.0    ←0
  │ deploy.github.yml           38L  0C    0m  CC=0.0    ←0
  │ migration.yaml              37L  0C    0m  CC=0.0    ←0
  │ 15-canary.yaml              36L  0C    0m  CC=0.0    ←0
  │ README.md                   36L  0C    0m  CC=0.0    ←0
  │ 16-auto-rollback.yaml       35L  0C    0m  CC=0.0    ←0
  │ migration.yaml              35L  0C    0m  CC=0.0    ←0
  │ README.md                   35L  0C    0m  CC=0.0    ←0
  │ prod.yaml                   34L  0C    0m  CC=0.0    ←0
  │ 13-kiosk-appliance.yaml     33L  0C    0m  CC=0.0    ←0
  │ staging.yaml                33L  0C    0m  CC=0.0    ←0
  │ README.md                   29L  0C    0m  CC=0.0    ←0
  │ README.md                   29L  0C    0m  CC=0.0    ←0
  │ README.md                   29L  0C    0m  CC=0.0    ←0
  │ dev.yaml                    28L  0C    0m  CC=0.0    ←0
  │ deploy.gitlab.yml           21L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml               11L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                6L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                6L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                6L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                5L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                5L  0C    0m  CC=0.0    ←0
  │ tls.yml                      4L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                4L  0C    0m  CC=0.0    ←0
  │ redeploy.yaml                3L  0C    0m  CC=0.0    ←0
  │
  redeploy/                       CC̄=4.9    ←in:77  →out:3
  │ !! handlers                   655L  0C   22m  CC=16     ←2
  │ !! planner                    627L  1C   21m  CC=10     ←0
  │ !! commands                   594L  0C    8m  CC=26     ←0
  │ !! docker_compose             476L  1C   23m  CC=25     ←0
  │ templates                  419L  6C   13m  CC=9      ←0
  │ !! workflow                   418L  3C   12m  CC=18     ←0
  │ patterns                   407L  4C   11m  CC=5      ←1
  │ !! loader                     403L  3C   12m  CC=25     ←5
  │ hardware                   398L  0C   11m  CC=13     ←0
  │ !! fleet                      396L  6C   23m  CC=25     ←1
  │ display                    389L  0C   25m  CC=9      ←6
  │ !! import_                    357L  0C    8m  CC=22     ←0
  │ mcp_server                 356L  0C   15m  CC=5      ←2
  │ executor                   354L  1C   17m  CC=14     ←0
  │ !! helpers                    349L  0C   10m  CC=25     ←2
  │ !! bump_fix                   348L  0C   12m  CC=17     ←0
  │ !! prompt_cmd                 343L  0C    4m  CC=15     ←0
  │ !! blueprint                  339L  0C    8m  CC=20     ←0
  │ !! hint_provider              327L  0C    8m  CC=16     ←0
  │ observe                    313L  3C   14m  CC=12     ←0
  │ schema                     311L  0C    6m  CC=14     ←2
  │ parser                     310L  1C   10m  CC=14     ←6
  │ ssh                        301L  4C   17m  CC=7      ←0
  │ !! compose                    299L  1C   18m  CC=18     ←0
  │ plan_apply_report          296L  0C   10m  CC=14     ←1
  │ steps                      294L  0C    7m  CC=7      ←0
  │ !! gh_workflow                291L  0C   15m  CC=19     ←0
  │ !! config_hints               289L  1C   15m  CC=26     ←0
  │ bump                       284L  0C    6m  CC=13     ←3
  │ probes                     283L  0C    9m  CC=13     ←1
  │ hardware_diagnostic        282L  1C   11m  CC=14     ←0
  │ preflight_schema           279L  1C    6m  CC=14     ←1
  │ base                       275L  7C   13m  CC=7      ←1
  │ runner                     265L  1C    5m  CC=14     ←0
  │ scanner                    262L  0C   18m  CC=13     ←1
  │ parser                     261L  2C    8m  CC=8      ←0
  │ scanners                   254L  0C    8m  CC=14     ←3
  │ op3_bridge                 250L  0C    5m  CC=10     ←3
  │ exec_                      240L  0C    6m  CC=10     ←0
  │ plan_apply_shared          235L  0C   10m  CC=13     ←1
  │ !! state_apply                222L  4C    9m  CC=18     ←2
  │ !! commits                    218L  2C    3m  CC=18     ←2
  │ templates.yaml             215L  0C    0m  CC=0.0    ←0
  │ docker_steps               211L  2C    6m  CC=7      ←0
  │ !! runner                     205L  1C    5m  CC=15     ←0
  │ changelog                  204L  1C   15m  CC=7      ←1
  │ fixes                      203L  0C    6m  CC=7      ←1
  │ devices                    192L  0C    4m  CC=14     ←0
  │ parse                      190L  0C   10m  CC=12     ←0
  │ !! docker_compose             190L  0C    2m  CC=20     ←1
  │ auto_probe                 186L  0C    9m  CC=7      ←4
  │ spec                       182L  3C    6m  CC=5      ←1
  │ extractor                  182L  1C    5m  CC=14     ←0
  │ compiler                   182L  1C    6m  CC=11     ←3
  │ __init__                   180L  2C   10m  CC=7      ←8
  │ core                       179L  0C    7m  CC=10     ←7
  │ !! migration                  179L  0C    1m  CC=19     ←1
  │ device_map_actions         174L  0C    5m  CC=13     ←1
  │ devices                    170L  4C   13m  CC=5      ←0
  │ !! device_map_renderers       170L  0C    7m  CC=22     ←0
  │ manifest                   169L  8C   10m  CC=6      ←0
  │ notify                     168L  0C    7m  CC=6      ←0
  │ run_cmd                    168L  0C    1m  CC=13     ←0
  │ process_control_template.yaml   164L  0C    0m  CC=0.0    ←0
  │ transaction                162L  2C    6m  CC=12     ←0
  │ state                      161L  1C   13m  CC=5      ←2
  │ docker_build               160L  1C    7m  CC=12     ←0
  │ auditor                    155L  1C   13m  CC=4      ←0
  │ release                    153L  0C    6m  CC=7      ←2
  │ __init__                   153L  0C    0m  CC=0.0    ←0
  │ !! manifest                   151L  2C    6m  CC=20     ←0
  │ __init__                   148L  0C    4m  CC=8      ←1
  │ !! compose                    146L  0C    6m  CC=21     ←1
  │ compose                    143L  1C    6m  CC=11     ←0
  │ git_integration            142L  2C   13m  CC=4      ←0
  │ !! extractor                  140L  0C    1m  CC=22     ←1
  │ monorepo                   139L  0C    5m  CC=11     ←1
  │ detect                     137L  0C    1m  CC=11     ←0
  │ decorators                 137L  4C    8m  CC=3      ←0
  │ __init__                   126L  0C    3m  CC=5      ←0
  │ export                     126L  0C    6m  CC=9      ←0
  │ !! audit                      126L  0C    1m  CC=18     ←0
  │ display                    125L  0C    2m  CC=7      ←1
  │ process_control            123L  0C    3m  CC=11     ←0
  │ __init__                   121L  0C    0m  CC=0.0    ←0
  │ !! browser_reload             120L  0C    3m  CC=16     ←0
  │ spec_analyzer              118L  1C    3m  CC=7      ←0
  │ state                      118L  0C    4m  CC=7      ←0
  │ diff                       118L  1C    3m  CC=8      ←1
  │ hardware                   117L  5C    0m  CC=0.0    ←0
  │ init                       111L  0C    1m  CC=10     ←0
  │ ssh_credentials            111L  0C    3m  CC=14     ←1
  │ !! push                       110L  0C    1m  CC=15     ←0
  │ progress                   107L  1C   11m  CC=2      ←0
  │ registry                   107L  0C    4m  CC=14     ←1
  │ git_transaction            105L  2C    5m  CC=9      ←0
  │ detector                   104L  1C    4m  CC=9      ←2
  │ plan_apply_run             104L  0C    3m  CC=8      ←1
  │ patterns                   104L  0C    1m  CC=8      ←0
  │ toml_                      104L  1C    3m  CC=10     ←0
  │ systemd_reload              98L  0C    2m  CC=12     ←0
  │ __init__                    97L  1C    4m  CC=4      ←43
  │ target                      97L  0C    1m  CC=10     ←1
  │ blueprint                   95L  6C    3m  CC=3      ←0
  │ path                        94L  2C    5m  CC=9      ←1
  │ yaml_                       94L  1C    3m  CC=10     ←0
  │ verify                      92L  1C    7m  CC=8      ←0
  │ probe                       91L  0C    1m  CC=11     ←0
  │ json_                       90L  1C    3m  CC=9      ←0
  │ config_txt                  88L  1C    2m  CC=14     ←1
  │ generic                     87L  0C    1m  CC=1      ←0
  │ workflow                    87L  0C    3m  CC=10     ←0
  │ ignore                      86L  1C    4m  CC=9      ←2
  │ !! lint                        86L  0C    1m  CC=19     ←0
  │ decider                     85L  2C    2m  CC=7      ←1
  │ autostart                   84L  1C    3m  CC=6      ←1
  │ hardware                    83L  0C    2m  CC=4      ←0
  │ command_ref                 83L  1C    2m  CC=10     ←0
  │ plan                        83L  2C    0m  CC=0.0    ←0
  │ models                      81L  3C    3m  CC=2      ←0
  │ compositors                 80L  1C    1m  CC=2      ←0
  │ plugin                      79L  0C    1m  CC=13     ←0
  │ probe                       78L  1C    8m  CC=4      ←0
  │ browsers                    78L  1C    1m  CC=5      ←0
  │ device_map                  78L  0C    1m  CC=11     ←0
  │ plan_cmd                    78L  0C    1m  CC=11     ←0
  │ probe_display               77L  0C    3m  CC=9      ←1
  │ infra                       77L  6C    0m  CC=0.0    ←0
  │ __init__                    77L  0C    0m  CC=0.0    ←0
  │ migrate_cmd                 75L  0C    1m  CC=13     ←0
  │ binary                      74L  1C    2m  CC=14     ←0
  │ inspect                     73L  0C    2m  CC=4      ←0
  │ applier                     72L  0C    3m  CC=4      ←3
  │ run_container_build         69L  0C    1m  CC=10     ←1
  │ enums                       69L  4C    0m  CC=0.0    ←0
  │ output_profiles             68L  1C    2m  CC=5      ←0
  │ regex                       65L  1C    2m  CC=5      ←0
  │ __init__                    65L  1C    5m  CC=2      ←3
  │ registry                    64L  0C    3m  CC=9      ←1
  │ loop_detector               61L  2C    4m  CC=5      ←0
  │ devices_display             61L  0C    2m  CC=13     ←1
  │ __init__                    59L  0C    0m  CC=0.0    ←0
  │ k3s                         58L  0C    1m  CC=1      ←0
  │ hardware_rules              56L  0C    3m  CC=3      ←0
  │ status                      55L  0C    1m  CC=12     ←0
  │ mcp_cmd                     54L  0C    1m  CC=1      ←0
  │ __init__                    52L  0C    0m  CC=0.0    ←0
  │ log_writer                  51L  0C    1m  CC=6      ←0
  │ __init__                    51L  0C    1m  CC=1      ←1
  │ panels                      51L  1C    5m  CC=2      ←2
  │ apply_cmd                   51L  0C    1m  CC=9      ←0
  │ base                        49L  1C    5m  CC=3      ←0
  │ kiosk                       49L  0C    0m  CC=0.0    ←0
  │ models                      48L  3C    3m  CC=3      ←1
  │ waveshare                   48L  0C    0m  CC=0.0    ←0
  │ spec_loader                 47L  2C    1m  CC=4      ←4
  │ diagnose                    47L  0C    1m  CC=5      ←0
  │ __init__                    47L  0C    0m  CC=0.0    ←0
  │ data_sync                   45L  0C    2m  CC=7      ←0
  │ hardware                    45L  0C    1m  CC=13     ←1
  │ exceptions                  44L  6C    4m  CC=1      ←0
  │ rollback                    44L  0C    1m  CC=8      ←1
  │ __init__                    44L  0C    0m  CC=0.0    ←0
  │ infra                       43L  0C    2m  CC=8      ←1
  │ query                       42L  0C    1m  CC=5      ←3
  │ podman                      41L  0C    1m  CC=1      ←0
  │ hyperpixel                  41L  0C    0m  CC=0.0    ←0
  │ docker                      40L  0C    1m  CC=1      ←0
  │ reference                   39L  1C    1m  CC=12     ←0
  │ context                     39L  1C    3m  CC=1      ←0
  │ types                       38L  2C    0m  CC=0.0    ←0
  │ __init__                    37L  0C    0m  CC=0.0    ←0
  │ pipeline                    35L  1C    0m  CC=0.0    ←0
  │ paths                       34L  0C    3m  CC=5      ←1
  │ migration                   34L  0C    1m  CC=9      ←1
  │ diff                        33L  0C    1m  CC=1      ←0
  │ process                     32L  0C    1m  CC=1      ←0
  │ helpers                     32L  0C    3m  CC=2      ←1
  │ raspi_config                32L  0C    1m  CC=3      ←1
  │ __init__                    31L  0C    0m  CC=0.0    ←0
  │ __init__                    30L  0C    0m  CC=0.0    ←0
  │ patterns                    28L  0C    0m  CC=0.0    ←0
  │ persisted                   27L  1C    2m  CC=1      ←0
  │ git_config                  27L  0C    1m  CC=5      ←0
  │ changelog_config            27L  0C    1m  CC=5      ←0
  │ models                      26L  2C    0m  CC=0.0    ←0
  │ __init__                    26L  0C    0m  CC=0.0    ←0
  │ plain                       24L  1C    2m  CC=2      ←0
  │ env                         23L  1C    1m  CC=5      ←0
  │ scm                         22L  0C    1m  CC=1      ←0
  │ hardware                    22L  0C    1m  CC=1      ←0
  │ transfer                    22L  0C    1m  CC=1      ←0
  │ base                        19L  1C    1m  CC=1      ←0
  │ __init__                    18L  0C    0m  CC=0.0    ←0
  │ official                    18L  0C    0m  CC=0.0    ←0
  │ loader                      17L  0C    1m  CC=3      ←1
  │ __init__                    15L  0C    0m  CC=0.0    ←0
  │ __init__                    15L  0C    0m  CC=0.0    ←0
  │ exceptions                  12L  1C    1m  CC=1      ←0
  │ __init__                    11L  0C    0m  CC=0.0    ←0
  │ __init__                    10L  0C    0m  CC=0.0    ←0
  │ plan_apply                   9L  0C    0m  CC=0.0    ←0
  │ __init__                     8L  0C    0m  CC=0.0    ←0
  │ __init__                     8L  0C    0m  CC=0.0    ←0
  │ __init__                     8L  0C    0m  CC=0.0    ←0
  │ __init__                     6L  0C    0m  CC=0.0    ←0
  │ __init__                     6L  0C    0m  CC=0.0    ←0
  │ __init__                     5L  0C    0m  CC=0.0    ←0
  │ remote                       4L  0C    0m  CC=0.0    ←0
  │ __init__                     4L  0C    0m  CC=0.0    ←0
  │ __init__                     4L  0C    0m  CC=0.0    ←0
  │ __init__                     2L  0C    0m  CC=0.0    ←0
  │ __init__                     1L  0C    0m  CC=0.0    ←0
  │ __init__                     1L  0C    0m  CC=0.0    ←0
  │ __init__                     1L  0C    0m  CC=0.0    ←0
  │ heal                         0L  2C   20m  CC=8      ←1
  │ !! discovery_probe              0L  0C    2m  CC=16     ←1
  │ __init__                     0L  0C    0m  CC=0.0    ←0
  │
  ./                              CC̄=0.0    ←in:0  →out:0
  │ !! CHANGELOG.md              1526L  0C    0m  CC=0.0    ←0
  │ !! README.md                 1117L  0C    0m  CC=0.0    ←0
  │ !! goal.yaml                  512L  0C    0m  CC=0.0    ←0
  │ REFACTORING.md             399L  0C    0m  CC=0.0    ←0
  │ TODO.md                    287L  0C    0m  CC=0.0    ←0
  │ DOQL-INTEGRATION.md        197L  0C    0m  CC=0.0    ←0
  │ sumd.json                  156L  0C    0m  CC=0.0    ←0
  │ Makefile                   154L  0C    0m  CC=0.0    ←0
  │ pyproject.toml              74L  0C    0m  CC=0.0    ←0
  │ project.sh                  42L  0C    0m  CC=0.0    ←0
  │ REPAIR_LOG.md               37L  0C    0m  CC=0.0    ←0
  │ pyqual.yaml                 32L  0C    0m  CC=0.0    ←0
  │ tree.sh                      1L  0C    0m  CC=0.0    ←0
  │
  docs/                           CC̄=0.0    ←in:0  →out:0
  │ !! README.md                 1176L  0C    0m  CC=0.0    ←0
  │ dsl-migration.md           478L  0C    0m  CC=0.0    ←0
  │ fleet.md                   366L  0C    0m  CC=0.0    ←0
  │ patterns.md                304L  0C    0m  CC=0.0    ←0
  │ observe.md                 302L  0C    0m  CC=0.0    ←0
  │ markpact-implementation-plan.md   284L  0C    0m  CC=0.0    ←0
  │ README.md                  202L  0C    0m  CC=0.0    ←0
  │ markpact-audit.md           81L  0C    0m  CC=0.0    ←0
  │ op3-migration.md            44L  0C    0m  CC=0.0    ←0
  │
  scripts/                        CC̄=0.0    ←in:0  →out:0
  │ quality_gate                48L  0C    0m  CC=0.0    ←0
  │
  reports/                        CC̄=0.0    ←in:0  →out:0
  │ hardware-108.yaml          224L  0C    0m  CC=0.0    ←0
  │ hardware-109.yaml          200L  0C    0m  CC=0.0    ←0
  │
  testql-scenarios/               CC̄=0.0    ←in:0  →out:0
  │ generated-from-pytests.testql.toon.yaml    22L  0C    0m  CC=0.0    ←0
  │ generated-cli-tests.testql.toon.yaml    12L  0C    0m  CC=0.0    ←0
  │
  ── zero ──
     redeploy/blueprint/generators/__init__.py  0L
     redeploy/discovery_probe.py               0L
     redeploy/heal.py                          0L

COUPLING:
                                      redeploy           redeploy.cli       redeploy.version         redeploy.apply     redeploy.discovery      redeploy.markpact       redeploy.analyze          redeploy.heal           redeploy.iac           redeploy.dsl        redeploy.detect        redeploy.models     redeploy.blueprint      redeploy.hardware  redeploy.config_apply
               redeploy                     ──                    ←25                     ←1                     ←2                      1                      2                     ←3                    ←11                     ←7                     ←1                     ←3                     ←4                     ←2                     ←1                         hub
           redeploy.cli                     25                     ──                     15                      7                      5                      1                      3                                             2                      7                      2                                             3                      2                      4  !! fan-out
       redeploy.version                      1                    ←15                     ──                                                                                                                                                                                                                                                                                      hub
         redeploy.apply                      2                     ←7                                            ──                                             1                                                                                                                                                                                       3                     ←1  hub
     redeploy.discovery                      5                     ←5                                                                   ──                                                                                                                                        ←2                                                                                              hub
      redeploy.markpact                     ←2                     ←1                                            ←1                                            ──                     ←5                                            ←1                                                                    2                                                                       hub
       redeploy.analyze                      3                     ←3                                                                                           5                     ──                                                                                                                                                                                          !! fan-out
          redeploy.heal                     11                                                                                                                                                               ──                                                                                                                                                                   !! fan-out
           redeploy.iac                      7                     ←2                                                                                           1                                                                   ──                                                                                                                                            !! fan-out
           redeploy.dsl                      1                     ←7                                                                                                                                                                                      ──                                            ←1                                                                       hub
        redeploy.detect                      3                     ←2                                                                    2                                                                                                                                        ──                                                                                            
        redeploy.models                      4                                                                                                                 ←2                                                                                           1                                            ──                                                                     
     redeploy.blueprint                      2                     ←3                                                                                                                                                                                                                                                           ──                                              
      redeploy.hardware                      1                     ←2                                            ←3                                                                                                                                                                                                                                    ──                         hub
  redeploy.config_apply                                            ←4                                             1                                                                                                                                                                                                                                                           ──
  CYCLES: none
  HUB: redeploy.hardware/ (fan-in=5)
  HUB: redeploy.apply/ (fan-in=8)
  HUB: redeploy/ (fan-in=77)
  HUB: redeploy.version/ (fan-in=15)
  HUB: redeploy.dsl/ (fan-in=8)
  HUB: redeploy.markpact/ (fan-in=10)
  HUB: redeploy.discovery/ (fan-in=8)
  SMELL: redeploy.analyze/ fan-out=8 → split needed
  SMELL: redeploy.heal/ fan-out=11 → split needed
  SMELL: redeploy.iac/ fan-out=8 → split needed
  SMELL: redeploy.cli/ fan-out=77 → split needed

EXTERNAL:
  validation: run `vallm batch .` → validation.toon
  duplication: run `redup scan .` → duplication.toon

Duplication (project/duplication.toon.yaml)

# redup/duplication | 11 groups | 216f 28973L | 2026-05-19

SUMMARY:
  files_scanned: 216
  total_lines:   28973
  dup_groups:    11
  dup_fragments: 22
  saved_lines:   121
  scan_ms:       2758

HOTSPOTS[7] (files with most duplication):
  redeploy/cli/commands/version/helpers.py  dup=38L  groups=2  frags=2  (0.1%)
  redeploy/cli/commands/version/release.py  dup=38L  groups=2  frags=2  (0.1%)
  redeploy/hardware/fixes.py  dup=26L  groups=1  frags=2  (0.1%)
  redeploy/cli/commands/version/utils/changelog_config.py  dup=21L  groups=1  frags=1  (0.1%)
  redeploy/cli/commands/version/utils/git_config.py  dup=21L  groups=1  frags=1  (0.1%)
  examples/redeploy_iac_parsers/argocd_flux.py  dup=20L  groups=1  frags=2  (0.1%)
  redeploy/heal.py  dup=18L  groups=3  frags=3  (0.1%)

DUPLICATES[11] (ranked by impact):
  [bb546964bbb3b9b9]   EXAC  _resolve_package_release_git_config  L=22 N=2 saved=22 sim=1.00
      redeploy/cli/commands/version/helpers.py:60-81  (_resolve_package_release_git_config)
      redeploy/cli/commands/version/release.py:114-135  (_resolve_package_release_git_config)
  [110f695b3d13b4e5]   STRU  resolve_package_release_changelog_config  L=21 N=2 saved=21 sim=1.00
      redeploy/cli/commands/version/utils/changelog_config.py:7-27  (resolve_package_release_changelog_config)
      redeploy/cli/commands/version/utils/git_config.py:7-27  (resolve_package_release_git_config)
  [7764f64185066b87]   EXAC  _resolve_package_release_changelog_config  L=16 N=2 saved=16 sim=1.00
      redeploy/cli/commands/version/helpers.py:84-99  (_resolve_package_release_changelog_config)
      redeploy/cli/commands/version/release.py:138-153  (_resolve_package_release_changelog_config)
  [834af96e195aeafb]   STRU  fix_enable_i2c  L=13 N=2 saved=13 sim=1.00
      redeploy/hardware/fixes.py:137-149  (fix_enable_i2c)
      redeploy/hardware/fixes.py:152-164  (fix_enable_spi)
  [6378b1bc4c001c05]   STRU  can_parse  L=10 N=2 saved=10 sim=1.00
      examples/redeploy_iac_parsers/argocd_flux.py:27-36  (can_parse)
      examples/redeploy_iac_parsers/argocd_flux.py:81-90  (can_parse)
  [38b4a0d706405cb1]   STRU  _load_dotenv  L=9 N=2 saved=9 sim=1.00
      redeploy/cli/commands/bump_fix.py:163-171  (_load_dotenv)
      redeploy/cli/commands/plan_apply_shared.py:119-127  (load_dotenv_for_heal)
  [fc600e8d2f11c2ec]   EXAC  collect_diagnostics  L=8 N=2 saved=8 sim=1.00
      redeploy/heal/hint_provider.py:82-89  (collect_diagnostics)
      redeploy/heal.py:87-94  (collect_diagnostics)
  [069a3d8b69b2d778]   STRU  run_docker_build  L=8 N=2 saved=8 sim=1.00
      redeploy/apply/handlers.py:119-126  (run_docker_build)
      redeploy/apply/handlers.py:129-136  (run_podman_build)
  [2bcb64b1eb9fa406]   EXAC  _ssh  L=7 N=2 saved=7 sim=1.00
      redeploy/heal/hint_provider.py:73-79  (_ssh)
      redeploy/heal.py:78-84  (_ssh)
  [18c2c8acae3b5cbb]   STRU  _print_banner  L=4 N=2 saved=4 sim=1.00
      redeploy/cli/commands/bump_fix.py:340-343  (_print_banner)
      redeploy/cli/commands/plan_apply_shared.py:141-144  (print_heal_banner)
  [cd12ee27f7030458]   EXAC  reset  L=3 N=2 saved=3 sim=1.00
      redeploy/heal/loop_detector.py:55-57  (reset)
      redeploy/heal.py:271-273  (reset)

REFACTOR[11] (ranked by priority):
  [1] ○ extract_function   → redeploy/cli/commands/version/utils/_resolve_package_release_git_config.py
      WHY: 2 occurrences of 22-line block across 2 files — saves 22 lines
      FILES: redeploy/cli/commands/version/helpers.py, redeploy/cli/commands/version/release.py
  [2] ○ extract_function   → redeploy/cli/commands/version/utils/utils/resolve_package_release_changelog_config.py
      WHY: 2 occurrences of 21-line block across 2 files — saves 21 lines
      FILES: redeploy/cli/commands/version/utils/changelog_config.py, redeploy/cli/commands/version/utils/git_config.py
  [3] ○ extract_function   → redeploy/cli/commands/version/utils/_resolve_package_release_changelog_config.py
      WHY: 2 occurrences of 16-line block across 2 files — saves 16 lines
      FILES: redeploy/cli/commands/version/helpers.py, redeploy/cli/commands/version/release.py
  [4] ○ extract_function   → redeploy/hardware/utils/fix_enable_i2c.py
      WHY: 2 occurrences of 13-line block across 1 files — saves 13 lines
      FILES: redeploy/hardware/fixes.py
  [5] ○ extract_function   → examples/redeploy_iac_parsers/utils/can_parse.py
      WHY: 2 occurrences of 10-line block across 1 files — saves 10 lines
      FILES: examples/redeploy_iac_parsers/argocd_flux.py
  [6] ○ extract_function   → redeploy/cli/commands/utils/_load_dotenv.py
      WHY: 2 occurrences of 9-line block across 2 files — saves 9 lines
      FILES: redeploy/cli/commands/bump_fix.py, redeploy/cli/commands/plan_apply_shared.py
  [7] ○ extract_function   → redeploy/utils/collect_diagnostics.py
      WHY: 2 occurrences of 8-line block across 2 files — saves 8 lines
      FILES: redeploy/heal.py, redeploy/heal/hint_provider.py
  [8] ○ extract_function   → redeploy/apply/utils/run_docker_build.py
      WHY: 2 occurrences of 8-line block across 1 files — saves 8 lines
      FILES: redeploy/apply/handlers.py
  [9] ○ extract_function   → redeploy/utils/_ssh.py
      WHY: 2 occurrences of 7-line block across 2 files — saves 7 lines
      FILES: redeploy/heal.py, redeploy/heal/hint_provider.py
  [10] ○ extract_function   → redeploy/cli/commands/utils/_print_banner.py
      WHY: 2 occurrences of 4-line block across 2 files — saves 4 lines
      FILES: redeploy/cli/commands/bump_fix.py, redeploy/cli/commands/plan_apply_shared.py
  [11] ○ extract_class      → redeploy/utils/reset.py
      WHY: 2 occurrences of 3-line block across 2 files — saves 3 lines
      FILES: redeploy/heal.py, redeploy/heal/loop_detector.py

QUICK_WINS[9] (low risk, high savings — do first):
  [1] extract_function   saved=22L  → redeploy/cli/commands/version/utils/_resolve_package_release_git_config.py
      FILES: helpers.py, release.py
  [2] extract_function   saved=21L  → redeploy/cli/commands/version/utils/utils/resolve_package_release_changelog_config.py
      FILES: changelog_config.py, git_config.py
  [3] extract_function   saved=16L  → redeploy/cli/commands/version/utils/_resolve_package_release_changelog_config.py
      FILES: helpers.py, release.py
  [4] extract_function   saved=13L  → redeploy/hardware/utils/fix_enable_i2c.py
      FILES: fixes.py
  [5] extract_function   saved=10L  → examples/redeploy_iac_parsers/utils/can_parse.py
      FILES: argocd_flux.py
  [6] extract_function   saved=9L  → redeploy/cli/commands/utils/_load_dotenv.py
      FILES: bump_fix.py, plan_apply_shared.py
  [7] extract_function   saved=8L  → redeploy/utils/collect_diagnostics.py
      FILES: heal.py, hint_provider.py
  [8] extract_function   saved=8L  → redeploy/apply/utils/run_docker_build.py
      FILES: handlers.py
  [9] extract_function   saved=7L  → redeploy/utils/_ssh.py
      FILES: heal.py, hint_provider.py

EFFORT_ESTIMATE (total ≈ 4.0h):
  medium _resolve_package_release_git_config saved=22L  ~44min
  medium resolve_package_release_changelog_config saved=21L  ~42min
  medium _resolve_package_release_changelog_config saved=16L  ~32min
  easy   fix_enable_i2c                      saved=13L  ~26min
  easy   can_parse                           saved=10L  ~20min
  easy   _load_dotenv                        saved=9L  ~18min
  easy   collect_diagnostics                 saved=8L  ~16min
  easy   run_docker_build                    saved=8L  ~16min
  easy   _ssh                                saved=7L  ~14min
  easy   _print_banner                       saved=4L  ~8min
  ... +1 more (~6min)

METRICS-TARGET:
  dup_groups:  11 → 0
  saved_lines: 121 lines recoverable

Evolution / Churn (project/evolution.toon.yaml)

# code2llm/evolution | 967 func | 173f | 2026-05-20
# generated in 0.00s

NEXT[10] (ranked by impact):
  [1] !! SPLIT-FUNC      version_init  CC=26  fan=26
      WHY: CC=26 exceeds 15
      EFFORT: ~1h  IMPACT: 676

  [2] !! SPLIT-FUNC      DockerComposeParser.parse  CC=25  fan=24
      WHY: CC=25 exceeds 15
      EFFORT: ~1h  IMPACT: 600

  [3] !  SPLIT-FUNC      import_cmd  CC=21  fan=26
      WHY: CC=21 exceeds 15
      EFFORT: ~1h  IMPACT: 546

  [4] !! SPLIT-FUNC      ConfigHintsParser._parse_k8s_yaml  CC=26  fan=20
      WHY: CC=26 exceeds 15
      EFFORT: ~1h  IMPACT: 520

  [5] !  SPLIT-FUNC      fix_cmd  CC=17  fan=30
      WHY: CC=17 exceeds 15
      EFFORT: ~1h  IMPACT: 510

  [6] !  SPLIT-FUNC      gh_workflow_run  CC=19  fan=25
      WHY: CC=19 exceeds 15
      EFFORT: ~1h  IMPACT: 475

  [7] !  SPLIT-FUNC      ConfigHintsParser._parse_github_actions  CC=22  fan=21
      WHY: CC=22 exceeds 15
      EFFORT: ~1h  IMPACT: 462

  [8] !  SPLIT-FUNC      extract_blueprint  CC=22  fan=20
      WHY: CC=22 exceeds 15
      EFFORT: ~1h  IMPACT: 440

  [9] !  SPLIT-FUNC      audit  CC=18  fan=24
      WHY: CC=18 exceeds 15
      EFFORT: ~1h  IMPACT: 432

  [10] !  SPLIT-FUNC      lint  CC=19  fan=22
      WHY: CC=19 exceeds 15
      EFFORT: ~1h  IMPACT: 418


RISKS[3]:
  ⚠ Splitting CHANGELOG.md may break 0 import paths
  ⚠ Splitting docs/README.md may break 0 import paths
  ⚠ Splitting README.md may break 0 import paths

METRICS-TARGET:
  CC̄:          4.9 → ≤3.4
  max-CC:      26 → ≤13
  god-modules: 7 → 0
  high-CC(≥15): 34 → ≤17
  hub-types:   0 → ≤0

PATTERNS (language parser shared logic):
  _extract_declarations() in base.py — unified extraction for:
    - TypeScript: interfaces, types, classes, functions, arrow funcs
    - PHP: namespaces, traits, classes, functions, includes
    - Ruby: modules, classes, methods, requires
    - C++: classes, structs, functions, #includes
    - C#: classes, interfaces, methods, usings
    - Java: classes, interfaces, methods, imports
    - Go: packages, functions, structs
    - Rust: modules, functions, traits, use statements

  Shared regex patterns per language:
    - import: language-specific import/require/using patterns
    - class: class/struct/trait declarations with inheritance
    - function: function/method signatures with visibility
    - brace_tracking: for C-family languages ({ })
    - end_keyword_tracking: for Ruby (module/class/def...end)

  Benefits:
    - Consistent extraction logic across all languages
    - Reduced code duplication (~70% reduction in parser LOC)
    - Easier maintenance: fix once, apply everywhere
    - Standardized FunctionInfo/ClassInfo models

HISTORY:
  prev CC̄=5.0 → now CC̄=4.9

Validation (project/validation.toon.yaml)

# vallm batch | 270f | 0✓ 214⚠ 0✗ | 2026-04-21

SUMMARY:
  scanned: 270  passed: 0 (0.0%)  warnings: 214  errors: 0  unsupported: 0

WARNINGS[214]{path,score}:
  redeploy/detect/hardware.py,0.68
    issues[4]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,probe_wlr_randr: CC=17 exceeds limit 15,95
      complexity.lizard_cc,warning,_analyze: CC=43 exceeds limit 15,223
      complexity.lizard_length,warning,_analyze: 147 lines exceeds limit 100,223
  redeploy/blueprint/extractor.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,extract_blueprint: CC=31 exceeds limit 15,32
      complexity.lizard_cc,warning,_merge_compose: CC=21 exceeds limit 15,141
  redeploy/blueprint/generators/migration.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,generate_migration: CC=18 exceeds limit 15,17
      complexity.lizard_length,warning,generate_migration: 122 lines exceeds limit 100,17
  redeploy/cli/commands/device_map.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,device_map_cmd: CC=19 exceeds limit 15,55
      complexity.lizard_cc,warning,_render: CC=34 exceeds limit 15,182
  redeploy/cli/commands/hardware.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,hardware: CC=44 exceeds limit 15,62
      complexity.lizard_length,warning,hardware: 129 lines exceeds limit 100,62
  redeploy/cli/commands/import_.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,import_cmd: CC=17 exceeds limit 15,39
      complexity.lizard_cc,warning,_spec_to_migration_yaml: CC=22 exceeds limit 15,187
  redeploy/cli/commands/version.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,version_init: CC=25 exceeds limit 15,410
      complexity.lizard_cc,warning,_bump_single: CC=25 exceeds limit 15,796
  redeploy/detect/templates.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,build_context: CC=36 exceeds limit 15,87
      complexity.lizard_length,warning,_build_templates: 155 lines exceeds limit 100,180
  redeploy/discovery.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,update_registry: CC=17 exceeds limit 15,350
      complexity.lizard_cc,warning,_parse_probe_output: CC=16 exceeds limit 15,618
  redeploy/iac/docker_compose.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,parse: CC=25 exceeds limit 15,168
      complexity.lizard_cc,warning,_parse_service: CC=36 exceeds limit 15,294
  redeploy/iac/parsers/compose.py,0.71
    issues[3]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,parse: CC=19 exceeds limit 15,58
      complexity.lizard_cc,warning,_parse_service: CC=21 exceeds limit 15,116
  redeploy/blueprint/generators/docker_compose.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,_build_service: CC=20 exceeds limit 15,114
  redeploy/cli/commands/audit.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,audit: CC=17 exceeds limit 15,28
  redeploy/cli/commands/blueprint.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,_print_blueprint: CC=16 exceeds limit 15,234
  redeploy/cli/commands/devices.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,devices: CC=22 exceeds limit 15,19
  redeploy/cli/commands/probe.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,probe: CC=26 exceeds limit 15,29
  redeploy/detect/workflow.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,_collect_hosts: CC=18 exceeds limit 15,244
  redeploy/dsl/loader.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,_build_manifest: CC=25 exceeds limit 15,167
  redeploy/fleet.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,verify_expectations: CC=25 exceeds limit 15,138
  redeploy/models.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,apply_to_spec: CC=19 exceeds limit 15,577
  redeploy/plugins/builtin/browser_reload.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,browser_reload: CC=16 exceeds limit 15,33
  redeploy/version/commits.py,0.74
    issues[2]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
      complexity.lizard_cc,warning,analyze_commits: CC=18 exceeds limit 15,78
  .redeploy/state/test-local-09b68243.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-24cd498c.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-36935faf.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-46c5e2ce.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-50622a24.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-563ceb24.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-56cb0635.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-5a1d7483.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-6279ef2c.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-63f620b6.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-68ae2b20.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-7f5ddd97.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-831fd1ab.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-891787e9.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-9c9d5826.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-a70e54ce.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-a929f336.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-be94eb0c.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-da199855.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-db469906.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-df0d6ff6.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-e1009318.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-e322f022.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-e3a0f31a.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-ea908429.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-eac354f9.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-ec3c5638.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-ed7da478.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/state/test-local-efd3d620.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  .redeploy/version.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/01-vps-version-bump/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/01-vps-version-bump/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/02-k3s-to-docker/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/02-k3s-to-docker/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/03-docker-to-podman-quadlet/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/03-docker-to-podman-quadlet/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/04-rpi-kiosk/migration-rpi5.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/04-rpi-kiosk/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/04-rpi-kiosk/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/05-iot-fleet-ota/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/05-iot-fleet-ota/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/06-local-dev/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/06-local-dev/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/07-staging-to-prod/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/07-staging-to-prod/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/08-rollback/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/08-rollback/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/09-fleet-yaml/fleet.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/09-fleet-yaml/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/10-multienv/dev.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/10-multienv/prod.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/10-multienv/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/10-multienv/staging.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/11-traefik-tls/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/11-traefik-tls/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/12-ci-pipeline/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/12-ci-pipeline/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/13-kiosk-appliance.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/13-multi-app-monorepo/fleet.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/13-multi-app-monorepo/migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/13-multi-app-monorepo/redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/14-blue-green.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/15-canary.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  examples/yaml/16-auto-rollback.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  goal.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  migration.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  project.sh,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse BASH: Download error: Language 'BASH' not available for download. Available groups: [""all""]",
  project/calls.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  pyproject.toml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse TOML: Download error: Language 'TOML' not available for download. Available groups: [""all""]",
  redeploy.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  redeploy/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/exceptions.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/executor.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/handlers.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/progress.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/rollback.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/apply/state.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/audit.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/blueprint/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/blueprint/generators/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/detect.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/diagnose.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/diff.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/exec_.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/export.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/init.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/inspect.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/patterns.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/plan_apply.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/plugin.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/state.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/status.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/target.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/commands/workflow.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/core.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/cli/display.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/data_sync.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/detect/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/detect/detector.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/detect/probes.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/detect/remote.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl/parser.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/context.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/decorators.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/docker_steps.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/exceptions.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/runner.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/dsl_python/steps.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/iac/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/iac/base.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/iac/parsers/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/iac/registry.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/markpact/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/markpact/compiler.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/markpact/models.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/markpact/parser.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/observe.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/parse.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/patterns.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plan/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plan/planner.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/builtin/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/builtin/hardware_diagnostic.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/builtin/notify.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/builtin/process_control.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/plugins/builtin/systemd_reload.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/spec_loader.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/ssh.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/steps.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/templates/process_control_template.yaml,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse YAML: Download error: Language 'YAML' not available for download. Available groups: [""all""]",
  redeploy/tests/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_audit.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_cli.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_data_sync.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_discovery.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_dsl.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_examples.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_executor.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_fleet.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_git_integration.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_iac.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_manifest.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_markpact_compiler.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_markpact_parser.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_models.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_observe.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_parse.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_patterns.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_planner_edge.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_plugins.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_probes.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_public_api.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_resume.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_spec_loader.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_ssh.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_templates.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_verify.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_version.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_version_changelog.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_version_cli.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_version_manifest.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_version_sources.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/tests/test_workflow.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/verify.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/bump.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/changelog.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/diff.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/git_integration.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/git_transaction.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/manifest.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/__init__.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/base.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/json_.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/plain.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/regex.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/toml_.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/sources/yaml_.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  redeploy/version/transaction.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  sumd.json,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse JSON: Download error: Language 'JSON' not available for download. Available groups: [""all""]",
  tests/test_iac.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  tests/test_parse.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  tests/test_redeploy.py,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse PYTHON: Download error: Language 'PYTHON' not available for download. Available groups: [""all""]",
  tree.sh,0.78
    issues[1]{rule,severity,message,line}:
      syntax.unsupported,warning,"Could not parse BASH: Download error: Language 'BASH' not available for download. Available groups: [""all""]",

Intent

Infrastructure migration toolkit: detect → plan → apply