{"record":{"id":"51550f40e7fac741","repo":"gchq/CyberChef","slug":"2-start-must-be-between-1-and-31","errorCode":null,"errorMessage":"Χ2 start must be between 1 and 31","messagePattern":"Χ2 start must be between 1 and 31","errorType":"exception","errorClass":"OperationError","httpStatus":null,"severity":"error","filePath":"src/core/operations/Colossus.mjs","lineNumber":441,"sourceCode":"        if (settotal < 0 || settotal > 9999)\n            throw new OperationError(\"Set Total must be between 0000 and 9999\");\n\n        // null|fast|slow for each of S1-5,M1-2,X1-5\n        const control = {\n            fast: args[43],\n            slow: args[44]\n        };\n\n        // Start positions\n        if (args[52]<1 || args[52]>43) throw new OperationError(\"Ψ1 start must be between 1 and 43\");\n        if (args[53]<1 || args[53]>47) throw new OperationError(\"Ψ2 start must be between 1 and 47\");\n        if (args[54]<1 || args[54]>51) throw new OperationError(\"Ψ3 start must be between 1 and 51\");\n        if (args[55]<1 || args[55]>53) throw new OperationError(\"Ψ4 start must be between 1 and 53\");\n        if (args[56]<1 || args[57]>59) throw new OperationError(\"Ψ5 start must be between 1 and 59\");\n        if (args[51]<1 || args[51]>37) throw new OperationError(\"Μ37 start must be between 1 and 37\");\n        if (args[50]<1 || args[50]>61) throw new OperationError(\"Μ61 start must be between 1 and 61\");\n        if (args[45]<1 || args[45]>41) throw new OperationError(\"Χ1 start must be between 1 and 41\");\n        if (args[46]<1 || args[46]>31) throw new OperationError(\"Χ2 start must be between 1 and 31\");\n        if (args[47]<1 || args[47]>29) throw new OperationError(\"Χ3 start must be between 1 and 29\");\n        if (args[48]<1 || args[48]>26) throw new OperationError(\"Χ4 start must be between 1 and 26\");\n        if (args[49]<1 || args[49]>23) throw new OperationError(\"Χ5 start must be between 1 and 23\");\n\n        const starts = {\n            X1: args[45], X2: args[46], X3: args[47], X4: args[48], X5: args[49],\n            M61: args[50], M37: args[51],\n            S1: args[52], S2: args[53], S3: args[54], S4: args[55], S5: args[56]\n        };\n\n        const colossus = new ColossusComputer(input, pattern, qbusin, qbusswitches, control, starts, settotal, limit);\n        const result = colossus.run();\n\n        return result;\n    }\n\n    /**\n     * Select Program","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/gchq/CyberChef/blob/4290ea753912378913b1f3f54e0fc5720afeda5d/src/core/operations/Colossus.mjs#L423-L459","documentation":"The Colossus operation simulates the WWII Lorenz SZ40/42 cipher broken by the Colossus computer. Each wheel has a fixed number of cam positions; the chi-2 (Χ2) wheel has exactly 31. The start position is a 1-based index into that wheel, so it must satisfy 1 <= value <= 31. The guard `if (args[46]<1 || args[46]>31)` rejects anything outside that inclusive range before constructing the ColossusComputer.","triggerScenarios":"Setting the 'Χ2 start' recipe argument (args[46]) to 0, a negative number, or any integer greater than 31 (e.g. 32, 40). Also triggered by passing a non-integer/string that coerces out of range, or by transposing wheel sizes when filling in all twelve start positions.","commonSituations":"Off-by-one from assuming 0-based indexing; copying a start vector from a source that used different wheel numbering; confusing Χ2's 31 positions with another wheel's size. Note: the adjacent line 437 has a latent bug (`args[57]>59` instead of `args[56]>59` for Ψ5) — unrelated to this error but worth flagging when editing this block.","solutions":["Set the Χ2 start argument to an integer in the inclusive range [1, 31].","If you loaded a known key setting, re-check it against the Lorenz SZ chi-2 wheel length of 31.","When scripting the Node API, clamp or validate all twelve start positions against their wheel sizes (Χ: 41,31,29,26,23; Μ: 61,37; Ψ: 43,47,51,53,59) before baking."],"exampleFix":"// before\nconst args = setupArgs();\nargs[46] = 32; // throws: Χ2 start must be between 1 and 31\n// after\nargs[46] = 31; // valid: chi-2 wheel has 31 positions","handlingStrategy":"validation","validationCode":"const CHI2_START_MAX = 31;\nfunction validChi2Start(v) {\n  return Number.isInteger(v) && v >= 1 && v <= CHI2_START_MAX;\n}\nif (!validChi2Start(starts.X2)) {\n  throw new Error(`Χ2 start ${starts.X2} out of range [1, ${CHI2_START_MAX}]`);\n}","typeGuard":"function isChi2Start(v) {\n  return Number.isInteger(v) && v >= 1 && v <= 31;\n}","tryCatchPattern":null,"preventionTips":["Validate every wheel start against its fixed size before baking: Χ(41,31,29,26,23), Μ(61,37), Ψ(43,47,51,53,59).","Remember start positions are 1-based, not 0-based.","When transcribing a key setting, label each value with its wheel name to avoid column misalignment."],"tags":["cyberchef","colossus","lorenz","range-check","validation","operation-error"],"backgroundTag":null,"analyzedSha":"4290ea753912378913b1f3f54e0fc5720afeda5d","analyzedAt":"2026-08-13T06:05:50.210Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}