app:
  description: テスト実行結果（合否件数・失敗テスト名・エラーメッセージ・カバレッジ）をもとに、合格率・傾向分析、リリース判定（Go/No-Go）と根拠、失敗テストの原因分析と対応優先度、残存リスク評価、次アクションを生成するワークフロー
  icon: 🧪
  icon_background: '#FFEAD5'
  mode: workflow
  name: テスト結果サマリ自動生成
  use_icon_as_answer_icon: false
kind: app
version: 0.6.0
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      image:
        enabled: false
    opening_statement: ''
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
  graph:
    edges:
    - data:
        sourceType: start
        targetType: parameter-extractor
      id: start-to-extractor1
      source: start
      target: extractor1
    - data:
        sourceType: parameter-extractor
        targetType: code
      id: extractor1-to-code1
      source: extractor1
      target: code1
    - data:
        sourceType: code
        targetType: llm
      id: code1-to-llm1
      source: code1
      target: llm1
    - data:
        sourceType: llm
        targetType: end
      id: llm1-to-end
      source: llm1
      target: end
    nodes:
    - data:
        title: 開始
        type: start
        variables:
        - label: query
          max_length: 2048
          options: []
          required: true
          type: paragraph
          variable: query
      height: 90
      id: start
      position:
        x: 80
        y: 282
      type: custom
      width: 244
    - data:
        title: 情報抽出
        type: parameter-extractor
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
        query:
        - start
        - query
        parameters:
        - name: total_tests
          type: number
          description: 実行されたテストの総数
          required: true
        - name: passed
          type: number
          description: 合格テスト件数
          required: true
        - name: failed
          type: number
          description: 失敗テスト件数
          required: true
        - name: failed_test_names
          type: string
          description: 失敗したテストの名称（カンマ区切り）
          required: true
        - name: error_messages
          type: string
          description: 失敗テストのエラーメッセージ（必要に応じて改行またはカンマで列挙）
          required: true
        - name: coverage
          type: number
          description: コードカバレッジ（%）
          required: true
        reasoning_mode: prompt
        instruction: 以下のテキストから上記パラメータを抽出してください。失敗テスト名・エラーメッセージは可能な限り正確に抽出してください。
      height: 90
      id: extractor1
      position:
        x: 380
        y: 282
      type: custom
      width: 244
    - data:
        title: 前処理・指標計算
        type: code
        code_language: python3
        code: "def _safe_str(v):\n    \"\"\"Convert any value to string safely.\"\"\
          \"\n    if v is None:\n        return \"\"\n    if isinstance(v, list):\n\
          \        return \"\\n\".join(str(i) for i in v)\n    return str(v)\n\ndef\
          \ _safe_list(v):\n    \"\"\"Ensure value is a list.\"\"\"\n    if v is None:\n\
          \        return []\n    if isinstance(v, str):\n        return [v]\n   \
          \ if isinstance(v, list):\n        return v\n    return [v]\n\ndef main(**kwargs)\
          \ -> dict:\n    inputs = kwargs\n    # 閾値・設定（関数内で定義）\n    go_threshold =\
          \ 95.0  # 合格率(%)\n    # 入力取得（文字列で来る可能性に備える）\n    try:\n        total = float(inputs.get(\"\
          total_tests\", 0))\n    except Exception:\n        total = 0.0\n    try:\n\
          \        passed = float(inputs.get(\"passed\", 0))\n    except Exception:\n\
          \        passed = 0.0\n    try:\n        failed = int(float(inputs.get(\"\
          failed\", 0)))\n    except Exception:\n        failed = 0\n    # カバレッジ\n\
          \    try:\n        coverage = float(inputs.get(\"coverage\", 0.0))\n   \
          \ except Exception:\n        coverage = 0.0\n    # 失敗テスト名の整形\n    failed_names_raw\
          \ = inputs.get(\"failed_test_names\", \"\")\n    if failed_names_raw is\
          \ None:\n        failed_names_raw = \"\"\n    # カンマや改行で分割して先頭最大10件を優先表示\n\
          \    separators = [\",\", \"\\n\", \";\"]\n    names = [failed_names_raw]\n\
          \    for s in separators:\n        parts = []\n        for n in names:\n\
          \            parts.extend([p.strip() for p in n.split(s) if p.strip() !=\
          \ \"\"])\n        if len(parts) > 1:\n            names = parts\n    prioritized\
          \ = names[:10]\n    prioritized_str = \", \".join(prioritized) if prioritized\
          \ else \"\"\n    # 合格率計算\n    if total > 0:\n        pass_rate = (passed\
          \ / total) * 100.0\n    else:\n        pass_rate = 0.0\n    # 傾向（単回実行のみのため簡易判断）\n\
          \    if pass_rate >= 98.0:\n        trend = \"非常に良好で安定/改善傾向\"\n    elif\
          \ pass_rate >= 95.0:\n        trend = \"高合格率で安定傾向\"\n    elif pass_rate\
          \ >= 80.0:\n        trend = \"合格率は中程度。改善の余地あり\"\n    else:\n        trend\
          \ = \"合格率が低く、要対策の可能性が高い\"\n    # Go/No-Go判定（要件: 合格率95%以上がGoの最低ライン）\n   \
          \ go_decision = \"Go\" if pass_rate >= go_threshold else \"No-Go\"\n   \
          \ failure_count = failed\n    # 出力はdict(...)で返す（辞書リテラル禁止ルールに従う）\n    return\
          \ dict(\n        pass_rate=pass_rate,\n        trend=trend,\n        go_decision=go_decision,\n\
          \        prioritized_failures=prioritized_str,\n        failure_count=failure_count,\n\
          \        coverage=coverage\n    )\n"
        variables:
        - value_selector:
          - extractor1
          - total_tests
          variable: total_tests
        - value_selector:
          - extractor1
          - passed
          variable: passed
        - value_selector:
          - extractor1
          - failed
          variable: failed
        - value_selector:
          - extractor1
          - failed_test_names
          variable: failed_test_names
        - value_selector:
          - extractor1
          - error_messages
          variable: error_messages
        - value_selector:
          - extractor1
          - coverage
          variable: coverage
        outputs:
          pass_rate:
            type: number
            children: null
          trend:
            type: string
            children: null
          go_decision:
            type: string
            children: null
          prioritized_failures:
            type: string
            children: null
          failure_count:
            type: number
            children: null
          coverage:
            type: number
            children: null
      height: 90
      id: code1
      position:
        x: 680
        y: 282
      type: custom
      width: 244
    - data:
        title: AI分析
        type: llm
        model:
          provider: openai
          name: gpt-5-mini
          mode: chat
          completion_params:
            temperature: 0.2
        prompt_template:
        - role: system
          text: 'あなたはソフトウェアテストの分析とレポート作成の専門家です。与えられた検査結果から、要求された5つの項目を明確かつ端的に出力してください。


            ---


            【最終出力フォーマット (この指示が最優先)】

            最終出力は **読みやすい日本語の Markdown** で返してください。JSON

            配列・オブジェクトをそのまま出力してはいけません。

            - 見出し (## / ###) でセクションを区切る

            - リスト (- / 1.) や表 (| ... |) で構造化

            - 各項目の意図や根拠が分かるよう短い説明文を添える

            - 営業デモで顧客に直接見せられる体裁にする


            (構造化されたデータ項目を内部で扱うのは構いませんが、出力時に Markdown

            に変換してください。)'
        - role: user
          text: '入力データ:


            総テスト数: {{#extractor1.total_tests#}}

            合格件数: {{#extractor1.passed#}}

            失敗件数: {{#extractor1.failed#}}

            失敗テスト名（抜粋）: {{#code1.prioritized_failures#}}

            エラーメッセージ（原文）: {{#extractor1.error_messages#}}

            カバレッジ(%): {{#code1.coverage#}}

            計算済み合格率(%): {{#code1.pass_rate#}}

            簡易傾向: {{#code1.trend#}}


            指示:

            1) 合格率と傾向分析: 合格率を明記し、品質の傾向について理由を述べてください（利用可能なデータのみで判断）。

            2) リリース判定 (Go/No-Go) と根拠: 合格率95%以上をGoの最低ラインとして必ず適用し、判定とその根拠を示してください。

            3) 失敗テストの原因分析と対応優先度: 失敗テスト名とエラーメッセージを参照し、原因の仮説を列挙して対応優先度（高/中/低）を提案してください。優先度はビジネス影響と再現性を考慮してください。

            4) 残存リスクの評価: 本リリースで残るリスクとその影響度を明示してください。

            5) 次アクション: 開発・テスト・リリースチーム向けに具体的かつ時系列で実行可能な次アクションを提示してください。


            出力形式: 各項目を見出しで分けて、日本語で簡潔に箇条書きで出力してください。'
        vision:
          enabled: false
        memory: null
        context:
          enabled: false
      height: 90
      id: llm1
      position:
        x: 980
        y: 282
      type: custom
      width: 244
    - data:
        title: 終了
        type: end
        outputs:
        - value_selector:
          - llm1
          - text
          variable: result
      height: 90
      id: end
      position:
        x: 1280
        y: 282
      type: custom
      width: 244
  hash: null
