{"record":{"id":"a78bb594e6fec544","repo":"affaan-m/ECC","slug":"unsupported-architecture-architecture","errorCode":null,"errorMessage":"Unsupported architecture: ${architecture}","messagePattern":"Unsupported architecture: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/nasiko-release.js","lineNumber":35,"sourceCode":"const MAX_BINARY_BYTES = 64 * 1024 * 1024;\nconst MAX_METADATA_BYTES = 64 * 1024;\nconst SHA256_PATTERN = /^sha256:[a-f0-9]{64}$/;\n\nconst QUALIFIED_RELEASES = Object.freeze({\n  'v0.1.0': Object.freeze({\n    'linux/amd64': Object.freeze({ manifestDigest: 'sha256:0df748a40f3d714b6b6a3376a1d13a224c05bdb8d1628f31ace5a7bee8ceb9de', binaryDigest: 'sha256:94a2bcab2d3832257e0111480bb7c3dcac81d63a7ae9bac53206a92c0957ee0f' }),\n    'linux/arm64': Object.freeze({ manifestDigest: 'sha256:655021a129c7df4621a80d16ea4eab38018530bfe9a20da646641d9f4ac5c249', binaryDigest: 'sha256:85f9fa5cfbed6c276fce6df2d71e9d0c66d7d8e8d46a40297464833d38db7a7e' }),\n    'darwin/amd64': Object.freeze({ manifestDigest: 'sha256:b4188482621efd7da5a2ab630f653665ab5f80b9aceae448b6bb5fc93e003f06', binaryDigest: 'sha256:ed6232e0bb96a2dcfd86d3c25f86021091600d52f09250403a54528bfe8100a3' }),\n    'darwin/arm64': Object.freeze({ manifestDigest: 'sha256:ce7e54fa19f989a5d125c4409b3587ca9503bb5a07bc5ff223c60e0fbad437f0', binaryDigest: 'sha256:3c60f862b04eea1b9a633593b39f1a443d9ca2123cf3edfd150d313e95f3894b' }),\n    'windows/amd64': Object.freeze({ manifestDigest: 'sha256:0760fe1fc98e8fedb66796aaf891a1de9268af1338c5e88b949656fda5d9f045', binaryDigest: 'sha256:0f57672d24fc3c70e4cbbf22864e65b35b9978ddaae3793803841536e682929b' }),\n  }),\n});\n\nfunction normalizePlatform(platform = process.platform, architecture = process.arch) {\n  const osName = platform === 'win32' ? 'windows' : platform;\n  if (!['linux', 'darwin', 'windows'].includes(osName)) throw new Error(`Unsupported platform: ${platform}`);\n  const arch = architecture === 'x64' ? 'amd64' : architecture;\n  if (!['amd64', 'arm64'].includes(arch)) throw new Error(`Unsupported architecture: ${architecture}`);\n  if (osName === 'windows' && arch !== 'amd64') throw new Error(`Unsupported architecture for Windows: ${architecture}`);\n  return { os: osName, arch, binaryName: osName === 'windows' ? 'nasiko.exe' : 'nasiko' };\n}\n\nfunction getQualifiedRelease(version, platform = process.platform, architecture = process.arch) {\n  if (!/^v\\d+\\.\\d+\\.\\d+$/.test(String(version || ''))) {\n    throw new Error('Nasiko installation requires a pinned version such as v0.1.0; latest is not allowed.');\n  }\n  const normalized = normalizePlatform(platform, architecture);\n  const qualification = QUALIFIED_RELEASES[version]?.[`${normalized.os}/${normalized.arch}`];\n  if (!qualification) throw new Error(`Nasiko ${version} is not qualified for ${normalized.os}/${normalized.arch}.`);\n  return { version, ...normalized, ...qualification, license: LICENSE, sourceUrl: SOURCE_URL };\n}\n\nfunction digestBytes(bytes) {\n  return `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;\n}\n","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/affaan-m/ECC/blob/06c5e118c4d3e6c3b7f9445f973a2194c82de193/scripts/lib/nasiko-release.js#L17-L53","documentation":"normalizePlatform in scripts/lib/nasiko-release.js maps Node's 'x64' to 'amd64' and then only accepts 'amd64' and 'arm64'. Any other process.arch value fails this check because no Nasiko binary is qualified for it. This runs before the per-version qualification lookup, so it fires for every install attempt on such hardware/runtime combinations.","triggerScenarios":"Calling getQualifiedRelease with architecture 'ia32' (32-bit Node), 'arm' (ARMv7 32-bit boards), 'ppc64'/'ppc64le', 's390x', 'riscv64', or 'loong64'. Most common concrete case: a 32-bit (ia32) Node installation on a 64-bit OS, where process.arch reports 'ia32'.","commonSituations":"32-bit Node installed by accident on Windows x64 (the x86 MSI); Raspberry Pi OS with 32-bit userland reporting 'arm'; IBM Power and s390x CI images; exotic RISC-V toolchain containers.","solutions":["Install a 64-bit Node build (amd64/x64) or an arm64 build so process.arch reports a supported value","On ARMv7 hardware, run the install inside an arm64 or amd64 environment/container","Verify with `node -p process.arch` before invoking the installer"],"exampleFix":"# before: 32-bit Node on a 64-bit OS\n$ node -p process.arch\nia32\n# after: reinstall Node.js x64, then\n$ node -p process.arch\nx64","handlingStrategy":"validation","validationCode":"const NASIKO_ARCHES = new Set(['x64', 'arm64']);\nif (!NASIKO_ARCHES.has(process.arch)) {\n  throw new Error(`Nasiko install unsupported on ${process.arch}; install a 64-bit Node runtime`);\n}","typeGuard":"type NasikoArch = 'x64' | 'arm64';\nconst isNasikoArch = (a: string): a is NasikoArch => a === 'x64' || a === 'arm64';","tryCatchPattern":"try {\n  await installNasiko({ version: 'v0.1.0' });\n} catch (error) {\n  if (/^Unsupported architecture(?! for Windows)/.test(String(error.message))) {\n    // Guide the user to install x64/arm64 Node; not retryable as-is.\n  }\n  throw error;\n}","preventionTips":["Check `node -p process.arch` in bootstrap scripts; expect x64 or arm64","Standardize CI images on 64-bit Node to avoid accidental ia32 installs","On ARM SBCs, prefer 64-bit userlands so Node reports arm64, not arm"],"tags":["architecture","install","environment-check"],"backgroundTag":"unsupported-architecture","analyzedSha":"06c5e118c4d3e6c3b7f9445f973a2194c82de193","analyzedAt":"2026-08-18T11:27:13.915Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}