affaan-m/ECC · error · Error
Nasiko is not qualified for / .
Error message
Nasiko ${version} is not qualified for ${normalized.os}/${normalized.arch}. What it means
getQualifiedRelease looks up the version in the QUALIFIED_RELEASES matrix by 'os/arch'. If the version is pinned correctly but no entry exists for that platform combination, it throws — meaning that version was never qualified (digest-pinned) for that target. This prevents installing binaries without verified checksums.
Solutions
- Check QUALIFIED_RELEASES in scripts/lib/nasiko-release.js for supported os/arch combos for your version
- Pick a version qualified for your platform, or a platform qualified for your version
- Update the ECC plugin so the release matrix includes the new version/platform
Example fix
// before
getQualifiedRelease('v0.1.0', 'darwin', 'arm64'); // not qualified
// after
getQualifiedRelease('v0.2.0', 'darwin', 'arm64'); // qualified combo Defensive patterns
Strategy: validation
Validate before calling
// requires reading the module's matrix
const { QUALIFIED_RELEASES } = require('./scripts/lib/nasiko-release.js');
const key = `${os}/${arch === 'x64' ? 'amd64' : arch}`;
if (!QUALIFIED_RELEASES[version]?.[key]) {
throw new Error(`${version} has no qualified build for ${key}`);
} Type guard
function isQualified(version, os, arch) {
return Boolean(QUALIFIED_RELEASES[version]?.[`${os}/${arch}`]);
} Try / catch
try {
const rel = getQualifiedRelease(version, platform, arch);
} catch (e) {
if (e.message.includes('is not qualified for')) {
console.error('Pick a version/platform pair in QUALIFIED_RELEASES.');
} else throw e;
} Prevention
- Check the release matrix before adding new platform/version combos to CI
- Pin versions known to ship your arch (e.g. darwin/arm64 support)
- Keep the ECC plugin updated so new release qualifications are present
When it happens
Trigger: getQualifiedRelease('v0.1.0', 'darwin', 'arm64') when v0.1.0 only ships linux/amd64 etc.; a version string that passes the regex but doesn't exist in QUALIFIED_RELEASES at all (undefined optional-chained to undefined qualification).
Common situations: New hardware (Apple Silicon, ARM servers) before a release adds its digests; asking for a future/older version not in the matrix; matrix out of date after upgrading the plugin.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Nasiko installation requires a pinned version such as…
- Unsupported architecture
- Unsupported asset receipt schema
- Unsupported canonical session schema version
- Unsupported platform
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/c601db4f830dc042.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/lib/nasiko-release.js:46
}),
});
function normalizePlatform(platform = process.platform, architecture = process.arch) {
const osName = platform === 'win32' ? 'windows' : platform;
if (!['linux', 'darwin', 'windows'].includes(osName)) throw new Error(`Unsupported platform: ${platform}`);
const arch = architecture === 'x64' ? 'amd64' : architecture;
if (!['amd64', 'arm64'].includes(arch)) throw new Error(`Unsupported architecture: ${architecture}`);
if (osName === 'windows' && arch !== 'amd64') throw new Error(`Unsupported architecture for Windows: ${architecture}`);
return { os: osName, arch, binaryName: osName === 'windows' ? 'nasiko.exe' : 'nasiko' };
}
function getQualifiedRelease(version, platform = process.platform, architecture = process.arch) {
if (!/^v\d+\.\d+\.\d+$/.test(String(version || ''))) {
throw new Error('Nasiko installation requires a pinned version such as v0.1.0; latest is not allowed.');
}
const normalized = normalizePlatform(platform, architecture);
const qualification = QUALIFIED_RELEASES[version]?.[`${normalized.os}/${normalized.arch}`];
if (!qualification) throw new Error(`Nasiko ${version} is not qualified for ${normalized.os}/${normalized.arch}.`);
return { version, ...normalized, ...qualification, license: LICENSE, sourceUrl: SOURCE_URL };
}
function digestBytes(bytes) {
return `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
}
function assertDigest(bytes, expectedDigest, label) {
if (!SHA256_PATTERN.test(expectedDigest)) throw new Error(`${label} has an invalid expected digest.`);
const actual = digestBytes(bytes);
if (actual !== expectedDigest) throw new Error(`${label} digest mismatch: expected ${expectedDigest}, got ${actual}.`);
}
function validateManifest(bytes) {
let manifest;
try { manifest = JSON.parse(bytes.toString('utf8')); } catch (_error) { throw new Error('Nasiko manifest is not valid JSON.'); }
if (manifest.schemaVersion !== 2 || !Array.isArray(manifest.layers) || manifest.layers.length !== 1) {
throw new Error('Nasiko manifest must contain exactly one OCI layer.');View on GitHub (pinned to 8321021c54)