- Add Code Node Classification section to DEPLOY-SUBWORKFLOWS.md
- Classify each Code node into 6 categories with evidence
- 58 nodes confirmed as orchestration infrastructure (must stay)
- 2 domain-logic candidates identified but extraction is net-negative
- Summary proves no further extraction is viable
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added "Prepare Batch Execution" Code node between Route Batch Match Result
and Route Batch Action to transform matching sub-workflow output:
- matchedContainers -> allMatched (field name expected by downstream nodes)
- action from Detect Batch Command (stop/start/restart) instead of
"batch_matched" routing label from sub-workflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Text commands like "status book" should show plain text status without
inline keyboard buttons. Added "Strip Status Keyboard" Code node that
removes reply_markup before sending via Send Container Submenu Direct.
Callback-based status (with messageId) still gets the full UI with buttons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Prepare Text Action Input now reads action (stop/start/restart) from
Parse Action Command instead of matching sub-workflow's actionType field
- Added "Has Status Message ID" If node to route status_direct results:
messageId > 0 → Edit Container List (callback), messageId == 0 →
Send Container Submenu Direct (text command)
- Pre-existing bug: text "status <name>" routed to editMessageText with
messageId 0, causing Telegram API error
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Updated 3 Execute Workflow nodes: Execute Action Match, Execute Update Match, Execute Batch Match
- Deployed n8n-matching.json as workflow kL4BoI8ITSP9Oxek
- Pushed main workflow to n8n API
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract 12 matching/disambiguation logic nodes into sub-workflow
- 23 nodes total: trigger + router + 12 logic + 9 format-return nodes
- Three action paths: match_action, match_update, match_batch
- Every exit path returns JSON with action field per established pattern
- Adapted input references to use trigger data instead of main workflow refs
- No response nodes included (stay in main per locked decision)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 10.1 verification found 3 gaps:
- Gap 1: Node count 168 vs 115-125 target (needs user decision)
- Gap 2: Code node analysis incomplete (documentation task)
- Gap 3: Sub-workflow contracts not documented (documentation task)
Plan 10.1-06 addresses gaps with:
- Task 1: Document all 6 sub-workflow input/output contracts
- Task 2: Classify all 62 Code nodes by purpose
- Task 3: User decision checkpoint on node count approach
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Created 10.1-05-SUMMARY.md documenting verification and UAT
- Updated STATE.md to reflect phase completion (5/5 plans)
- Updated ROADMAP.md to mark phase 10.1 complete
- Updated DEPLOY-SUBWORKFLOWS.md with deployed workflow IDs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Docker logs API returns multiplexed stream with 8-byte headers per frame,
not just newline-separated text. The old code split on \n which missed
frames that weren't newline-terminated.
Now properly parses the binary stream format:
- Reads 8-byte header (stream type + frame size)
- Extracts frame data based on size
- Splits frame content by newlines
- Correctly counts and displays requested number of lines
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Text-based batch commands (e.g., /start container1 container2) were
failing because Send Batch Start Message always used editMessageText,
but you can't edit the user's message.
Fixed by:
- Conditionally use sendMessage vs editMessageText based on fromKeyboard
- Capture new message_id from sendMessage response for progress updates
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The batch action (stop/start/restart) was being lost because:
1. Parse Callback Data extracted action: "stop"
2. Prepare Batch UI Input overwrote it with action: "exec" (the UI action type)
3. Handle Exec tried to parse callbackData which was empty
Fixed by:
- Adding batchAction field to Prepare Batch UI Input
- Adding batchAction to Batch UI trigger schema
- Updating Handle Exec to use triggerData.batchAction and selectedCsv
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The n8n Telegram node's inlineKeyboard parameter doesn't work reliably
with editMessageText operation. Switched to HTTP Request node calling
Telegram API directly, which properly passes reply_markup.
Changed nodes:
- Send Confirmation Dialog
- Send Stop Result
- Send Expired Message
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The n8n Telegram node's inlineKeyboard parameter expects the keyboard
rows array directly, not the full {inline_keyboard: [...]} object.
Fixed nodes:
- Send Confirmation Dialog
- Send Stop Result
- Send Expired Message
Changed from: JSON.stringify($json.reply_markup)
Changed to: JSON.stringify($json.reply_markup.inline_keyboard)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The batch rule was added at index 4 but connections weren't updated,
causing all subsequent rules to route to wrong handlers:
- select → Answer List Callback (wrong)
- list → Answer Action Callback (wrong)
- action → Answer Noop Callback (wrong)
- noop → nothing (missing)
Fixed by correcting outputs 5-8 to connect to proper handlers.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Switch node connections must use "main" array format with indices,
not named output keys. Changed from:
{ "list": [...], "status": [...] }
to:
{ "main": [ [...], [...], [...] ] }
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Execute Workflow nodes need mode: "once" to properly pass input
data to sub-workflows. Added to:
- Execute Container Status
- Execute Select Status
- Execute Paginate Status
- Execute Batch Cancel Status
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Route Status Result had no outgoing connections after status
sub-workflow extraction. Added connections:
- list output → Send Container List
- status_direct output → Edit Container List
- error output → Send Docker Error
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replaced TODO placeholders with actual n8n workflow IDs:
- Batch UI: ZJhnGzJT26UUmW45
- Container Status: lqpg2CqesnKE2RJQ
- Confirmation Dialogs: fZ1hu8eiovkCk08G
- Updated instructions.md with new workflow IDs and renamed files
- All workflows deployed and activated in n8n
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- New n8n-confirmation.json with 16 nodes
- Handle show_stop/show_update dialog generation
- Handle confirm_stop with expiry checking
- Handle confirm_update (returns action for main workflow)
- Handle cancel and expired actions
- Calls n8n-actions.json for confirmed stop execution
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Created n8n-workflow.json.backup-status for rollback
- Verified no orphan node references in main workflow
- Status sub-workflow has 11 nodes with Execute Workflow Trigger
- Created n8n-batch-ui.json with 16 nodes
- Handles batch selection UI: mode, toggle, nav, clear, cancel, exec actions
- Returns structured data for main workflow to send Telegram responses
- Entry point: Execute Workflow Trigger with input contract
- Uses existing Docker API pattern for container listing
Part of batch UI extraction (Task 1/3)
- Skip Delete Batch Select Message node for batch start
- Use editMessageText instead of sendMessage
- Batch start now smoothly transitions like batch stop
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed batch start to editMessageText so the confirmation message
gets updated with progress/results instead of leaving it hanging
and sending a separate progress message.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed from $('When executed by another workflow') to $('Route Action')
to avoid paired item reference errors when data flows through the
Resolve Container ID path.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Includes n8n API integration docs, workflow IDs, push commands,
and technical patterns learned during development.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>