Files
ForgeFlow/reports/architecture-audit.json
T
NuklearRabbitandClaude Opus 5 cb9bdcd713 perf: reuse SSH connections per server, with a retry rule that never repeats work
Every ssh.exec opened its own connection: a TCP handshake, a key exchange and an
authentication round trip per command. A key rotation paid for that eight times,
a deployment six, and refreshing M profile states M times.

Connections are now kept per server. The three risks that made this worth doing
carefully are handled explicitly:

- Staleness. A pooled connection can be dead exactly when it matters. Liveness is
  tracked through error, close and end, and a lease that finds a dead entry opens
  a new one. The remaining race, where the connection dies between the check and
  the command, is caught by the retry rule below.
- Retrying. Only a failure that proves the command never reached the server is
  retried, and only once, and only on a connection that was already established
  before this call. execClient marks exactly that case, when the channel fails to
  open. A command that opened a stream is never repeated, because the server may
  already be acting on it - repeating a deployment is not this layer's decision.
  Two tests hold that line: widening the rule to any failure fails both.
- Lifetime. Idle connections close after a minute, the pool is reference counted
  so a shared connection survives until its last user is done, closeAll runs
  during quit, and every pooled client keeps a standing error listener so an
  error while idle cannot reach the uncaughtException handler.

A trust-on-first-use connection is never pooled: it was established without
verifying the fingerprint, so it must not serve a later verified call. A change
to host, port, user, auth type, key path or trusted fingerprint invalidates the
pooled connection.

ssh-service coverage rises from 61% to 90% of lines and 97% of functions.

Also in this commit, the smaller items from the same review:

- Diagnostics batched records that queue up while a write is in flight into one
  append, and chmod runs once per file instead of once per record. At the debug
  level every IPC call writes a line, which is exactly when troubleshooting.
- The set that suppresses duplicate deployment notifications is trimmed instead
  of growing for the lifetime of the process.
- The updater kept the same once('error') pattern on its spawned helper that
  took the app down through the SSH client.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:06:38 +02:00

732 lines
15 KiB
JSON

{
"generatedAt": "2026-08-23T13:06:16.630Z",
"thresholds": {
"preferredMaximumLines": 750,
"justificationRequiredLines": 1000
},
"over750": [],
"over1000": [],
"cyclomaticHotspots": [
{
"file": "src/renderer/actions/shell.js",
"lines": 518,
"branches": 101,
"functions": 86,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"updates"
],
"hotspotScore": 131
},
{
"file": "src/renderer/app.js",
"lines": 732,
"branches": 80,
"functions": 124,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 120
},
{
"file": "src/main/server-inventory.cjs",
"lines": 578,
"branches": 89,
"functions": 104,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 119
},
{
"file": "src/main/git-service.cjs",
"lines": 687,
"branches": 111,
"functions": 118,
"ipcHandlers": 0,
"responsibilities": [
"git",
"security"
],
"hotspotScore": 111
},
{
"file": "src/main/unraid-inventory-methods.cjs",
"lines": 708,
"branches": 76,
"functions": 93,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 106
}
],
"mixedResponsibilityModules": [
{
"file": "src/renderer/actions/shell.js",
"lines": 518,
"branches": 101,
"functions": 86,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"updates"
],
"hotspotScore": 131
},
{
"file": "src/renderer/app.js",
"lines": 732,
"branches": 80,
"functions": 124,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 120
},
{
"file": "src/main/server-inventory.cjs",
"lines": 578,
"branches": 89,
"functions": 104,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 119
},
{
"file": "src/main/unraid-inventory-methods.cjs",
"lines": 708,
"branches": 76,
"functions": 93,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 106
},
{
"file": "src/main/unraid-deployment-methods.cjs",
"lines": 583,
"branches": 69,
"functions": 31,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 99
},
{
"file": "src/renderer/dialogs.js",
"lines": 419,
"branches": 58,
"functions": 80,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 98
},
{
"file": "src/renderer/views.js",
"lines": 715,
"branches": 53,
"functions": 152,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 93
},
{
"file": "src/main/ipc.cjs",
"lines": 694,
"branches": 51,
"functions": 70,
"ipcHandlers": 27,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"security",
"updates"
],
"hotspotScore": 91
},
{
"file": "main.cjs",
"lines": 471,
"branches": 39,
"functions": 57,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"renderer",
"security",
"updates"
],
"hotspotScore": 89
},
{
"file": "src/renderer/actions/setup-and-settings.js",
"lines": 427,
"branches": 58,
"functions": 58,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 88
},
{
"file": "src/main/gitea-service.cjs",
"lines": 624,
"branches": 67,
"functions": 57,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 87
},
{
"file": "src/main/ssh-service.cjs",
"lines": 467,
"branches": 66,
"functions": 92,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 86
},
{
"file": "src/renderer/actions/deployment-profile.js",
"lines": 407,
"branches": 56,
"functions": 44,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security"
],
"hotspotScore": 86
},
{
"file": "src/main/config-store.cjs",
"lines": 665,
"branches": 52,
"functions": 89,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 82
},
{
"file": "src/main/unraid-preflight-methods.cjs",
"lines": 623,
"branches": 40,
"functions": 47,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 80
},
{
"file": "src/main/unraid-runtime-methods.cjs",
"lines": 388,
"branches": 37,
"functions": 38,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 77
},
{
"file": "src/renderer/actions/recovery.js",
"lines": 356,
"branches": 56,
"functions": 38,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"renderer",
"updates"
],
"hotspotScore": 76
},
{
"file": "src/main/unraid-access-methods.cjs",
"lines": 462,
"branches": 43,
"functions": 41,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 73
},
{
"file": "src/main/diagnostics-service.cjs",
"lines": 373,
"branches": 39,
"functions": 51,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"ipc",
"security",
"updates"
],
"hotspotScore": 69
},
{
"file": "src/renderer/events.js",
"lines": 181,
"branches": 35,
"functions": 27,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security"
],
"hotspotScore": 65
},
{
"file": "src/main/git-validator-service.cjs",
"lines": 600,
"branches": 43,
"functions": 77,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 63
},
{
"file": "src/main/deploy-key-lifecycle-service.cjs",
"lines": 192,
"branches": 31,
"functions": 38,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 61
},
{
"file": "src/main/unraid-deployment-service.cjs",
"lines": 525,
"branches": 35,
"functions": 48,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security"
],
"hotspotScore": 55
},
{
"file": "src/renderer/actions/inventory.js",
"lines": 186,
"branches": 24,
"functions": 32,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"updates"
],
"hotspotScore": 54
},
{
"file": "src/renderer/actions/deployment-operation.js",
"lines": 184,
"branches": 34,
"functions": 26,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"renderer",
"updates"
],
"hotspotScore": 54
},
{
"file": "src/main/ipc/deployment-handlers.cjs",
"lines": 286,
"branches": 13,
"functions": 38,
"ipcHandlers": 24,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"security",
"updates"
],
"hotspotScore": 53
},
{
"file": "preload.cjs",
"lines": 162,
"branches": 2,
"functions": 123,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"renderer",
"security",
"updates"
],
"hotspotScore": 52
},
{
"file": "src/main/inventory-classifier.cjs",
"lines": 84,
"branches": 22,
"functions": 11,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 52
},
{
"file": "src/renderer/mock-deployment-bridge.js",
"lines": 701,
"branches": 11,
"functions": 87,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 51
},
{
"file": "src/renderer/operations.js",
"lines": 212,
"branches": 19,
"functions": 26,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"renderer",
"security",
"updates"
],
"hotspotScore": 49
},
{
"file": "src/main/production-acceptance-harness.cjs",
"lines": 150,
"branches": 17,
"functions": 28,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 47
},
{
"file": "src/main/unraid-state-methods.cjs",
"lines": 294,
"branches": 16,
"functions": 21,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 46
},
{
"file": "src/main/preflight-service.cjs",
"lines": 209,
"branches": 24,
"functions": 34,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"renderer",
"security"
],
"hotspotScore": 44
},
{
"file": "src/main/repository-service.cjs",
"lines": 304,
"branches": 22,
"functions": 46,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 42
},
{
"file": "src/renderer/mock-bridge.js",
"lines": 590,
"branches": 17,
"functions": 54,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 37
},
{
"file": "src/renderer/mock-repository-bridge.js",
"lines": 636,
"branches": 13,
"functions": 89,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 33
},
{
"file": "src/main/deployment-identity.cjs",
"lines": 36,
"branches": 0,
"functions": 11,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 30
},
{
"file": "src/main/ipc/operations-handlers.cjs",
"lines": 101,
"branches": 8,
"functions": 14,
"ipcHandlers": 9,
"responsibilities": [
"deployment",
"git",
"ipc",
"renderer"
],
"hotspotScore": 28
},
{
"file": "src/main/inventory-review-service.cjs",
"lines": 32,
"branches": 8,
"functions": 4,
"ipcHandlers": 0,
"responsibilities": [
"inventory",
"deployment",
"git",
"updates"
],
"hotspotScore": 28
},
{
"file": "src/main/unraid-deploy-key-host.cjs",
"lines": 80,
"branches": 7,
"functions": 22,
"ipcHandlers": 0,
"responsibilities": [
"deployment",
"git",
"security",
"updates"
],
"hotspotScore": 27
}
],
"ipcHotspots": [
{
"file": "src/main/ipc.cjs",
"lines": 694,
"branches": 51,
"functions": 70,
"ipcHandlers": 27,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"security",
"updates"
],
"hotspotScore": 91
},
{
"file": "src/main/ipc/deployment-handlers.cjs",
"lines": 286,
"branches": 13,
"functions": 38,
"ipcHandlers": 24,
"responsibilities": [
"inventory",
"deployment",
"git",
"ipc",
"security",
"updates"
],
"hotspotScore": 53
},
{
"file": "src/main/ipc/repository-handlers.cjs",
"lines": 413,
"branches": 16,
"functions": 79,
"ipcHandlers": 51,
"responsibilities": [
"git",
"ipc"
],
"hotspotScore": 16
}
]
}