7.5 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | completed | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 15-infrastructure-foundation | 02 | infra |
|
|
|
|
|
|
|
|
5min | 2026-02-09 |
Phase 15 Plan 02: GraphQL Utility Nodes Summary
GraphQL Response Normalizer, Error Handler, and HTTP Template utility nodes for zero-change Unraid API migration
Performance
- Duration: 5 minutes
- Started: 2026-02-09T13:47:13Z
- Completed: 2026-02-09T13:52:29Z
- Tasks: 2
- Files modified: 1
Accomplishments
- GraphQL Response Normalizer transforms Unraid API shape to Docker API contract (id->Id, UPPERCASE state->lowercase, names preserved)
- GraphQL Error Handler maps ALREADY_IN_STATE to HTTP 304 equivalent, handles NOT_FOUND/FORBIDDEN/UNAUTHORIZED
- Unraid API HTTP Template pre-configured with 15-second timeout, environment variable auth, and continueRegularOutput
- All three utility nodes standalone (not connected) - ready for Phase 16 API migration wiring
Task Commits
Each task was committed atomically:
- Task 1: Add GraphQL Response Normalizer utility node -
1b4b596(feat) - Task 2: Add GraphQL Error Handler and Unraid API HTTP Template nodes -
e6ac219(feat)
Files Created/Modified
n8n-workflow.json- Added 3 utility nodes (GraphQL Response Normalizer, GraphQL Error Handler, Unraid API HTTP Template) at positions [200,2600], [600,2600], [1000,2600]
Decisions Made
-
Full Unraid PrefixedID preservation: GraphQL normalizer copies the full 129-character Unraid ID to the Docker API
Idfield. Translation happens downstream via the Container ID Registry (Plan 01), not in the normalizer. This keeps normalization focused on API shape transformation only. -
STOPPED->exited mapping: Unraid returns "STOPPED" state, Docker API uses "exited" for stopped containers. Normalizer maps STOPPED->exited to match Docker convention, ensuring existing workflow nodes recognize stopped containers correctly.
-
ALREADY_IN_STATE = HTTP 304: When container is already in desired state (e.g., "start" on running container), Unraid returns ALREADY_IN_STATE error code. Mapped to HTTP 304 to match Docker API pattern used in n8n-actions.json, allowing existing success/failure logic to work unchanged.
-
15-second HTTP timeout: myunraid.net cloud relay adds 200-500ms latency (Phase 14 measurement). 15 seconds provides safety margin for slow operations like container start/stop (3-5 seconds) plus relay overhead.
-
continueRegularOutput error mode: HTTP Request node configured to pass errors as regular output instead of n8n catching them. Allows downstream GraphQL Error Handler Code node to inspect response.errors[] array and map error codes appropriately.
Deviations from Plan
Auto-fixed Issues
1. [Rule 3 - Blocking] Fixed Container ID Registry invalid property
- Found during: Task 2 (n8n API push validation)
- Issue: Container ID Registry node (from Task 1 commit) had
notesDisplayMode: 'show'property which is not valid for n8n API PUT requests. API returned HTTP 400 with "must NOT have additional properties" error. - Fix: Removed
notesDisplayModeproperty from Container ID Registry node. This property is display-only and not part of the n8n workflow schema for API operations. - Files modified: n8n-workflow.json
- Verification: Workflow successfully pushed to n8n with HTTP 200 response
- Committed in:
e6ac219(Task 2 commit)
Total deviations: 1 auto-fixed (1 blocking) Impact on plan: Auto-fix necessary to push workflow to n8n. Property was UI-only metadata not required for functionality. No scope impact.
Issues Encountered
n8n API validation on push: Initial push attempts failed with HTTP 400 "must NOT have additional properties" for node 170. Root cause was notesDisplayMode property present on Container ID Registry node from previous task. Property is valid in n8n UI but rejected by API validation on PUT requests. Fixed by removing the property (see Deviations).
User Setup Required
None - no external service configuration required. All utility nodes use existing environment variables (UNRAID_HOST, UNRAID_API_KEY) configured in Phase 14.
Next Phase Readiness
Phase 16 (API Migration) ready to begin:
- Three utility nodes provide complete transformation pipeline: HTTP Request -> Error Handler -> Response Normalizer -> existing workflow nodes
- HTTP Template serves as copy-paste template for migrating each Docker API call to Unraid GraphQL
- Error handler maps Unraid error codes to Docker HTTP status codes (304, 404, etc.)
- Normalizer ensures zero changes required to 60+ downstream Code nodes expecting Docker API format
- All nodes validated and pushed to n8n successfully
Blockers: None
Notes:
- Container ID Registry node (from uncommitted Plan 01 work) was included in Task 1 commit. This node is required for Plan 02's normalizer but belongs to Plan 01. Plan 01 should be executed to complete the Container ID Registry implementation (add translation helper functions).
- Task 2 commit accidentally included 2 extra nodes (Callback Token Encoder, Callback Token Decoder) that were not part of Plan 02. These appear to be from uncommitted work in the repository. Total nodes added: 4 instead of planned 2. The extra nodes do not affect Plan 02 functionality.
Self-Check
Files: PASSED - n8n-workflow.json exists and modified
Commits: PASSED - 1b4b596 (Task 1) and e6ac219 (Task 2) exist
Nodes: PASSED - All 3 Plan 02 utility nodes exist in workflow
Node count: DISCREPANCY - 175 nodes total (expected 173). Task 2 commit included 4 nodes instead of 2 (see Notes above).
Phase: 15-infrastructure-foundation Completed: 2026-02-09