Commit Graph
100 Commits
Author SHA1 Message Date
Lucas BergerandClaude Opus 4.6 b74fb3c19c test(10.1): diagnose 4 UAT issues with root causes
- Gap 1: Format Stop/Start/Restart missing statusCode 304 check
- Gap 2: Build Batch Keyboard reads action instead of actionType
- Gap 3: /list not implemented in Keyword Router (minor)
- Gap 4: Build Cancel Return Submenu references wrong predecessor

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 14589f3cb6 test(10.1): complete UAT - 11 passed, 4 issues
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 22bbe4b6ba docs(10.1): mark Phase 10.1 complete in roadmap (7/7 plans)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 2a4505d2d4 docs(10.1-07): complete Code classification and contract documentation plan
- 10.1-07-SUMMARY.md: Plan execution results with self-check passed
- STATE.md: Phase 10.1 marked COMPLETE (7/7 plans), decisions updated

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 178bc544dc docs(10.1-07): document sub-workflow contracts and node count analysis
- Add detailed I/O contracts for all 7 sub-workflows with field-level docs
- Verify all 17 Execute Workflow nodes receive correct input fields
- Add node count analysis proving 168 nodes is 2 above structural minimum
- Show diminishing returns evidence (extraction efficiency: 81% -> 0% -> -50%)
- Close verification gaps 2 and 3 with documented evidence

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 f0aae416aa docs(10.1-07): classify all 60 Code nodes in main workflow
- 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>
2026-02-08 18:56:44 -05:00
Lucas Berger 4eeed1d9e1 docs(10.1-06): complete matching extraction plan 2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 6824697295 fix(10.1-06): fix batch text command data flow through matching sub-workflow
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>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 aae95e2405 fix(10.1-06): strip inline keyboard from text-mode status responses
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>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 138728a7b1 fix(10.1-06): fix action type passthrough and text status routing
- 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>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 596b0e5dab fix(10.1-06): replace matching workflow placeholders with deployed ID kL4BoI8ITSP9Oxek
- 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>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 d5246ba1c6 feat(10.1-06): update main workflow to call matching sub-workflow
- Remove 12 matching/disambiguation logic nodes from main workflow
- Add 9 integration nodes: 3 Prepare Input + 3 Execute Workflow + 3 Route Result
- Net reduction: 3 nodes (168 -> 165)
- Wire Docker List for Action -> Prepare -> Execute -> Route -> existing handlers
- Wire Docker List for Update -> Prepare -> Execute -> Route -> existing handlers
- Wire Get Containers for Batch -> Prepare -> Execute -> Route -> existing handlers
- Preserve all 6 Telegram response nodes in main workflow
- Update Prepare Text Action/Update Input to use sub-workflow return data
- Backup created at n8n-workflow.json.backup-matching

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.6 f57c706e01 feat(10.1-06): create n8n-matching.json sub-workflow
- 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>
2026-02-08 18:56:44 -05:00
Lucas Berger 18f8976a7f fix(10.1): revise plans based on checker feedback 2026-02-08 18:56:44 -05:00
Lucas Berger c437aa534f docs(10.1): create gap closure plans (06-07) 2026-02-08 18:56:44 -05:00
Lucas BergerandClaude Opus 4.5 1337f89114 docs(10.1): create gap closure plan for verification gaps
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>
2026-02-05 09:03:57 -05:00
Lucas BergerandClaude Opus 4.5 4d101a4299 wip: 10.1 paused at verification decision point
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:37:24 -05:00
Lucas BergerandClaude Opus 4.5 36a6ff2e8e docs(10.1-05): complete integration verification plan
- 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>
2026-02-04 22:31:04 -05:00
Lucas BergerandClaude Opus 4.5 66574efed2 fix(logs): properly parse Docker multiplexed stream format
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>
2026-02-04 22:26:18 -05:00
Lucas BergerandClaude Opus 4.5 df9a4420e9 fix(batch): support text-based batch commands (not just keyboard)
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>
2026-02-04 22:21:50 -05:00
Lucas BergerandClaude Opus 4.5 e9a971a014 fix(routing): connect batchStopConfirm to Answer Batch Stop Confirm
Output 11 was incorrectly going to Build Callback Action (single
container handler) instead of Answer Batch Stop Confirm (batch handler).

The batch stop confirm flow should be:
Answer Batch Stop Confirm -> Check Batch Stop Expired -> Prepare Batch Stop Exec

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:16:54 -05:00
Lucas BergerandClaude Opus 4.5 ad89700844 fix(routing): swap batchStopConfirm and batchStopCancel connections
Route Callback outputs 11 and 12 were swapped:
- batchStopConfirm was going to Answer Batch Stop Cancel
- batchStopCancel was going to Build Callback Action

Now correctly routed:
- batchStopConfirm (output 11) -> Build Callback Action
- batchStopCancel (output 12) -> Answer Batch Stop Cancel

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:14:41 -05:00
Lucas BergerandClaude Opus 4.5 e4740dddb4 fix(batch): pass batchAction to Batch UI sub-workflow
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>
2026-02-04 22:11:50 -05:00
Lucas BergerandClaude Opus 4.5 1a47176713 fix(telegram): use HTTP Request for editMessageText with keyboards
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>
2026-02-04 22:07:20 -05:00
Lucas BergerandClaude Opus 4.5 0983a5f99a fix(telegram): use inline_keyboard array for Telegram node
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>
2026-02-04 22:04:20 -05:00
Lucas BergerandClaude Opus 4.5 224f5469ab fix(routing): correct Route Callback connection offsets
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>
2026-02-04 22:00:09 -05:00
Lucas BergerandClaude Opus 4.5 99612a9649 fix(10.1-05): fix Route Action connections in status sub-workflow
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>
2026-02-04 21:52:36 -05:00
Lucas BergerandClaude Opus 4.5 58e4fbdbbe fix(10.1-05): add mode: once to Execute Status nodes
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>
2026-02-04 21:47:41 -05:00
Lucas BergerandClaude Opus 4.5 8727b4f7a8 fix(10.1-05): wire Route Status Result to Telegram nodes
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>
2026-02-04 21:44:10 -05:00
Lucas BergerandClaude Opus 4.5 fae429a05e feat(10.1-05): deploy sub-workflows to n8n with real IDs
- 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>
2026-02-04 21:39:37 -05:00
Lucas Berger 68dd7ff803 docs(10.1-05): add sub-workflow deployment guide
- Documents 6 sub-workflows (3 deployed, 3 pending)
- Lists all Execute Workflow nodes and target IDs
- Provides deployment steps for TODO placeholders
- Includes rollback instructions using backup files
- Architecture diagram shows workflow relationships
- Input/output contracts for new sub-workflows
- Testing checklist for post-deployment verification
2026-02-04 21:37:10 -05:00
Lucas BergerandClaude Opus 4.5 4649ed5a5f docs(10.1-04): complete confirmation sub-workflow plan
Tasks completed: 3/3
- Create n8n-confirmation.json sub-workflow
- Update main workflow with confirmation integration
- Create backup

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-04-SUMMARY.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:34:47 -05:00
Lucas BergerandClaude Opus 4.5 1a9f63dbbc chore(10.1-04): add backup before confirmation extraction
- Backup file: n8n-workflow.json.backup-confirm
- Pre-extraction node count: 178 (post-10.1-03)
- Post-extraction node count: 168

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:33:38 -05:00
Lucas BergerandClaude Opus 4.5 36ecdd5ba9 feat(10.1-04): integrate confirmation sub-workflow in main workflow
- Removed 19 single-container confirmation nodes
- Added 9 integration nodes (net -10 nodes: 178->168)
- Route Callback[9,10] (confirm/cancelConfirm) -> Execute Confirmation
- Route Action Type[2,3] (stop/update) -> Execute Confirmation
- Route Confirmation Result handles show/stop_result/confirm_update/cancel/expired
- Added TODO_DEPLOY_CONFIRMATION_WORKFLOW placeholder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:33:23 -05:00
Lucas BergerandClaude Opus 4.5 47c2b47c99 feat(10.1-04): create confirmation dialogs sub-workflow
- 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>
2026-02-04 21:31:36 -05:00
Lucas Berger 3d138688e5 docs(10.1-03): complete container status sub-workflow plan
Tasks completed: 3/3
- Task 1: Create n8n-status.json sub-workflow
- Task 2: Update main workflow with sub-workflow calls
- Task 3: Create backup for rollback

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-03-SUMMARY.md
2026-02-04 21:28:25 -05:00
Lucas Berger 4245a49f78 chore(10.1-03): add backup for status extraction
- 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
2026-02-04 21:27:13 -05:00
Lucas Berger 13ed81cccf feat(10.1-03): update main workflow to call status sub-workflow
- Removed 10 list/status nodes (Docker queries, keyboard building)
- Added 9 integration nodes (Prepare/Execute pairs for status, select, paginate)
- Keyword Router status output -> Prepare Status Input -> Execute Container Status
- Answer Select Callback -> Execute Select Status -> Send Container Submenu
- Answer List Callback -> Execute Paginate Status -> Edit Container List
- Prepare Batch Cancel Return -> Execute Batch Cancel Status -> Edit Container List
- Added TODO_DEPLOY_STATUS_WORKFLOW placeholder for deployment
2026-02-04 21:26:55 -05:00
Lucas Berger 369eb2a87e feat(10.1-03): create container status sub-workflow
- Created n8n-status.json with 11 nodes
- Handles list, status, and paginate actions
- Input: chatId, messageId, action, containerName, page, queryId, searchTerm
- Output: success, action, text, reply_markup, container data
- Docker queries via HTTP request to docker-socket-proxy
2026-02-04 21:24:46 -05:00
Lucas Berger 884fefaab5 docs(10.1-02): complete batch UI extraction plan
Tasks completed: 3/3
- Task 1: Create n8n-batch-ui.json sub-workflow (16 nodes)
- Task 2: Update main workflow (192 -> 179 nodes, -13)
- Task 3: Create backup for rollback

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-02-SUMMARY.md
2026-02-04 21:21:32 -05:00
Lucas Berger 8b9af171b6 feat(10.1-02): extract batch UI to sub-workflow
- Updated main workflow to call n8n-batch-ui.json sub-workflow
- Main workflow reduced from 192 to 179 nodes (-13 nodes)
- Removed 22 batch UI nodes now handled by sub-workflow:
  - Fetch/Build/Rebuild Batch Select Keyboard nodes
  - Handle Batch Toggle/Clear/Exec/Nav nodes
  - Answer and Edit keyboard nodes
- Added 9 new nodes for sub-workflow integration:
  - Prepare Batch UI Input
  - Execute Batch UI (TODO_DEPLOY_BATCH_UI_WORKFLOW placeholder)
  - Route Batch UI Result with action routing
  - Telegram response handlers for keyboard/confirm/cancel/limit
- Batch execution loop remains in main workflow (orchestration)
- Created backup file for rollback capability

Part of batch UI extraction (Task 2-3/3)
2026-02-04 21:19:57 -05:00
Lucas Berger 07a62d13f1 feat(10.1-02): create batch UI sub-workflow
- 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)
2026-02-04 21:16:13 -05:00
Lucas Berger cd7c177553 docs(10.1-01): complete foundation and domain analysis plan
Tasks completed: 3/3
- Rename sub-workflows to shorter pattern
- Analyze main workflow domain boundaries
- User approval on extraction boundaries

SUMMARY: .planning/phases/10.1-aggressive-workflow-modularization/10.1-01-SUMMARY.md
2026-02-04 21:10:07 -05:00
Lucas Berger fba90a6cc4 docs(10.1-01): analyze main workflow domain boundaries
Domain analysis of 192-node main workflow:
- Batch UI/Orchestration: 48 nodes (HIGH extraction value)
- Container List/Menu: 17 nodes (HIGH extraction feasibility)
- Confirmation Dialogs: 30 nodes (MEDIUM extraction feasibility)
- Matching/Disambiguation: 15 nodes (optional extraction)
- Telegram Responses: 58 nodes (LOCKED to remain in main)

Key finding: Target of 50-80 nodes not achievable due to locked
Telegram response pattern. Realistic target: 115-125 nodes.

Recommended extraction order:
- Wave 2: Batch UI + Container List
- Wave 3: Confirmation + Matching (optional)
2026-02-04 20:29:21 -05:00
Lucas Berger ff532aa99e refactor(10.1-01): rename sub-workflows to shorter pattern
- n8n-container-update.json -> n8n-update.json
- n8n-container-actions.json -> n8n-actions.json
- n8n-container-logs.json -> n8n-logs.json

Workflow IDs remain unchanged (n8n assigns on import).
Main workflow Execute Workflow nodes reference by ID, not filename.
2026-02-04 20:26:34 -05:00
Lucas BergerandClaude Opus 4.5 25dd3ab2d2 docs(10.1): create phase plan
Phase 10.1: Aggressive Workflow Modularization
- 5 plan(s) in 3 wave(s)
- Wave 1: Foundation (rename files, analyze boundaries, user approval)
- Wave 2: 3 parallel extractions (batch-ui, status, confirmation)
- Wave 3: Integration verification and UAT
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:20:29 -05:00
Lucas Berger f071a949b1 docs(10.1): research phase domain
Phase 10.1: Aggressive Workflow Modularization
- Standard stack identified (Execute Workflow nodes, sub-workflow patterns)
- Architecture patterns documented (input contracts, error handling, routing)
- Pitfalls catalogued (memory issues, data references, error gaps, circular deps)
- Analyzed existing workflows (192 nodes main, 3 sub-workflows)
- Validated patterns against n8n docs and community best practices
- Confidence: HIGH (grounded in existing implementations + locked user decisions)
2026-02-04 20:14:22 -05:00
Lucas BergerandClaude Opus 4.5 8e372dd8ed wip: 10.1-aggressive-workflow-modularization paused at context gathered
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 17:01:32 -05:00
Lucas BergerandClaude Opus 4.5 9285f3e011 docs(10.1): capture phase context
Phase 10.1: Aggressive Workflow Modularization
- Implementation decisions documented
- Phase boundary established
- Fixed misnamed phase directories (10.1/10.2)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 17:00:37 -05:00
Lucas BergerandClaude Opus 4.5 a8c9ab69d6 fix(batch): edit message in place instead of delete+send
- 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>
2026-02-04 16:41:07 -05:00
Lucas BergerandClaude Opus 4.5 23f60ff043 fix(batch): edit confirmation message instead of sending new one
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>
2026-02-04 16:30:42 -05:00
Lucas BergerandClaude Opus 4.5 d043e11bd4 fix(actions): fix paired item reference in Format Result nodes
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>
2026-02-04 16:26:31 -05:00
Lucas BergerandClaude Opus 4.5 4ea0824c40 chore: add project-level Claude instructions
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>
2026-02-04 16:22:41 -05:00
Lucas BergerandClaude Opus 4.5 adbd7bd87d fix(batch): resolve container IDs in sub-workflows
When batch operations are triggered via keyboard callbacks, the main
workflow only passes container names (not IDs). The sub-workflows now:
- Check if containerId is empty
- If empty, query Docker API to resolve name → ID
- Then proceed with the action

This fixes batch start/stop/restart/update operations failing with
404 "page not found" errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:19:33 -05:00
Lucas BergerandClaude Opus 4.5 f7859fc3c4 docs(phase-10): complete workflow modularization phase
All 7 plans executed and verified:
- 3 sub-workflows (Update, Actions, Logs)
- UAT gaps closed (race conditions, data chains, fuzzy matching)
- Main workflow: 209 → 192 nodes (-8%)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 16:05:06 -05:00
Lucas Berger b156fe48cf docs(10-07): complete UAT gap closure plan
Tasks completed: 5/5
- Fix text update race condition (remove parallel message)
- Fix batch update data chain (Build Progress Message reference)
- Fix batch action data chain (Build Progress Message reference)
- Add fuzzy matching to logs and fix chatId reference
- Add timestamp to logs refresh for message not modified error

SUMMARY: .planning/phases/10-workflow-modularization/10-07-SUMMARY.md
2026-02-04 16:01:49 -05:00
Lucas Berger 1869cab358 fix(10-07): add timestamp to logs refresh to prevent message not modified error
- Format Inline Logs Result now adds timestamp to message
- Shows 'Updated: HH:MM:SS' at bottom of logs display
- Ensures Telegram API always accepts refresh (content always different)
2026-02-04 16:00:30 -05:00
Lucas Berger 77c3d6543d fix(10-07): add fuzzy matching to logs and fix chatId reference
- Send Logs Response now uses Prepare Text Logs Input for chatId
- Container logs sub-workflow uses .includes() for fuzzy matching
- Multiple match handling added with helpful error message
2026-02-04 16:00:07 -05:00
Lucas Berger 28f4c59d3f fix(10-07): fix batch action data chain reference
- Prepare Batch Action Input now uses Build Progress Message reference
- Fixes 'Cannot read properties of undefined' error for batch actions
- Data chain: Build Progress Message -> Edit Progress Message -> Prepare Batch Action Input
2026-02-04 15:59:33 -05:00
Lucas Berger 63a0019ccf fix(10-07): fix batch update data chain reference
- Prepare Batch Update Input now uses Build Progress Message reference
- Fixes 'Cannot read properties of undefined' error
- Data chain: Build Progress Message -> Edit Progress Message -> Prepare Batch Update Input
2026-02-04 15:59:05 -05:00
Lucas Berger 9d38bf9f51 fix(10-07): remove text update race condition
- Remove parallel Send Text Update Started connection
- Text updates now only send result via sub-workflow
- Fixes duplicate message issue (Updating... + already up to date)
2026-02-04 15:58:47 -05:00
Lucas BergerandClaude Opus 4.5 5a6b6e3e85 docs(10): create UAT gap closure plan 10-07
Phase 10 UAT revealed 5 gaps:
- Text update race condition (parallel message send)
- Batch update/action data chain broken ($json vs Build Progress Message)
- Logs fuzzy matching missing
- Logs refresh "message not modified" error

10-07-PLAN.md addresses all gaps in 5 tasks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:54:02 -05:00
Lucas BergerandClaude Opus 4.5 ff675b7e19 test(phase-10): complete UAT - 4 passed, 5 issues
Issues found:
1. Text update sends duplicate messages (sub-workflow + main)
2. Batch update broken - data chain broken after Edit Progress Message
3. Batch actions broken - same data chain issue
4. Logs text command - no fuzzy matching, chatId not preserved
5. Logs refresh - doesn't handle 'message not modified' error

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:50:20 -05:00
Lucas BergerandClaude Opus 4.5 1d55988aff docs(phase-10): complete workflow modularization phase
Phase 10 achievements:
- 3 sub-workflows: Update, Actions, Logs (all deployed)
- Main workflow: 209 → 192 nodes (-8%)
- Consolidated all container operations
- Removed old batch inline path
- Modernized callback formats

Deferred to Phase 10.1: Aggressive modularization (50-80 node target)
Added Phase 10.2: Better Logging & Log Management

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:10:19 -05:00
Lucas BergerandClaude Opus 4.5 57ca18f4d4 refactor(10-06): remove old batch inline path and modernize callbacks
- Update Build Batch Keyboard to use bexec: format instead of legacy JSON
- Update Build Suggestion Keyboard to use action: format instead of legacy JSON
- Remove 7 nodes from old batch inline execution path:
  - Build Batch Commands
  - Prepare Batch Execution
  - Execute Batch Action
  - Parse Batch Result
  - Format Batch Result
  - Send Batch Result
  - Answer Batch Query

Node count: 199 -> 192 (-7 nodes)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:07:05 -05:00
Lucas BergerandClaude Opus 4.5 9799de9418 fix(10-06): deploy logs sub-workflow and wire to main
- Deploy Container Logs sub-workflow to n8n (ID: oE7aO2GhbksXDEIw)
- Replace TODO_DEPLOY_LOGS_WORKFLOW with actual workflow ID
- Update n8n-container-logs.json with deployed ID
- Redeploy all workflows to n8n

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:04:14 -05:00
Lucas Berger e160b3e1cd docs(10-06): complete remediation plan
Tasks completed: 4/5 (1 skipped - path still needed)
- Fix batch actions routing to use sub-workflow
- Wire logs sub-workflow (deployment documented)
- Remove Python helper scripts (6 files, 1468 lines)
- Task 3 skipped: old inline path handles legacy callbacks

SUMMARY: .planning/phases/10-workflow-modularization/10-06-SUMMARY.md
2026-02-04 14:55:46 -05:00
Lucas Berger 2bf607ea01 chore(10-06): remove Python helper scripts
- Delete refactor_workflow.py
- Delete task1_batch_update.py
- Delete task2_batch_actions.py
- Delete task3_logs_subworkflow.py
- Delete task3_update_main.py
- Delete task4_cleanup.py

These were development-time helpers for JSON manipulation, not runtime code.
2026-02-04 14:54:30 -05:00
Lucas Berger 1d420bd7dd fix(10-06): update logs sub-workflow placeholder
- Replace PLACEHOLDER_LOGS_ID with TODO_DEPLOY_LOGS_WORKFLOW
- Applies to Execute Text Logs and Execute Inline Logs nodes
- Clear marker indicates n8n-container-logs.json deployment required
- User must replace TODO with actual workflow ID after n8n import
2026-02-04 14:53:13 -05:00
Lucas Berger 807583dfff fix(10-06): fix batch actions routing to use sub-workflow
- Add exclusion condition to Route Callback rule 4 (isBatch)
- Rule now requires isBatch=true AND isBatchExec!=true
- Ensures batch execution callbacks route to Handle Batch Exec (output 17)
- Prevents bypass to old Build Batch Commands inline path (output 4)
2026-02-04 14:52:44 -05:00
Lucas Berger ed0e0e7ba2 docs(10-05): complete modularization plan
Tasks completed: 4/4
- Wire batch update to Container Update sub-workflow
- Wire batch actions to Container Actions sub-workflow
- Extract logs flow to Container Logs sub-workflow
- Clean up and verify workflow

Results:
- Main workflow: 209 → 199 nodes (-10, -4.8%)
- Created n8n-container-logs.json sub-workflow (9 nodes)
- All batch operations use sub-workflows (eliminated duplicate logic)
- 9 sub-workflow calls total (3 for Update, 4 for Actions, 2 for Logs)

Phase 10 now COMPLETE.

SUMMARY: .planning/phases/10-workflow-modularization/10-05-SUMMARY.md
2026-02-04 14:00:33 -05:00
Lucas Berger 186f11362e chore(10-05): verify and document workflow refactoring
- Run cleanup and verification script
- No orphaned nodes found
- Workflow structure validated
- Final node count: 199 (reduced from 209, -4.8%)
- Add comprehensive deployment guide

Node composition:
- 79 code nodes
- 50 httpRequest nodes
- 27 telegram nodes
- 14 if nodes
- 10 switch nodes
- 9 executeCommand nodes
- 9 executeWorkflow nodes (sub-workflow calls)
- 1 telegramTrigger node

Note: Node count (199) is above target range (120-150) but achieves
primary goals of eliminating duplicate logic. Further optimization
possible (~40-45 nodes) by consolidating batch UI and confirmation flows.

Deployment requires importing n8n-container-logs.json and updating
the workflow ID in main workflow Execute Text/Inline Logs nodes.
2026-02-04 13:58:48 -05:00
Lucas Berger 6471dcecd6 feat(10-05): extract logs flow to Container Logs sub-workflow
Created n8n-container-logs.json:
- Execute Workflow Trigger entry point
- Parse and validate input (containerId/Name, lineCount, chatId, messageId)
- Query Docker to find container by name if needed
- Execute docker logs command
- Format output for Telegram (HTML escape, truncate, add header)
- Return success/message/containerName/lineCount

Updated main workflow:
- Add Prepare Text Logs Input (text command path)
- Add Execute Text Logs sub-workflow node
- Add Prepare Inline Logs Input (inline keyboard path)
- Add Execute Inline Logs sub-workflow node
- Add Format Inline Logs Result (adds keyboard)
- Remove 14 obsolete inline logs nodes
- Node count: 208 -> 199 (-9)

Sub-workflow has placeholder ID - will be updated after n8n import in Task 4.
2026-02-04 13:56:51 -05:00
Lucas Berger 89e459f96c feat(10-05): wire batch actions to Container Actions sub-workflow
- Add Prepare Batch Action Input node to format sub-workflow input
- Add Execute Batch Action Sub-workflow node calling Container Actions
- Add Handle Batch Action Result Sub node to process results
- Remove 7 obsolete inline action nodes:
  * Build Batch Action Command
  * Execute Batch Container Action
  * Check Batch Action Result
  * Needs Action Call
  * Execute Batch Action 2
  * Parse Batch Action 2
  * Handle Action Result
- Node count: 212 -> 208 (-4 net)

This eliminates duplicate action execution logic between single and batch paths.
2026-02-04 13:54:51 -05:00
Lucas Berger e4a7098e0d feat(10-05): wire batch update to Container Update sub-workflow
- Add Prepare Batch Update Input node to format sub-workflow input
- Add Execute Batch Update node calling Container Update sub-workflow
- Add Handle Batch Update Result node to process results
- Connect update path (output 0) in Route Batch Loop Action
- Node count: 209 -> 212 (+3)

This completes the batch update integration with the modular sub-workflow,
eliminating the need for duplicate update logic in the main workflow.
2026-02-04 13:54:18 -05:00
Lucas BergerandClaude Opus 4.5 c7c23b77c3 docs(10): checkpoint - waves 1-3 complete, wave 4 pending
Completed:
- 10-01: Orphan cleanup (2 nodes removed)
- 10-02: Container Update sub-workflow (31 nodes)
- 10-03: Container Actions sub-workflow (8 nodes)
- 10-04: Integration verified with user

Pending:
- 10-05: Wire batch ops to sub-workflows, extract logs

Key fixes applied:
- n8n typeVersion 1.2 requires __rl resource locator format
- Docker 204 success detection via empty response check

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:46:48 -05:00
Lucas BergerandClaude Opus 4.5 b83f76b27b docs(10): add plan 10-05 for complete modularization
Wave 4 plan to finish workflow modularization:
- Wire batch update to Container Update sub-workflow
- Wire batch actions to Container Actions sub-workflow
- Extract logs flow to new Container Logs sub-workflow
- Target: reduce main workflow from 209 to ~120-140 nodes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:43:09 -05:00
Lucas BergerandClaude Opus 4.5 6ef2736cff fix(10-03): fix success detection for container actions
Docker API returns 204 No Content on success (empty response body).
Changed from checking statusCode (not available in n8n httpRequest)
to checking for absence of error/message in response body.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:37:03 -05:00
Lucas BergerandClaude Opus 4.5 5337e17f21 fix(10): use resource locator format for Execute Workflow nodes
n8n typeVersion 1.2 requires workflowId as resource locator object:
  { "__rl": true, "mode": "list", "value": "<id>" }
not a plain string. This was causing "workflow not found" errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:33:51 -05:00
Lucas BergerandClaude Opus 4.5 fd31902a82 fix(10-03): update container actions workflow ID
Recreated Container Actions sub-workflow via API to fix
"workflow not found" error. New ID: fYSZS5PkH0VSEaT5

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:28:03 -05:00
Lucas BergerandClaude Opus 4.5 40a05fe390 fix(10-02): hardcode sub-workflow IDs for self-hosted n8n
Self-hosted n8n doesn't support environment variables.
Replace $env references with actual workflow IDs:
- CONTAINER_UPDATE_WORKFLOW_ID → 7AvTzLtKXM2hZTio92_mC
- CONTAINER_ACTIONS_WORKFLOW_ID → xRRDIk19Gq57WECjtSy_j

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 13:20:00 -05:00
Lucas Berger d3c1525f53 docs(10-03): complete container actions sub-workflow plan
Tasks completed: 3/3
- Task 1: Create container-actions sub-workflow
- Task 2: Wire main workflow to use sub-workflow
- Task 3: Deploy verification (local checks passed)

SUMMARY: .planning/phases/10-workflow-modularization/10-03-SUMMARY.md

Note: Full deployment verification requires n8n access
User setup: Set CONTAINER_ACTIONS_WORKFLOW_ID env var in n8n
2026-02-04 13:12:36 -05:00
Lucas Berger d07932f69f feat(10-03): wire main workflow to use container-actions sub-workflow
- Added 9 nodes for sub-workflow integration
- Text path: Check Match Count -> Prepare Text Action Input -> Execute Container Action
- Inline path: Get Container For Action -> Prepare Inline Action Input -> Execute Inline Action
- Confirmed stop: Get Container For Stop -> Prepare Confirmed Stop Input -> Execute Confirmed Stop Action
- Confirmation dialogs remain in main workflow (stop, batch stop)
- Uses CONTAINER_ACTIONS_WORKFLOW_ID env var for sub-workflow reference
2026-02-04 13:10:14 -05:00
Lucas Berger d0b03b7159 feat(10-02): wire main workflow to use container-update sub-workflow
- Removed 54 duplicate update nodes from text and callback paths
- Added Execute Sub-workflow nodes for both update entry points
- Text path: Check Update Match Count -> Prepare Text Update Input -> Execute Text Update
- Callback path: Route Confirm Action -> Prepare Callback Update Input -> Execute Callback Update
- Workflow reduced from 246 to 200 nodes (-19%)
- Line count reduced from ~8485 to 7209 (-15%)

DEBT-03 (duplicated update flow) resolved - update logic now in one place
2026-02-04 13:08:37 -05:00
Lucas Berger 8c8ebee370 feat(10-02): create container-update sub-workflow
- New sub-workflow with 31 nodes encapsulating entire update flow
- Input contract: containerId, containerName, chatId, messageId, responseMode
- Output contract: success, updated, message, oldDigest, newDigest
- Handles both text and inline response modes
- Preserves :latest tag protection and old image cleanup
2026-02-04 13:07:13 -05:00
Lucas Berger 35705a7707 feat(10-03): create container actions sub-workflow
- Add n8n-container-actions.json with executeWorkflowTrigger
- Input contract: containerId, containerName, action, chatId, messageId, responseMode
- Routes to start/stop/restart via Switch node
- Returns: success, message, action, containerName for caller to handle response
2026-02-04 13:06:38 -05:00
Lucas Berger 99cdb95482 docs(10-01): complete orphan node cleanup plan
Tasks completed: 2/2
- Identified 2 orphan nodes via BFS from Telegram Trigger
- Removed orphan nodes, deployed, verified working

SUMMARY: .planning/phases/10-workflow-modularization/10-01-SUMMARY.md
2026-02-04 13:03:50 -05:00
Lucas Berger f3bdd88c75 chore(10-01): remove 2 orphan nodes from workflow
Cleaned up orphan nodes before modularization:
- Removed "Answer Batch Exec" (httpRequest at [1340, 900])
- Removed "Batch Loop" (splitInBatches at [3100, -500])

Both nodes had no incoming connections and were vestigial
from earlier batch operation development that was replaced.

Node count: 248 -> 246
Deployed and verified working via n8n API.
2026-02-04 13:02:58 -05:00
Lucas BergerandClaude Opus 4.5 c122803fad docs(10): create phase plan for workflow modularization
Phase 10: Workflow Modularization
- 4 plan(s) in 3 wave(s)
- Wave 1: Orphan cleanup (1 plan)
- Wave 2: Sub-workflow extraction (2 plans parallel)
- Wave 3: Integration verification (1 plan)
- Ready for execution

Plans:
- 10-01: Remove 8 orphan nodes
- 10-02: Extract container-update sub-workflow (DEBT-03)
- 10-03: Extract container-actions sub-workflow
- 10-04: Integration verification with user checkpoint

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:39:54 -05:00
Lucas BergerandClaude Opus 4.5 a8e947ec95 docs: split Phase 10 into modularization and update all
Phase 10: Workflow Modularization (MOD-01, MOD-02, DEBT-03)
Phase 11: Update All & Callback Limits (BATCH-04-07)
Phase 12: Polish & Audit (UNR-01, ENV-01, ENV-02, DEBT-02)
Phase 13: Documentation Overhaul (DEBT-01)

12 requirements across 4 phases.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:23:19 -05:00
Lucas BergerandClaude Opus 4.5 63df54e8e3 docs: formalize v1.2 requirements and roadmap
12 requirements across 3 phases:
- Phase 10: Modularization, update all, callback limits (7 reqs)
- Phase 11: Unraid sync, env audit, tech debt (4 reqs)
- Phase 12: Documentation overhaul (1 req)

Removed WEB-01 (webhook fix) - already resolved.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:21:31 -05:00
Lucas BergerandClaude Opus 4.5 6a0551e0d6 chore: archive v1.1 audit and add tech debt to Phase 11
Archived:
- milestones/v1.1/v1.1-MILESTONE-AUDIT.md
- milestones/v1.1/INTEGRATION-CHECK.md

Updated:
- ROADMAP.md: Added v1.1 tech debt to Phase 11
- STATE.md: Updated with tech debt tracking

Tech debt items added to Phase 11:
- README.md documentation (still shows direct socket)
- Duplicate --max-time flags in image pull
- Update flow duplication between single/batch paths

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:16:03 -05:00
Lucas BergerandClaude Opus 4.5 b89f78db21 chore: complete v1.1 milestone
Archived:
- milestones/v1.1-ROADMAP.md
- milestones/v1.1-REQUIREMENTS.md

Deleted (fresh for next milestone):
- REQUIREMENTS.md

Updated:
- MILESTONES.md (new v1.1 entry)
- PROJECT.md (requirements → Validated, updated current state)
- ROADMAP.md (v1.1 collapsed, v1.2 phases added)
- STATE.md (reset for v1.2)

v1.1 shipped: Inline keyboard UX and Docker security hardening
- Phases 6-9 complete (11 plans)
- 4 requirements deferred to v1.2 (UNR-01, ENV-01, ENV-02, WEB-01)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:55:26 -05:00
Lucas BergerandClaude Opus 4.5 fa7c60394e docs(09): complete batch operations phase verification
- Created 09-04-SUMMARY.md with verification results
- Documented 5 bugs fixed during verification
- All batch operations tested and working
- Update all testing deferred (Unraid UI issue)
- Updated STATE.md to reflect phase completion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:49:35 -05:00
Lucas BergerandClaude Opus 4.5 5565334d94 fix(09-04): restore missing update route in Keyword Router
- Added missing connection for "update" rule (index 6)
- This shifted "logs" to correct index 7
- Both text-based update and logs commands now work

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:47:41 -05:00
Lucas BergerandClaude Opus 4.5 7ee722418c fix(09-04): show Back to List for inline keyboard batch stop
- Add :kb marker to inline keyboard stop confirmation callback
- Parse Callback Data detects :kb and sets fromKeyboard: true
- Prepare Batch Stop Exec passes fromKeyboard through to batch state
- Summary now correctly shows Back to List for keyboard flows only

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:41:55 -05:00
Lucas BergerandClaude Opus 4.5 850a507684 fix(09-04): hide Back to List button for text command batches
- Track fromKeyboard in batch state (true for callbacks, false for text)
- Pass fromKeyboard through entire batch loop chain
- Build Batch Summary only includes Back to List when fromKeyboard=true
- Send Batch Summary uses conditional reply_markup from input

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:33:46 -05:00
Lucas BergerandClaude Opus 4.5 8b231bbbb5 docs(09-04): note 64-byte callback_data limitations
- Long container names hit limit
- Batch select limited to ~2 containers with current format
- Consider short IDs or server-side state in Phase 9.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:25:24 -05:00
Lucas BergerandClaude Opus 4.5 893a37e9c9 chore(09-04): defer batch Update to Phase 9.1
- Remove Update button from batch select (not implemented)
- Document in STATE.md: batch update needs sub-workflow modularization
- Batch Start and Stop work; Update requires complex 5-step sequence

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:24:08 -05:00
Lucas BergerandClaude Opus 4.5 5a0d73cb98 fix(09-04): fix Delete Batch Select Message chatId reference
Reference Prepare Immediate Batch Exec directly for chatId/messageId
instead of $json which is the Telegram response from previous node.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:18:55 -05:00