CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1
STATUS=FAIL
RC=43
HOST=pve01
MODE=read-only
COMPONENT=skladchik-durability-backup-producer-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=6d4e000caabe0b4f15d31ba419f9633c5004c1b83d9c535098b8901ae634bb59
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=43
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0
SANITIZED_OUTPUT_SHA256=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0
OUTPUT_BEGIN
SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA=V1
NO_MAIL_SEND=true
NO_SERVICE_RESTART=true
NO_TIMER_MUTATION=true
NO_NETWORK_MUTATION=true
NO_SOURCE_MUTATION=true
NO_BACKUP_MUTATION=true
NO_GIT_PUSH=true
MODE=read-only
HOST_PVE01=true
PRODUCER_VM170_QM_RC=0
PRODUCER_VM170_STDERR_PRESENT=false
PRODUCER_VM170_JSON=true
PRODUCER_VM170_GUEST_EXITCODE=0
VM170_MONITOR_SHA=19123e359f2f7b9a2d373fd7e4464dd426d31b91cabc567c252e70cad40d77c8
VM170_TIMER_ACTIVE=active
VM170_TIMER_ENABLED=enabled
VM170_SERVICE_RESULT=success
VM170_HEALTH_STATUS=OK\nVM170_HEALTH_TS=2026-10-05T06:43:23Z\nVM170_HEALTH_REPORTS=22\nVM170_HEALTH_OPEN=13\nVM170_HEALTH_RESOLVED=9\n
VM170_BASELINE_OK=false
SUPERVISOR_PRESENT=true
SUPERVISOR_SHA=3a9bf9f3f9c28dbf670300f0851a5b7f86eb41fa41cdf44d0935337ae8ef02a2
SUPERVISOR_BASENAME=skladchik-reports-monitor-supervisor
SUPERVISOR_AST_OK=true
SUPERVISOR_FUNCTION_COUNT=16
SUPERVISOR_FUNCTIONS=now,iso,log,run,parse_env_text,read_env_file,age_seconds_from_ts,ssh_edge,edge_mail,systemctl_props,gather,render_body,write_health,read_state,write_state,main
SUPERVISOR_CLI_OPTION_COUNT=0
SUPERVISOR_CLI_OPTIONS=NONE
SUPERVISOR_ENV_NAME_COUNT=5
SUPERVISOR_ENV_NAMES=SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS,SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS,SKLADCHIK_EDGE,SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS,SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS
SUPERVISOR_RELEVANT_FUNCTION_COUNT=4
SUPERVISOR_FUNC_1_NAME=parse_env_text
SUPERVISOR_FUNC_1_LINENO=51
SUPERVISOR_FUNC_1_ENDLINENO=58
SUPERVISOR_FUNC_1_NAMES=d,k,line,split,splitlines,startswith,strip,text,v
SUPERVISOR_FUNC_1_AST_BEGIN
FunctionDef(
  name='parse_env_text',
  args=arguments(
    args=[
      arg(arg='text')]),
  body=[
    Assign(
      targets=[
        Name(id='d', ctx=Store())],
      value=Dict()),
    For(
      target=Name(id='line', ctx=Store()),
      iter=Call(
        func=Attribute(
          value=BoolOp(
            op=Or(),
            values=[
              Name(id='text', ctx=Load()),
              Constant(value='')]),
          attr='splitlines',
          ctx=Load())),
      body=[
        If(
          test=BoolOp(
            op=Or(),
            values=[
              UnaryOp(
                op=Not(),
                operand=Name(id='line', ctx=Load())),
              Call(
                func=Attribute(
                  value=Name(id='line', ctx=Load()),
                  attr='startswith',
                  ctx=Load()),
                args=[
                  Constant(value='#')]),
              Compare(
                left=Constant(value='='),
                ops=[
                  NotIn()],
                comparators=[
                  Name(id='line', ctx=Load())])]),
          body=[
            Continue()]),
        Assign(
          targets=[
            Tuple(
              elts=[
                Name(id='k', ctx=Store()),
                Name(id='v', ctx=Store())],
              ctx=Store())],
          value=Call(
            func=Attribute(
              value=Name(id='line', ctx=Load()),
              attr='split',
              ctx=Load()),
            args=[
              Constant(value='='),
              Constant(value=1)])),
        Assign(
          targets=[
            Subscript(
              value=Name(id='d', ctx=Load()),
              slice=Call(
                func=Attribute(
                  value=Name(id='k', ctx=Load()),
                  attr='strip',
                  ctx=Load())),
              ctx=Store())],
          value=Call(
            func=Attribute(
              value=Name(id='v', ctx=Load()),
              attr='strip',
              ctx=Load())))]),
    Return(
      value=Name(id='d', ctx=Load()))])
SUPERVISOR_FUNC_1_AST_END
SUPERVISOR_FUNC_2_NAME=gather
SUPERVISOR_FUNC_2_LINENO=110
SUPERVISOR_FUNC_2_ENDLINENO=347
SUPERVISOR_FUNC_2_NAMES=APP_FRESHNESS_PROBE,Exception,M,MONITOR_HEALTH_AGE_MAX,Path,S,age_seconds_from_ts,append,base,core_cmd,facts,files,get,group,health_age,int,items,k,local_units,m,mon,name,opened,out,p,parse_env_text,probe,probe_out,probe_rc,problems,props,quote,rc,re,read_text,reg_cmd,reg_out,reg_rc,registry_source,replace,reports,resolved,route,route_lines,run,search,section,shlex,splitlines,ssh_edge,startswith,str,strip,systemctl_props,timer_active,timer_enabled,timers_text,u,wm,worker_path,worker_target,worker_text
SUPERVISOR_FUNC_2_AST_BEGIN
FunctionDef(
  name='gather',
  args=arguments(),
  body=[
    Assign(
      targets=[
        Name(id='facts', ctx=Store())],
      value=Dict()),
    Assign(
      targets=[
        Name(id='problems', ctx=Store())],
      value=List(ctx=Load())),
    Assign(
      targets=[
        Name(id='core_cmd', ctx=Store())],
      value=Constant(value='<STR len=870 sha=810f6d32471c23a6>')),
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='rc', ctx=Store()),
            Name(id='out', ctx=Store())],
          ctx=Store())],
      value=Call(
        func=Name(id='ssh_edge', ctx=Load()),
        args=[
          Name(id='core_cmd', ctx=Load())],
        keywords=[
          keyword(
            arg='timeout',
            value=Constant(value=45))])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='core_ssh_rc'),
          ctx=Store())],
      value=Call(
        func=Name(id='str', ctx=Load()),
        args=[
          Name(id='rc', ctx=Load())])),
    If(
      test=Compare(
        left=Name(id='rc', ctx=Load()),
        ops=[
          NotEq()],
        comparators=[
          Constant(value=0)]),
      body=[
        Expr(
          value=Call(
            func=Attribute(
              value=Name(id='problems', ctx=Load()),
              attr='append',
              ctx=Load()),
            args=[
              Constant(value='core_ssh_failed')]))]),
    FunctionDef(
      name='section',
      args=arguments(
        args=[
          arg(arg='name')]),
      body=[
        Assign(
          targets=[
            Name(id='m', ctx=Store())],
          value=Call(
            func=Attribute(
              value=Name(id='re', ctx=Load()),
              attr='search',
              ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='__'),
                  FormattedValue(
                    value=Name(id='name', ctx=Load()),
                    conversion=-1),
                  Constant(value='_BEGIN__\\n(.*?)\\n__'),
                  FormattedValue(
                    value=Name(id='name', ctx=Load()),
                    conversion=-1),
                  Constant(value='_END__')]),
              Name(id='out', ctx=Load()),
              Attribute(
                value=Name(id='re', ctx=Load()),
                attr='S',
                ctx=Load())])),
        Return(
          value=IfExp(
            test=Name(id='m', ctx=Load()),
            body=Call(
              func=Attribute(
                value=Call(
                  func=Attribute(
                    value=Name(id='m', ctx=Load()),
                    attr='group',
                    ctx=Load()),
                  args=[
                    Constant(value=1)]),
                attr='strip',
                ctx=Load())),
            orelse=Constant(value='')))]),
    Assign(
      targets=[
        Name(id='mon', ctx=Store())],
      value=Call(
        func=Name(id='parse_env_text', ctx=Load()),
        args=[
          Call(
            func=Name(id='section', ctx=Load()),
            args=[
              Constant(value='MONITOR_HEALTH')])])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_status'),
          ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='mon', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='STATUS'),
          Constant(value='MISSING')])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_reports'),
          ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='mon', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='reports'),
          Constant(value='')])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_open'),
          ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='mon', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='open'),
          Constant(value='')])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_resolved'),
          ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='mon', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='resolved'),
          Constant(value='')])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_smtp_configured'),
          ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='mon', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='smtp_configured'),
          Constant(value='')])),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_health_age_seconds'),
          ctx=Store())],
      value=Call(
        func=Name(id='str', ctx=Load()),
        args=[
          Call(
            func=Name(id='age_seconds_from_ts', ctx=Load()),
            args=[
              Call(
                func=Attribute(
                  value=Name(id='mon', ctx=Load()),
                  attr='get',
                  ctx=Load()),
                args=[
                  Constant(value='TS')])])])),
    If(
      test=Compare(
        left=Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_status'),
          ctx=Load()),
        ops=[
          NotEq()],
        comparators=[
          Constant(value='OK')]),
      body=[
        Expr(
          value=Call(
            func=Attribute(
              value=Name(id='problems', ctx=Load()),
              attr='append',
              ctx=Load()),
            args=[
              Constant(value='monitor_status_not_ok')]))]),
    Try(
      body=[
        Assign(
          targets=[
            Name(id='health_age', ctx=Store())],
          value=Call(
            func=Name(id='int', ctx=Load()),
            args=[
              Subscript(
                value=Name(id='facts', ctx=Load()),
                slice=Constant(value='monitor_health_age_seconds'),
                ctx=Load())])),
        If(
          test=Compare(
            left=Name(id='health_age', ctx=Load()),
            ops=[
              Gt()],
            comparators=[
              Name(id='MONITOR_HEALTH_AGE_MAX', ctx=Load())]),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='monitor_health_stale')]))])],
      handlers=[
        ExceptHandler(
          type=Name(id='Exception', ctx=Load()),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='monitor_health_age_invalid')]))])]),
    Try(
      body=[
        Assign(
          targets=[
            Name(id='reports', ctx=Store())],
          value=Call(
            func=Name(id='int', ctx=Load()),
            args=[
              Subscript(
                value=Name(id='facts', ctx=Load()),
                slice=Constant(value='monitor_reports'),
                ctx=Load())])),
        Assign(
          targets=[
            Name(id='opened', ctx=Store())],
          value=Call(
            func=Name(id='int', ctx=Load()),
            args=[
              Subscript(
                value=Name(id='facts', ctx=Load()),
                slice=Constant(value='monitor_open'),
                ctx=Load())])),
        Assign(
          targets=[
            Name(id='resolved', ctx=Store())],
          value=Call(
            func=Name(id='int', ctx=Load()),
            args=[
              Subscript(
                value=Name(id='facts', ctx=Load()),
                slice=Constant(value='monitor_resolved'),
                ctx=Load())])),
        If(
          test=Compare(
            left=Name(id='reports', ctx=Load()),
            ops=[
              LtE()],
            comparators=[
              Constant(value=0)]),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='monitor_reports_zero_or_missing')]))]),
        If(
          test=BoolOp(
            op=Or(),
            values=[
              Compare(
                left=Name(id='opened', ctx=Load()),
                ops=[
                  Lt()],
                comparators=[
                  Constant(value=0)]),
              Compare(
                left=Name(id='resolved', ctx=Load()),
                ops=[
                  Lt()],
                comparators=[
                  Constant(value=0)]),
              Compare(
                left=BinOp(
                  left=Name(id='opened', ctx=Load()),
                  op=Add(),
                  right=Name(id='resolved', ctx=Load())),
                ops=[
                  NotEq()],
                comparators=[
                  Name(id='reports', ctx=Load())])]),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='monitor_counts_invalid')]))])],
      handlers=[
        ExceptHandler(
          type=Name(id='Exception', ctx=Load()),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='monitor_counts_missing')]))])]),
    If(
      test=Compare(
        left=Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_smtp_configured'),
          ctx=Load()),
        ops=[
          NotEq()],
        comparators=[
          Constant(value='yes')]),
      body=[
        Expr(
          value=Call(
            func=Attribute(
              value=Name(id='problems', ctx=Load()),
              attr='append',
              ctx=Load()),
            args=[
              Constant(value='monitor_smtp_not_configured')]))]),
    Assign(
      targets=[
        Name(id='timers_text', ctx=Store())],
      value=Call(
        func=Name(id='section', ctx=Load()),
        args=[
          Constant(value='TIMERS')])),
    Assign(
      targets=[
        Name(id='m', ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='re', ctx=Load()),
          attr='search',
          ctx=Load()),
        args=[
          Constant(value='skladchik-reports-monitor\\.timer\\s+enabled=([^\\s]+)\\s+active=([^\\s]+)'),
          Name(id='timers_text', ctx=Load())])),
    Assign(
      targets=[
        Name(id='timer_enabled', ctx=Store())],
      value=IfExp(
        test=Name(id='m', ctx=Load()),
        body=Call(
          func=Attribute(
            value=Name(id='m', ctx=Load()),
            attr='group',
            ctx=Load()),
          args=[
            Constant(value=1)]),
        orelse=Constant(value='missing'))),
    Assign(
      targets=[
        Name(id='timer_active', ctx=Store())],
      value=IfExp(
        test=Name(id='m', ctx=Load()),
        body=Call(
          func=Attribute(
            value=Name(id='m', ctx=Load()),
            attr='group',
            ctx=Load()),
          args=[
            Constant(value=2)]),
        orelse=Constant(value='missing'))),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_timer_enabled'),
          ctx=Store())],
      value=Name(id='timer_enabled', ctx=Load())),
    Assign(
      targets=[
        Subscript(
          value=Name(id='facts', ctx=Load()),
          slice=Constant(value='monitor_timer_active'),
          ctx=Store())],
      value=Name(id='timer_active', ctx=Load())),
    If(
      test=Compare(
        left=Name(id='timer_enabled', ctx=Load()),
        ops=[
          NotEq()],
        comparators=[
          Constant(value='enabled')]),
      body=[
        Expr(
          value=Call(
            func=Attribute(
              value=Name(id='problems', ctx=Load()),
              attr='append',
              ctx=Load()),
            args=[
              Constant(value='monitor_timer_not_enabled')]))]),
    If(
      test=Compare(
        left=Name(id='timer_active', ctx=Load()),
        ops=[
          NotEq()],
        comparators=[
          Constant(value='active')]),
      body=[
        Expr(
          value=Call(
            func=Attribute(
              value=Name(id='problems', ctx=Load()),
              attr='append',
              ctx=Load()),
            args=[
              Constant(value='monitor_timer_not_active')]))]),
    Assign(
      targets=[
        Name(id='route_lines', ctx=Store())],
      value=Call(
        func=Attribute(
          value=Call(
            func=Name(id='section', ctx=Load()),
            args=[
              Constant(value='ROUTE')]),
          att
<TRUNCATED len=32262 sha=ed5d6c179095d9303280fce46b2a815ee2f05348c6e2774d6db13ee393436cb6>
SUPERVISOR_FUNC_2_AST_END
SUPERVISOR_FUNC_3_NAME=render_body
SUPERVISOR_FUNC_3_LINENO=349
SUPERVISOR_FUNC_3_ENDLINENO=378
SUPERVISOR_FUNC_3_NAMES=facts,get,join,lines,none_text,problems,status,str
SUPERVISOR_FUNC_3_AST_BEGIN
FunctionDef(
  name='render_body',
  args=arguments(
    args=[
      arg(arg='status'),
      arg(arg='facts'),
      arg(arg='problems'),
      arg(arg='mode')]),
  body=[
    Assign(
      targets=[
        Name(id='none_text', ctx=Store())],
      value=Constant(value='нет')),
    Assign(
      targets=[
        Name(id='lines', ctx=Store())],
      value=List(
        elts=[
          Constant(value='Надзор мониторинга жалоб Складчика'),
          Constant(value=''),
          BinOp(
            left=Constant(value='Статус: '),
            op=Add(),
            right=Name(id='status', ctx=Load())),
          BinOp(
            left=Constant(value='Проблемы: '),
            op=Add(),
            right=IfExp(
              test=Name(id='problems', ctx=Load()),
              body=Call(
                func=Attribute(
                  value=Constant(value=', '),
                  attr='join',
                  ctx=Load()),
                args=[
                  Name(id='problems', ctx=Load())]),
              orelse=Name(id='none_text', ctx=Load()))),
          Constant(value=''),
          Constant(value='Основной монитор:'),
          Constant(value='<STR len=33 sha=40b00748b4622055>'),
          BinOp(
            left=Constant(value='- status: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='monitor_status'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- reports: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='monitor_reports'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- open: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='monitor_open'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- resolved: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='monitor_resolved'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- route: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='netbird_route'),
                    Constant(value='')])])),
          Constant(value=''),
          Constant(value='Canonical backup:'),
          BinOp(
            left=Constant(value='- decision: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='canonical_backup_decision'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- generation: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='canonical_backup_generation'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- registry source: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='registry_source'),
                    Constant(value='')])])),
          BinOp(
            left=Constant(value='- worker target: '),
            op=Add(),
            right=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Call(
                  func=Attribute(
                    value=Name(id='facts', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='worker_target'),
                    Constant(value='')])]))],
        ctx=Load())),
    Return(
      value=Call(
        func=Attribute(
          value=Constant(value='\n'),
          attr='join',
          ctx=Load()),
        args=[
          Name(id='lines', ctx=Load())]))])
SUPERVISOR_FUNC_3_AST_END
SUPERVISOR_FUNC_4_NAME=main
SUPERVISOR_FUNC_4_LINENO=395
SUPERVISOR_FUNC_4_ENDLINENO=515
SUPERVISOR_FUNC_4_NAMES=append,argv,edge_mail,facts,gather,get,join,len,log,mail_sent,mode,old,old_status,print,problems,read_state,render_body,status,stderr,subject,sys,write_health,write_state
SUPERVISOR_FUNC_4_AST_BEGIN
FunctionDef(
  name='main',
  args=arguments(),
  body=[
    Assign(
      targets=[
        Name(id='mode', ctx=Store())],
      value=IfExp(
        test=Compare(
          left=Call(
            func=Name(id='len', ctx=Load()),
            args=[
              Attribute(
                value=Name(id='sys', ctx=Load()),
                attr='argv',
                ctx=Load())]),
          ops=[
            Gt()],
          comparators=[
            Constant(value=1)]),
        body=Subscript(
          value=Attribute(
            value=Name(id='sys', ctx=Load()),
            attr='argv',
            ctx=Load()),
          slice=Constant(value=1),
          ctx=Load()),
        orelse=Constant(value='check'))),
    If(
      test=Compare(
        left=Name(id='mode', ctx=Load()),
        ops=[
          NotIn()],
        comparators=[
          Tuple(
            elts=[
              Constant(value='check'),
              Constant(value='test')],
            ctx=Load())]),
      body=[
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              Constant(value='usage: skladchik-reports-monitor-supervisor [check|test]')],
            keywords=[
              keyword(
                arg='file',
                value=Attribute(
                  value=Name(id='sys', ctx=Load()),
                  attr='stderr',
                  ctx=Load()))])),
        Return(
          value=Constant(value=2))]),
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='facts', ctx=Store()),
            Name(id='problems', ctx=Store())],
          ctx=Store())],
      value=Call(
        func=Name(id='gather', ctx=Load()))),
    Assign(
      targets=[
        Name(id='status', ctx=Store())],
      value=IfExp(
        test=UnaryOp(
          op=Not(),
          operand=Name(id='problems', ctx=Load())),
        body=Constant(value='OK'),
        orelse=Constant(value='FAIL'))),
    If(
      test=Compare(
        left=Name(id='mode', ctx=Load()),
        ops=[
          Eq()],
        comparators=[
          Constant(value='test')]),
      body=[
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='SUPERVISOR_STATUS='),
                  FormattedValue(
                    value=Name(id='status', ctx=Load()),
                    conversion=-1)])])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              BinOp(
                left=Constant(value='SUPERVISOR_PROBLEMS='),
                op=Add(),
                right=IfExp(
                  test=Name(id='problems', ctx=Load()),
                  body=Call(
                    func=Attribute(
                      value=Constant(value=','),
                      attr='join',
                      ctx=Load()),
                    args=[
                      Name(id='problems', ctx=Load())]),
                  orelse=Constant(value='none')))])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='MONITOR='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='monitor_status')]),
                    conversion=-1),
                  Constant(value=' reports='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='monitor_reports')]),
                    conversion=-1),
                  Constant(value=' open='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='monitor_open')]),
                    conversion=-1),
                  Constant(value=' resolved='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='monitor_resolved')]),
                    conversion=-1)])])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='CANONICAL_BACKUP='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='canonical_backup_decision')]),
                    conversion=-1),
                  Constant(value=' generation='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='canonical_backup_generation')]),
                    conversion=-1)])])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='REGISTRY_SOURCE='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='registry_source')]),
                    conversion=-1)])])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='WORKER_TARGET='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='worker_target')]),
                    conversion=-1)])])),
        Expr(
          value=Call(
            func=Name(id='print', ctx=Load()),
            args=[
              JoinedStr(
                values=[
                  Constant(value='NETBIRD_ROUTE='),
                  FormattedValue(
                    value=Call(
                      func=Attribute(
                        value=Name(id='facts', ctx=Load()),
                        attr='get',
                        ctx=Load()),
                      args=[
                        Constant(value='netbird_route')]),
                    conversion=-1)])])),
        Return(
          value=IfExp(
            test=Compare(
              left=Name(id='status', ctx=Load()),
              ops=[
                Eq()],
              comparators=[
                Constant(value='OK')]),
            body=Constant(value=0),
            orelse=Constant(value=1)))]),
    Assign(
      targets=[
        Name(id='old', ctx=Store())],
      value=Call(
        func=Name(id='read_state', ctx=Load()))),
    Assign(
      targets=[
        Name(id='old_status', ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='old', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='LAST_STATUS'),
          Constant(value='')])),
    Assign(
      targets=[
        Name(id='mail_sent', ctx=Store())],
      value=Constant(value=False)),
    If(
      test=BoolOp(
        op=And(),
        values=[
          Compare(
            left=Name(id='status', ctx=Load()),
            ops=[
              NotEq()],
            comparators=[
              Constant(value='OK')]),
          Compare(
            left=Name(id='old_status', ctx=Load()),
            ops=[
              NotEq()],
            comparators=[
              Constant(value='FAIL')])]),
      body=[
        Assign(
          targets=[
            Name(id='subject', ctx=Store())],
          value=Constant(value='[Складчик] ТРЕВОГА: мониторинг жалоб')),
        Assign(
          targets=[
            Name(id='mail_sent', ctx=Store())],
          value=Call(
            func=Name(id='edge_mail', ctx=Load()),
            args=[
              Name(id='subject', ctx=Load()),
              Call(
                func=Name(id='render_body', ctx=Load()),
                args=[
                  Name(id='status', ctx=Load()),
                  Name(id='facts', ctx=Load()),
                  Name(id='problems', ctx=Load()),
                  Name(id='mode', ctx=Load())])])),
        If(
          test=UnaryOp(
            op=Not(),
            operand=Name(id='mail_sent', ctx=Load())),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='problems', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Constant(value='supervisor_mail_send_failed')])),
            Assign(
              targets=[
                Name(id='status', ctx=Store())],
              value=Constant(value='FAIL'))])],
      orelse=[
        If(
          test=BoolOp(
            op=And(),
            values=[
              Compare(
                left=Name(id='status', ctx=Load()),
                ops=[
                  Eq()],
                comparators=[
                  Constant(value='OK')]),
              Compare(
                left=Name(id='old_status', ctx=Load()),
                ops=[
                  Eq()],
                comparators=[
                  Constant(value='FAIL')])]),
          body=[
            Assign(
              targets=[
                Name(id='subject', ctx=Store())],
              value=Constant(value='[Складчик] ВОССТАНОВЛЕНО: мониторинг жалоб и backup снова OK')),
            Assign(
              targets=[
                Name(id='mail_sent', ctx=Store())],
              value=Call(
                func=Name(id='edge_mail', ctx=Load()),
                args=[
                  Name(id='subject', ctx=Load()),
                  Call(
                    func=Name(id='render_body', ctx=Load()),
                    args=[
                      Name(id='status', ctx=Load()),
                      Name(id='facts', ctx=Load()),
                      Name(id='problems', ctx=Load()),
                      Name(id='mode', ctx=Load())])])),
            If(
              test=UnaryOp(
                op=Not(),
                operand=Name(id='mail_sent', ctx=Load())),
              body=[
                Expr(
                  value=Call(
                    func=Attribute(
                      value=Name(id='problems', ctx=Load()),
                      attr='append',
                      ctx=Load()),
                    args=[
                      Constant(value='supervisor_mail_send_failed')])),
                Assign(
                  targets=[
                    Name(id='status', ctx=Store())],
                  value=Constant(value='FAIL'))])])]),
    Expr(
      value=Call(
        func=Name(id='write_health', ctx=Load()),
        args=[
          Name(id='status', ctx=Load()),
          Name(id='facts', ctx=Load()),
          Name(id='problems', ctx=Load()),
          Name(id='mail_sent', ctx=Load())])),
    Expr(
      value=Call(
        func=Name(id='write_state', ctx=Load()),
        args=[
          Name(id='status', ctx=Load()),
          Name(id='problems', ctx=Load())])),
    Expr(
      value=Call(
        func=Name(id='print', ctx=Load()),
        args=[
          JoinedStr(
            values=[
              Constant(value='SUPERVISOR_STATUS='),
              FormattedValue(
                value=Name(id='status', ctx=Load()),
                conversion=-1)])])),
    Expr(
      value=Call(
        func=Name(id='print', ctx=Load()),
        args=[
          JoinedStr(
            values=[
              Constant(value='SUPERVISOR_MAIL_SENT='),
              FormattedValue(
                value=IfExp(
                  test=Name(id='mail_sent', ctx=Load()),
                  body=Constant(value='yes'),
                  orelse=Constant(value='no')),
                conversion=-1)])])),
    Expr(
      value=Call(
        func=Name(id='print', ctx=Load()),
        args=[
          BinOp(
            left=Constant(value='SUPERVISOR_PROBLEMS='),
            op=Add(),
            right=IfExp(
              test=Name(id='problems', ctx=Load()),
              body=Call(
                func=Attribute(
                  value=Constant(value=','),
                  attr='join',
                  ctx=Load()),
                args=[
                  Name(id='problems', ctx=Load())]),
              orelse=Constant(value='none')))])),
    Expr(
      value=Call(
        func=Name(id='print', ctx=Load()),
        args=[
          JoinedStr(
            values=[
              Constant(value='MONITOR='),
              FormattedValue(
                value=Call(
                  
<TRUNCATED len=18945 sha=f4a4af5518b9647f5f52013dd810094b555b6d99d4ad6f11ff77ca4917259a39>
SUPERVISOR_FUNC_4_AST_END
BACKUP_AUDIT_PRESENT=true
BACKUP_AUDIT_SHA=1c2cd8a00859492c010ed35baf5eb67f4278544809de8c2563421a6f3e356ed3
BACKUP_AUDIT_BASENAME=homelab-backup-audit
BACKUP_AUDIT_AST_OK=true
BACKUP_AUDIT_FUNCTION_COUNT=7
BACKUP_AUDIT_FUNCTIONS=run,collect,parse_epoch,latest_legacy,unit_ok,parse_app_plan,expected_v2_heavy_lock_owner
BACKUP_AUDIT_CLI_OPTION_COUNT=0
BACKUP_AUDIT_CLI_OPTIONS=NONE
BACKUP_AUDIT_ENV_NAME_COUNT=0
BACKUP_AUDIT_ENV_NAMES=NONE
BACKUP_AUDIT_RELEVANT_FUNCTION_COUNT=4
BACKUP_AUDIT_FUNC_1_NAME=collect
BACKUP_AUDIT_FUNC_1_LINENO=34
BACKUP_AUDIT_FUNC_1_ENDLINENO=39
BACKUP_AUDIT_FUNC_1_NAMES=append,collect,dict,get,isinstance,list,obj,out,str,v,values
BACKUP_AUDIT_FUNC_1_AST_BEGIN
FunctionDef(
  name='collect',
  args=arguments(
    args=[
      arg(arg='obj'),
      arg(arg='out')]),
  body=[
    If(
      test=Call(
        func=Name(id='isinstance', ctx=Load()),
        args=[
          Name(id='obj', ctx=Load()),
          Name(id='dict', ctx=Load())]),
      body=[
        If(
          test=Call(
            func=Name(id='isinstance', ctx=Load()),
            args=[
              Call(
                func=Attribute(
                  value=Name(id='obj', ctx=Load()),
                  attr='get',
                  ctx=Load()),
                args=[
                  Constant(value='logical_id')]),
              Name(id='str', ctx=Load())]),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='out', ctx=Load()),
                  attr='append',
                  ctx=Load()),
                args=[
                  Name(id='obj', ctx=Load())]))]),
        For(
          target=Name(id='v', ctx=Store()),
          iter=Call(
            func=Attribute(
              value=Name(id='obj', ctx=Load()),
              attr='values',
              ctx=Load())),
          body=[
            Expr(
              value=Call(
                func=Name(id='collect', ctx=Load()),
                args=[
                  Name(id='v', ctx=Load()),
                  Name(id='out', ctx=Load())]))])],
      orelse=[
        If(
          test=Call(
            func=Name(id='isinstance', ctx=Load()),
            args=[
              Name(id='obj', ctx=Load()),
              Name(id='list', ctx=Load())]),
          body=[
            For(
              target=Name(id='v', ctx=Store()),
              iter=Name(id='obj', ctx=Load()),
              body=[
                Expr(
                  value=Call(
                    func=Name(id='collect', ctx=Load()),
                    args=[
                      Name(id='v', ctx=Load()),
                      Name(id='out', ctx=Load())]))])])])])
BACKUP_AUDIT_FUNC_1_AST_END
BACKUP_AUDIT_FUNC_2_NAME=latest_legacy
BACKUP_AUDIT_FUNC_2_LINENO=53
BACKUP_AUDIT_FUNC_2_ENDLINENO=77
BACKUP_AUDIT_FUNC_2_NAMES=APPREST,Exception,QROOT,VMREST,age,best,best_epoch,d,epoch,gen,get,glob,int,is_dir,is_file,json,kind,loads,logical,max,obj,p,parse_epoch,read_text,restore,rev,rj,rroot,score,st_mtime,stat,str,strict,time
BACKUP_AUDIT_FUNC_2_AST_BEGIN
FunctionDef(
  name='latest_legacy',
  args=arguments(
    args=[
      arg(arg='logical'),
      arg(arg='kind')]),
  body=[
    Assign(
      targets=[
        Name(id='d', ctx=Store())],
      value=BinOp(
        left=Name(id='QROOT', ctx=Load()),
        op=Div(),
        right=Name(id='logical', ctx=Load()))),
    Assign(
      targets=[
        Name(id='best', ctx=Store())],
      value=Constant(value=None)),
    Assign(
      targets=[
        Name(id='best_epoch', ctx=Store())],
      value=UnaryOp(
        op=USub(),
        operand=Constant(value=1))),
    If(
      test=UnaryOp(
        op=Not(),
        operand=Call(
          func=Attribute(
            value=Name(id='d', ctx=Load()),
            attr='is_dir',
            ctx=Load()))),
      body=[
        Return(
          value=Constant(value=None))]),
    For(
      target=Name(id='p', ctx=Store()),
      iter=Call(
        func=Attribute(
          value=Name(id='d', ctx=Load()),
          attr='glob',
          ctx=Load()),
        args=[
          Constant(value='*.json')]),
      body=[
        Try(
          body=[
            Assign(
              targets=[
                Name(id='obj', ctx=Store())],
              value=Call(
                func=Attribute(
                  value=Name(id='json', ctx=Load()),
                  attr='loads',
                  ctx=Load()),
                args=[
                  Call(
                    func=Attribute(
                      value=Name(id='p', ctx=Load()),
                      attr='read_text',
                      ctx=Load()),
                    keywords=[
                      keyword(
                        arg='encoding',
                        value=Constant(value='utf-8'))])]))],
          handlers=[
            ExceptHandler(
              type=Name(id='Exception', ctx=Load()),
              body=[
                Continue()])]),
        Assign(
          targets=[
            Name(id='epoch', ctx=Store())],
          value=Call(
            func=Name(id='parse_epoch', ctx=Load()),
            args=[
              Name(id='obj', ctx=Load())])),
        Assign(
          targets=[
            Name(id='score', ctx=Store())],
          value=IfExp(
            test=Compare(
              left=Name(id='epoch', ctx=Load()),
              ops=[
                IsNot()],
              comparators=[
                Constant(value=None)]),
            body=Name(id='epoch', ctx=Load()),
            orelse=Call(
              func=Name(id='int', ctx=Load()),
              args=[
                Attribute(
                  value=Call(
                    func=Attribute(
                      value=Name(id='p', ctx=Load()),
                      attr='stat',
                      ctx=Load())),
                  attr='st_mtime',
                  ctx=Load())]))),
        If(
          test=Compare(
            left=Name(id='score', ctx=Load()),
            ops=[
              Gt()],
            comparators=[
              Name(id='best_epoch', ctx=Load())]),
          body=[
            Assign(
              targets=[
                Name(id='best_epoch', ctx=Store())],
              value=Name(id='score', ctx=Load())),
            Assign(
              targets=[
                Name(id='best', ctx=Store())],
              value=Tuple(
                elts=[
                  Name(id='p', ctx=Load()),
                  Name(id='obj', ctx=Load()),
                  Name(id='score', ctx=Load())],
                ctx=Load()))])]),
    If(
      test=UnaryOp(
        op=Not(),
        operand=Name(id='best', ctx=Load())),
      body=[
        Return(
          value=Constant(value=None))]),
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='p', ctx=Store()),
            Name(id='obj', ctx=Store()),
            Name(id='epoch', ctx=Store())],
          ctx=Store())],
      value=Name(id='best', ctx=Load())),
    Assign(
      targets=[
        Name(id='gen', ctx=Store())],
      value=Call(
        func=Attribute(
          value=Name(id='obj', ctx=Load()),
          attr='get',
          ctx=Load()),
        args=[
          Constant(value='generation')])),
    Assign(
      targets=[
        Name(id='strict', ctx=Store())],
      value=BoolOp(
        op=And(),
        values=[
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='status')]),
            ops=[
              Eq()],
            comparators=[
              Constant(value='SEALED')]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='cloud_quorum')]),
            ops=[
              Eq()],
            comparators=[
              Constant(value=2)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='cloud_a_verified')]),
            ops=[
              Is()],
            comparators=[
              Constant(value=True)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='cloud_b_verified')]),
            ops=[
              Is()],
            comparators=[
              Constant(value=True)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='part_hashes_verified')]),
            ops=[
              Is()],
            comparators=[
              Constant(value=True)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='seal_written')]),
            ops=[
              Is()],
            comparators=[
              Constant(value=True)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='local_payload_present')]),
            ops=[
              Is()],
            comparators=[
              Constant(value=False)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='obj', ctx=Load()),
                attr='get',
                ctx=Load()),
              args=[
                Constant(value='local_cleanup')]),
            ops=[
              Eq()],
            comparators=[
              Constant(value='OK')])])),
    Assign(
      targets=[
        Name(id='rroot', ctx=Store())],
      value=IfExp(
        test=Compare(
          left=Name(id='kind', ctx=Load()),
          ops=[
            Eq()],
          comparators=[
            Constant(value='VM')]),
        body=Name(id='VMREST', ctx=Load()),
        orelse=Name(id='APPREST', ctx=Load()))),
    Assign(
      targets=[
        Name(id='rev', ctx=Store())],
      value=IfExp(
        test=Name(id='gen', ctx=Load()),
        body=BinOp(
          left=BinOp(
            left=Name(id='rroot', ctx=Load()),
            op=Div(),
            right=Name(id='logical', ctx=Load())),
          op=Div(),
          right=BinOp(
            left=Call(
              func=Name(id='str', ctx=Load()),
              args=[
                Name(id='gen', ctx=Load())]),
            op=Add(),
            right=Constant(value='.json'))),
        orelse=Constant(value=None))),
    Assign(
      targets=[
        Name(id='restore', ctx=Store())],
      value=Constant(value=False)),
    If(
      test=BoolOp(
        op=And(),
        values=[
          Name(id='rev', ctx=Load()),
          Call(
            func=Attribute(
              value=Name(id='rev', ctx=Load()),
              attr='is_file',
              ctx=Load()))]),
      body=[
        Try(
          body=[
            Assign(
              targets=[
                Name(id='rj', ctx=Store())],
              value=Call(
                func=Attribute(
                  value=Name(id='json', ctx=Load()),
                  attr='loads',
                  ctx=Load()),
                args=[
                  Call(
                    func=Attribute(
                      value=Name(id='rev', ctx=Load()),
                      attr='read_text',
                      ctx=Load()),
                    keywords=[
                      keyword(
                        arg='encoding',
                        value=Constant(value='utf-8'))])])),
            Assign(
              targets=[
                Name(id='restore', ctx=Store())],
              value=Compare(
                left=Call(
                  func=Attribute(
                    value=Name(id='rj', ctx=Load()),
                    attr='get',
                    ctx=Load()),
                  args=[
                    Constant(value='result')]),
                ops=[
                  Eq()],
                comparators=[
                  Constant(value='OK')]))],
          handlers=[
            ExceptHandler(
              type=Name(id='Exception', ctx=Load()),
              body=[
                Pass()])])]),
    Assign(
      targets=[
        Name(id='age', ctx=Store())],
      value=IfExp(
        test=Name(id='epoch', ctx=Load()),
        body=Call(
          func=Name(id='max', ctx=Load()),
          args=[
            Constant(value=0),
            Call(
              func=Name(id='int', ctx=Load()),
              args=[
                BinOp(
                  left=Call(
                    func=Attribute(
                      value=Name(id='time', ctx=Load()),
                      attr='time',
                      ctx=Load())),
                  op=Sub(),
                  right=Name(id='epoch', ctx=Load()))])]),
        orelse=Constant(value=None))),
    Return(
      value=Dict(
        keys=[
          Constant(value='generation'),
          Constant(value='strict'),
          Constant(value='restore_ok'),
          Constant(value='age_seconds'),
          Constant(value='state_file'),
          Constant(value='obj')],
        values=[
          Name(id='gen', ctx=Load()),
          Name(id='strict', ctx=Load()),
          Name(id='restore', ctx=Load()),
          Name(id='age', ctx=Load()),
          Call(
            func=Name(id='str', ctx=Load()),
            args=[
              Name(id='p', ctx=Load())]),
          Name(id='obj', ctx=Load())]))])
BACKUP_AUDIT_FUNC_2_AST_END
BACKUP_AUDIT_FUNC_3_NAME=parse_app_plan
BACKUP_AUDIT_FUNC_3_LINENO=84
BACKUP_AUDIT_FUNC_3_ENDLINENO=93
BACKUP_AUDIT_FUNC_3_NAMES=d,get,k,line,r,split,splitlines,startswith,tok,txt,v
BACKUP_AUDIT_FUNC_3_AST_BEGIN
FunctionDef(
  name='parse_app_plan',
  args=arguments(
    args=[
      arg(arg='txt')]),
  body=[
    Assign(
      targets=[
        Name(id='d', ctx=Store())],
      value=Dict()),
    For(
      target=Name(id='line', ctx=Store()),
      iter=Call(
        func=Attribute(
          value=Name(id='txt', ctx=Load()),
          attr='splitlines',
          ctx=Load())),
      body=[
        If(
          test=Call(
            func=Attribute(
              value=Name(id='line', ctx=Load()),
              attr='startswith',
              ctx=Load()),
            args=[
              Constant(value='QUEUE_FRESHNESS_PLAN APP=')]),
          body=[
            Assign(
              targets=[
                Name(id='r', ctx=Store())],
              value=Dict()),
            For(
              target=Name(id='tok', ctx=Store()),
              iter=Subscript(
                value=Call(
                  func=Attribute(
                    value=Name(id='line', ctx=Load()),
                    attr='split',
                    ctx=Load())),
                slice=Slice(
                  lower=Constant(value=1)),
                ctx=Load()),
              body=[
                If(
                  test=Compare(
                    left=Constant(value='='),
                    ops=[
                      In()],
                    comparators=[
                      Name(id='tok', ctx=Load())]),
                  body=[
                    Assign(
                      targets=[
                        Tuple(
                          elts=[
                            Name(id='k', ctx=Store()),
                            Name(id='v', ctx=Store())],
                          ctx=Store())],
                      value=Call(
                        func=Attribute(
                          value=Name(id='tok', ctx=Load()),
                          attr='split',
                          ctx=Load()),
                        args=[
                          Constant(value='='),
                          Constant(value=1)])),
                    Assign(
                      targets=[
                        Subscript(
                          value=Name(id='r', ctx=Load()),
                          slice=Name(id='k', ctx=Load()),
                          ctx=Store())],
                      value=Name(id='v', ctx=Load()))])]),
            If(
              test=Call(
                func=Attribute(
                  value=Name(id='r', ctx=Load()),
                  attr='get',
                  ctx=Load()),
                args=[
                  Constant(value='APP')]),
              body=[
                Assign(
                  targets=[
                    Subscript(
                      value=Name(id='d', ctx=Load()),
                      slice=Subscript(
                        value=Name(id='r', ctx=Load()),
                        slice=Constant(value='APP'),
                        ctx=Load()),
                      ctx=Store())],
                  value=Call(
                    func=Attribute(
                      value=Name(id='r', ctx=Load()),
                      attr='get',
                      ctx=Load()),
                    args=[
                      Constant(value='DECISION')]))])])]),
    Return(
      value=Name(id='d', ctx=Load()))])
BACKUP_AUDIT_FUNC_3_AST_END
BACKUP_AUDIT_FUNC_4_NAME=expected_v2_heavy_lock_owner
BACKUP_AUDIT_FUNC_4_LINENO=188
BACKUP_AUDIT_FUNC_4_ENDLINENO=200
BACKUP_AUDIT_FUNC_4_NAMES=Exception,_,a,add,arc,fe,fo,frc,int,isdigit,owners,pid,pid_text,prc,replace,run,set,split,strip,tok
BACKUP_AUDIT_FUNC_4_AST_BEGIN
FunctionDef(
  name='expected_v2_heavy_lock_owner',
  args=arguments(),
  body=[
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='arc', ctx=Store()),
            Name(id='a', ctx=Store()),
            Name(id='_', ctx=Store())],
          ctx=Store())],
      value=Call(
        func=Name(id='run', ctx=Load()),
        args=[
          List(
            elts=[
              Constant(value='systemctl'),
              Constant(value='show'),
              Constant(value='homelab-backup-v2.service'),
              Constant(value='-p'),
              Constant(value='ActiveState'),
              Constant(value='--value')],
            ctx=Load()),
          Constant(value=10)])),
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='prc', ctx=Store()),
            Name(id='pid_text', ctx=Store()),
            Name(id='_', ctx=Store())],
          ctx=Store())],
      value=Call(
        func=Name(id='run', ctx=Load()),
        args=[
          List(
            elts=[
              Constant(value='systemctl'),
              Constant(value='show'),
              Constant(value='homelab-backup-v2.service'),
              Constant(value='-p'),
              Constant(value='MainPID'),
              Constant(value='--value')],
            ctx=Load()),
          Constant(value=10)])),
    If(
      test=BoolOp(
        op=Or(),
        values=[
          Compare(
            left=Name(id='arc', ctx=Load()),
            ops=[
              NotEq()],
            comparators=[
              Constant(value=0)]),
          Compare(
            left=Name(id='prc', ctx=Load()),
            ops=[
              NotEq()],
            comparators=[
              Constant(value=0)]),
          Compare(
            left=Call(
              func=Attribute(
                value=Name(id='a', ctx=Load()),
                attr='strip',
                ctx=Load())),
            ops=[
              NotIn()],
            comparators=[
              Tuple(
                elts=[
                  Constant(value='active'),
                  Constant(value='activating')],
                ctx=Load())])]),
      body=[
        Return(
          value=Constant(value=False))]),
    Try(
      body=[
        Assign(
          targets=[
            Name(id='pid', ctx=Store())],
          value=Call(
            func=Name(id='int', ctx=Load()),
            args=[
              Call(
                func=Attribute(
                  value=Name(id='pid_text', ctx=Load()),
                  attr='strip',
                  ctx=Load()))]))],
      handlers=[
        ExceptHandler(
          type=Name(id='Exception', ctx=Load()),
          body=[
            Return(
              value=Constant(value=False))])]),
    If(
      test=Compare(
        left=Name(id='pid', ctx=Load()),
        ops=[
          LtE()],
        comparators=[
          Constant(value=0)]),
      body=[
        Return(
          value=Constant(value=False))]),
    Assign(
      targets=[
        Tuple(
          elts=[
            Name(id='frc', ctx=Store()),
            Name(id='fo', ctx=Store()),
            Name(id='fe', ctx=Store())],
          ctx=Store())],
      value=Call(
        func=Name(id='run', ctx=Load()),
        args=[
          List(
            elts=[
              Constant(value='fuser'),
              Constant(value='/run/homelab-backup-heavy.lock')],
            ctx=Load()),
          Constant(value=10)])),
    Assign(
      targets=[
        Name(id='owners', ctx=Store())],
      value=Call(
        func=Name(id='set', ctx=Load()))),
    For(
      target=Name(id='tok', ctx=Store()),
      iter=Call(
        func=Attribute(
          value=Call(
            func=Attribute(
              value=BinOp(
                left=BinOp(
                  left=Name(id='fo', ctx=Load()),
                  op=Add(),
                  right=Constant(value=' ')),
                op=Add(),
                right=Name(id='fe', ctx=Load())),
              attr='replace',
              ctx=Load()),
            args=[
              Constant(value=':'),
              Constant(value=' ')]),
          attr='split',
          ctx=Load())),
      body=[
        If(
          test=Call(
            func=Attribute(
              value=Name(id='tok', ctx=Load()),
              attr='isdigit',
              ctx=Load())),
          body=[
            Expr(
              value=Call(
                func=Attribute(
                  value=Name(id='owners', ctx=Load()),
                  attr='add',
                  ctx=Load()),
                args=[
                  Call(
                    func=Name(id='int', ctx=Load()),
                    args=[
                      Name(id='tok', ctx=Load())])]))])]),
    Return(
      value=BoolOp(
        op=And(),
        values=[
          Compare(
            left=Name(id='frc', ctx=Load()),
            ops=[
              Eq()],
            comparators=[
              Constant(value=0)]),
          Compare(
            left=Name(id='owners', ctx=Load()),
            ops=[
              Eq()],
            comparators=[
              Set(
                elts=[
                  Name(id='pid', ctx=Load())])])]))])
BACKUP_AUDIT_FUNC_4_AST_END
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_PRESENT=true
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_SHA=1f959049cca2710a2cb820cc1f6acab16399c6b6711b9e4522e0ecd49e0e4650
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_BASENAME=homelab-app-cloud-quorum-queue
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_OK=false
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_ERROR=SyntaxError
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_RC=64
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_SHA=53bc0423b5ea9142a7be1f687f1572975bc52349a1fd28f97d6c0748b2b445e1
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_BEGIN

APP_QUORUM_QUEUE_ERROR=ACTION_INVALID
QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_END
PRODUCER_SCRIPT_COUNT=3
PRODUCER_UNIT_COUNT=4
PRODUCER_UNIT_1_NAME=homelab-app-cloud-quorum-queue.service
PRODUCER_UNIT_1_SHOW_RC=0
PRODUCER_UNIT_1_LOADSTATE=loaded
PRODUCER_UNIT_1_ACTIVESTATE=inactive
PRODUCER_UNIT_1_UNITFILESTATE=static
PRODUCER_UNIT_1_RESULT=success
PRODUCER_UNIT_1_EXECMAINSTATUS=0
PRODUCER_UNIT_1_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.service
PRODUCER_UNIT_1_FRAGMENT_SHA=afaa997bd85dafdb29d2cd2b53527996171c21fd5e80ae559f8f2bee0dcbbf1a
PRODUCER_UNIT_1_EXECSTART_SHA=22094bb14d8dc5f7399744e183b096583a9c9625527a2f00981f2ec5cd8e1713
PRODUCER_UNIT_1_EXEC_COMPONENTS=NONE
PRODUCER_UNIT_1_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
PRODUCER_UNIT_2_NAME=homelab-app-cloud-quorum-queue.timer
PRODUCER_UNIT_2_SHOW_RC=0
PRODUCER_UNIT_2_LOADSTATE=loaded
PRODUCER_UNIT_2_ACTIVESTATE=active
PRODUCER_UNIT_2_UNITFILESTATE=enabled
PRODUCER_UNIT_2_RESULT=success
PRODUCER_UNIT_2_EXECMAINSTATUS=
PRODUCER_UNIT_2_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.timer
PRODUCER_UNIT_2_FRAGMENT_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078
PRODUCER_UNIT_2_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
PRODUCER_UNIT_2_EXEC_COMPONENTS=NONE
PRODUCER_UNIT_2_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
PRODUCER_UNIT_3_NAME=skladchik-reports-monitor-supervisor.service
PRODUCER_UNIT_3_SHOW_RC=0
PRODUCER_UNIT_3_LOADSTATE=loaded
PRODUCER_UNIT_3_ACTIVESTATE=inactive
PRODUCER_UNIT_3_UNITFILESTATE=static
PRODUCER_UNIT_3_RESULT=success
PRODUCER_UNIT_3_EXECMAINSTATUS=0
PRODUCER_UNIT_3_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.service
PRODUCER_UNIT_3_FRAGMENT_SHA=e874fb03573b76181f3eb812c7285848e60705923c172a2f102504a7b9100ef7
PRODUCER_UNIT_3_EXECSTART_SHA=27a2477643cbfc4f8676fd88ebc5cff23e471bc80f89094941123fa62e3edc5f
PRODUCER_UNIT_3_EXEC_COMPONENTS=skladchik-reports-monitor-supervisor
PRODUCER_UNIT_3_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
PRODUCER_UNIT_4_NAME=skladchik-reports-monitor-supervisor.timer
PRODUCER_UNIT_4_SHOW_RC=0
PRODUCER_UNIT_4_LOADSTATE=loaded
PRODUCER_UNIT_4_ACTIVESTATE=active
PRODUCER_UNIT_4_UNITFILESTATE=enabled
PRODUCER_UNIT_4_RESULT=success
PRODUCER_UNIT_4_EXECMAINSTATUS=
PRODUCER_UNIT_4_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.timer
PRODUCER_UNIT_4_FRAGMENT_SHA=3c3e38a40b3dfbfaa77d99a1c2bea4b58009130eac7a5197356dead1137a5ef6
PRODUCER_UNIT_4_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
PRODUCER_UNIT_4_EXEC_COMPONENTS=NONE
PRODUCER_UNIT_4_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
APPID_CONFIG_MATCH_COUNT=565
APPID_CONFIG_1_BASENAME=targets.json
APPID_CONFIG_1_PATH_HINT=//etc/homelab-backup/targets.json
APPID_CONFIG_1_SHA=2f526330152d49461ff66f50adab57d1a195ea5d1b4c292945d523411b8a68a8
APPID_CONFIG_1_LINE_NOS=115
APPID_CONFIG_2_BASENAME=targets.json.before-skladchik-core-apps-20261003T205612Z.bak
APPID_CONFIG_2_PATH_HINT=//etc/homelab-backup/targets.json.before-skladchik-core-apps-20261003T205612Z.bak
APPID_CONFIG_2_SHA=6ecf034ca03b52a1e6beceeae81d86a623885462c095d50b133aea4048a4626e
APPID_CONFIG_2_LINE_NOS=115
APPID_CONFIG_3_BASENAME=task.json
APPID_CONFIG_3_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192441Z-1666483-preflight/task.json
APPID_CONFIG_3_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_3_LINE_NOS=44,55,56,81,86
APPID_CONFIG_4_BASENAME=task.json
APPID_CONFIG_4_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192627Z-1668009-prepare/task.json
APPID_CONFIG_4_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_4_LINE_NOS=44,55,56,81,86
APPID_CONFIG_5_BASENAME=task.json
APPID_CONFIG_5_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192843Z-1681558-dry-run/task.json
APPID_CONFIG_5_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_5_LINE_NOS=44,55,56,81,86
APPID_CONFIG_6_BASENAME=task.json
APPID_CONFIG_6_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193210Z-1692269-apply/task.json
APPID_CONFIG_6_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_6_LINE_NOS=44,55,56,81,86
APPID_CONFIG_7_BASENAME=task.json
APPID_CONFIG_7_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193950Z-1722753-preflight/task.json
APPID_CONFIG_7_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_7_LINE_NOS=44,55,56,81,86
APPID_CONFIG_8_BASENAME=task.json
APPID_CONFIG_8_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1722941-prepare/task.json
APPID_CONFIG_8_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_8_LINE_NOS=44,55,56,81,86
APPID_CONFIG_9_BASENAME=task.json
APPID_CONFIG_9_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1723022-dry-run/task.json
APPID_CONFIG_9_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_9_LINE_NOS=44,55,56,81,86
APPID_CONFIG_10_BASENAME=task.json
APPID_CONFIG_10_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T194508Z-1738655-apply/task.json
APPID_CONFIG_10_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb
APPID_CONFIG_10_LINE_NOS=44,55,56,81,86
APPID_CONFIG_11_BASENAME=task.json
APPID_CONFIG_11_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200841Z-1818714-preflight/task.json
APPID_CONFIG_11_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec
APPID_CONFIG_11_LINE_NOS=44,55,56,81,86
APPID_CONFIG_12_BASENAME=task.json
APPID_CONFIG_12_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818903-prepare/task.json
APPID_CONFIG_12_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec
APPID_CONFIG_12_LINE_NOS=44,55,56,81,86
APPID_CONFIG_13_BASENAME=task.json
APPID_CONFIG_13_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818980-dry-run/task.json
APPID_CONFIG_13_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec
APPID_CONFIG_13_LINE_NOS=44,55,56,81,86
APPID_CONFIG_14_BASENAME=task.json
APPID_CONFIG_14_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201139Z-1833098-apply/task.json
APPID_CONFIG_14_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec
APPID_CONFIG_14_LINE_NOS=44,55,56,81,86
APPID_CONFIG_15_BASENAME=task.json
APPID_CONFIG_15_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201939Z-1860663-preflight/task.json
APPID_CONFIG_15_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68
APPID_CONFIG_15_LINE_NOS=44,55,56,81,86
APPID_CONFIG_16_BASENAME=task.json
APPID_CONFIG_16_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860857-prepare/task.json
APPID_CONFIG_16_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68
APPID_CONFIG_16_LINE_NOS=44,55,56,81,86
APPID_CONFIG_17_BASENAME=task.json
APPID_CONFIG_17_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860933-dry-run/task.json
APPID_CONFIG_17_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68
APPID_CONFIG_17_LINE_NOS=44,55,56,81,86
APPID_CONFIG_18_BASENAME=task.json
APPID_CONFIG_18_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T202241Z-1874939-apply/task.json
APPID_CONFIG_18_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68
APPID_CONFIG_18_LINE_NOS=44,55,56,81,86
APPID_CONFIG_19_BASENAME=task.json
APPID_CONFIG_19_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204310Z-1946040-preflight/task.json
APPID_CONFIG_19_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_19_LINE_NOS=44,55,56,81,86
APPID_CONFIG_20_BASENAME=task.json
APPID_CONFIG_20_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946265-prepare/task.json
APPID_CONFIG_20_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_20_LINE_NOS=44,55,56,81,86
APPID_CONFIG_21_BASENAME=task.json
APPID_CONFIG_21_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946345-dry-run/task.json
APPID_CONFIG_21_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_21_LINE_NOS=44,55,56,81,86
APPID_CONFIG_22_BASENAME=task.json
APPID_CONFIG_22_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204533Z-1956057-apply/task.json
APPID_CONFIG_22_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_22_LINE_NOS=44,55,56,81,86
APPID_CONFIG_23_BASENAME=task.json
APPID_CONFIG_23_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205721Z-1989628-preflight/task.json
APPID_CONFIG_23_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_23_LINE_NOS=44,55,56,81,86
APPID_CONFIG_24_BASENAME=task.json
APPID_CONFIG_24_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989815-prepare/task.json
APPID_CONFIG_24_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_24_LINE_NOS=44,55,56,81,86
APPID_CONFIG_25_BASENAME=task.json
APPID_CONFIG_25_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989891-dry-run/task.json
APPID_CONFIG_25_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_25_LINE_NOS=44,55,56,81,86
APPID_CONFIG_26_BASENAME=stderr.log
APPID_CONFIG_26_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stderr.log
APPID_CONFIG_26_SHA=bbc5b7b614a73219147a06614942e2c67176375af10bcb85aeac5565cb8c2532
APPID_CONFIG_26_LINE_NOS=7,8
APPID_CONFIG_27_BASENAME=stdout.log
APPID_CONFIG_27_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stdout.log
APPID_CONFIG_27_SHA=cdf49d288d7b019b1a5f5099fe8b3e4f5ed1432294051a3c2020a4369c4afd41
APPID_CONFIG_27_LINE_NOS=24,31,32,35
APPID_CONFIG_28_BASENAME=task.json
APPID_CONFIG_28_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/task.json
APPID_CONFIG_28_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2
APPID_CONFIG_28_LINE_NOS=44,55,56,81,86
APPID_CONFIG_29_BASENAME=task.json
APPID_CONFIG_29_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T211239Z-2049968-preflight/task.json
APPID_CONFIG_29_SHA=4d850b025c6a9ad347015321775f9d0466149fb9d5a70212f91b6535adc3c0e3
APPID_CONFIG_29_LINE_NOS=44,55,56,81,86
APPID_CONFIG_30_BASENAME=task.json
APPID_CONFIG_30_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T213313Z-2127686-preflight/task.json
APPID_CONFIG_30_SHA=d98bdf83ab6a9fda0d864e3ccac4a0d01e7813fec9f1173a6d4d5e8712c8e238
APPID_CONFIG_30_LINE_NOS=44,55,56,81,86
GEN_JOURNAL_MATCH_COUNT=3
GEN_JOURNAL_1_UNIT=skladchik-reports-monitor-supervisor.service
GEN_JOURNAL_1_IDENT=skladchik-reports-monitor-supervisor
GEN_JOURNAL_1_EXE_BASENAME=python3.13
GEN_JOURNAL_1_PID=932988
GEN_JOURNAL_1_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb
GEN_JOURNAL_1_FLAGS=generation,backup,sealed
GEN_JOURNAL_2_UNIT=homelab-backup-audit.service
GEN_JOURNAL_2_IDENT=homelab-backup-audit
GEN_JOURNAL_2_EXE_BASENAME=python3.13
GEN_JOURNAL_2_PID=966882
GEN_JOURNAL_2_MESSAGE_SHA=c8c9e905543f63dbee767d26e1c1824c99e7a23094405dba984b18361a36527f
GEN_JOURNAL_2_FLAGS=generation,fresh,skip_fresh
GEN_JOURNAL_3_UNIT=skladchik-reports-monitor-supervisor.service
GEN_JOURNAL_3_IDENT=skladchik-reports-monitor-supervisor
GEN_JOURNAL_3_EXE_BASENAME=python3.13
GEN_JOURNAL_3_PID=968339
GEN_JOURNAL_3_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb
GEN_JOURNAL_3_FLAGS=generation,backup,sealed
QUORUM_SCRIPT_READY=false
QUORUM_UNIT_READY=true
APPID_CONFIG_READY=true
BACKUP_PRODUCER_TOPOLOGY_READY=false
MAIL_SENT_BY_COMMAND=false
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
DECISION=HOLD_BACKUP_PRODUCER_RCA
NEXT_GATE=BACKUP_PRODUCER_RECONCILE
TASK_RESULT=SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA

OUTPUT_END
CHAT_OUTPUT_END
