ken_nogi/NodeSrv/apps/healthcheck-survey-bot
Kenichiro NOGI 3dccdefdcb fix(hc-wa-lineworks-response): 認証チェーンの分岐前無条件実行と暗黙ハングを解消
Botマスタ取得/JWTクレーム組み立て/Sign JWT/アクセストークン取得をSwitch分岐前の
トランクから外し、直接LINEWORKS API呼び出しを行う4箇所(追加案内送信/日付エラー
送信/ファイル未着送信/LINEWORKSファイルダウンロード)それぞれの直前に複製配置。
待機状態取得0件時とSwitch未一致時に無応答でハングする経路には、明示的な
エラーRespond to Webhookへ誘導するIFノード/フォールバック出力を追加した。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 17:49:02 +09:00
..
scripts feat: n8n Public API操作用の共通スクリプトを追加 2026-09-05 14:41:11 +09:00
src/lib feat: LINEWORKS Webhook署名検証ロジックを追加 2026-09-05 14:37:44 +09:00
test feat: LINEWORKS Webhook署名検証ロジックを追加 2026-09-05 14:37:44 +09:00
workflows fix(hc-wa-lineworks-response): 認証チェーンの分岐前無条件実行と暗黙ハングを解消 2026-09-05 17:49:02 +09:00
.gitignore feat: healthcheck-survey-botプロジェクト雛形を追加 2026-09-05 14:14:34 +09:00
package.json feat: healthcheck-survey-botプロジェクト雛形を追加 2026-09-05 14:14:34 +09:00
README.md feat: HC-WAワークフロー(LINEWORKS応答受信)を追加 2026-09-05 15:48:02 +09:00

healthcheck-survey-bot

健康診断管理(SiteId 508971)×LINEWORKS Bot連携。508971のSiteSettings.Processes をフロー定義として使い、n8n上でBot対話型のStatus管理を行う。

設計書: NodeSrv/docs/superpowers/specs/2026-09-05-healthcheck-lineworks-survey-n8n-design.md 実装計画: NodeSrv/docs/superpowers/plans/2026-09-05-healthcheck-lineworks-survey-n8n.md

実機調査メモ2026-09-05確認

508971への新規テストProcess追加なしで、既存本番プロジェクト「実行予算WF申請」SiteId 376872の 取得済みprocesses.jsonPleasanter/実行予算WF申請/configs/production/site-376872_実行予算WF申請/processes.json に入力検証タブを使ったProcessの実例があり、そこからJSON構造を確認できた。

Processの入力検証タブはSiteSettings.Processes[].ValidateInputs配列として保存される。 各要素は{"Id": number, "ColumnName": string, "Required": boolean}(実例: {"Id": 1, "ColumnName": "Class021", "Required": true})。 配列名はValidationsではなくValidateInputs。値を設定していない項目(クライアント/サーバ正規表現、エラーメッセージ、最小/最大等)は キー自体が省略される可能性が高い(今回の実例では未設定のため確認できていない)。

Task 5processFlow.jsgetValidationColumnNamesはこの構造(process.ValidateInputs[].ColumnName)を前提に実装する。

n8nリソースID一覧

(Task 8〜11完了後、ここに作成したData Table ID・ワークフローIDを記録する)

  • Data Table healthcheck_bot_state: jqMDa2YZTI4f0iQ7

    • projectId: LOcxF69Gm4PvnkqAorg-master-sync用プロジェクトを流用)
    • 列: resultId, targetEmail, currentStatus, pendingProcesses, awaitInput, awaitProcessId, awaitColumnすべてstring型
    • 注記: 設計上の8列目updatedAtはn8n Data Tableのシステム予約列名POST /data-tables400 Column name "updatedAt" is reserved as a system column name.を返すのため、列定義には含めていない。各行の更新日時はn8nが自動管理するupdatedAtメタデータで代替する。
  • ワークフロー HC-SUB: プロセス実行と案内送信: XRqcykbG2LuAjGG2

    • ファイル: workflows/hc-sub-run-process-and-notify.jsonExecute Workflow Trigger、入力{resultId, processId}
    • active化済みExecute Workflow Triggerサブワークフローは呼び出し元から実行可能にするためactive必須、asKvC5LSVg3q8tuUと同じ運用)
    • 秘密情報・SiteId等はすべてworkflow_config_valuesbNkadTyDgDepYx2p)からData Tableードで取得し式参照。ワークフローJSONに秘密値のハードコードなし
    • 未検証の暫定実装ありTask 12で要修正: ①484184(LINEWORKS_BOT_MASTER_SITE_ID)からのBotId解決ロジック実データ構造未調査のためSiteSettings.BotIdsまたはProcesses[].BotIdを仮定し、無ければ例外を投げる)、②/api/users/getのレスポンス形状(配列/単一オブジェクト両対応の防御的実装)
    • Step 4実行テスト・LINEWORKS実送信は本タスクでは未実施。次回、捨てレコードでの疎通確認とユーザー確認が必要
  • ワークフロー HC-WP: Statusプッシュ通知: swXfpoDtwZDT3Hwk

    • ファイル: workflows/hc-wp-status-push.json
    • Webhook: https://n8n32.next-hd.net/webhook/healthcheck-status-pushX-Api-Keyヘッダー認証、body {resultId, processId}
    • active化済み
    • X-Api-Keyworkflow_config_valuesHEALTHCHECK_WP_API_KEYと照合。秘密値のハードコードなし
    • 実際のcurl疎通テスト本番508971書き込み・LINEWORKS実送信を伴うは未実施。ユーザー確認後に実施する
    • デプロイ・活性化はサブエージェントのBashサンドボックスが実APIキー使用を一律ブロックしたためコントローラーが直接実行した詳細: task-10-report.md
  • ワークフロー HC-WA: LINEWORKS応答受信: ローカルJSON作成のみ、n8n未デプロイid未採番

    • ファイル: workflows/hc-wa-lineworks-response.json45ード、Webhook healthcheck-lineworks-response 唯一の受信口、awaitInput(none/date/file)3分岐のSwitch構成
    • 本タスクの担当範囲はワークフローJSONのローカル作成・検証までで、n8n Public APIの呼び出しデプロイ・activateは一切実施していない。コントローラー側でのnode scripts/deploy-workflow.js workflows/hc-wa-lineworks-response.json実行後、実際のワークフローIDをこの行に追記すること
    • 秘密情報・SiteId等はすべてworkflow_config_valuesbNkadTyDgDepYx2p)からData Tableードで取得し式参照。ワークフローJSONに秘密値のハードコードなし
    • 未検証の暫定実装あり(詳細はtask-11-report.md: ①Data Table update操作のパラメータ形状get/insertは実機確認済みだが、updateは本タスクで初採用のため未検証、②Switchード(typeVersion 3)のrules.values[].outputKeyスキーマ、③/api/users/getをWhere無しで呼んだ場合のレスポンス形状配列/.Value/単一オブジェクトいずれにも対応する防御的実装)、④api/items/{SiteId}/getColumnFilterHash検索のレスポンス形状、⑤LINEWORKSファイル添付のダウンロード/Pleasanterアップロードのエンドポイントブリーフ記載どおり実装時にPleasanter公式マニュアルapi-attachment系で要確認のプレースホルダー
    • 設計上の注記: HC-SUBTask 9healthcheck_bot_stateに保存するpendingProcesses{processId, label, tooltip}のみでValidateInputsを持たないため、none分岐でのclassifyAwaitInput実行時はHC-WA内でサイト設定取得(getsite)を再実行し、ProcessId一致でフルのProcess定義を引き直す設計にしたTask 9側のファイルは変更していない