ruvnet/ruflo · error
unsupported flywheel anchor manifest schema
Error message
unsupported flywheel anchor manifest schema: ${manifest.schemaVersion} What it means
The project anchor manifest (`.claude/eval/flywheel-anchor.manifest.json` by default) must declare `schemaVersion: 'ruflo.flywheel-anchor-manifest/v1'` (PROJECT_ANCHOR_MANIFEST_SCHEMA). Any other value aborts manifest processing before path resolution, so future format changes fail loudly instead of being misread.
Solutions
- Set `schemaVersion` to exactly `ruflo.flywheel-anchor-manifest/v1`
- Check the release notes of your claude-flow version if a different manifest schema identifier is expected
- Regenerate the manifest with current tooling instead of hand-editing
Example fix
// before
{ "schemaVersion": "ruflo.flywheel-anchor/v1", "path": ".claude/eval/tasks.json", "sha256": "sha256:…" }
// after
{ "schemaVersion": "ruflo.flywheel-anchor-manifest/v1", "path": ".claude/eval/tasks.json", "sha256": "sha256:…" } Defensive patterns
Strategy: validation
Validate before calling
import { readFileSync } from 'node:fs';
const MANIFEST_SCHEMA = 'ruflo.flywheel-anchor-manifest/v1';
function manifestSchemaOk(file: string): boolean {
const manifest = JSON.parse(readFileSync(file, 'utf8'));
return manifest.schemaVersion === MANIFEST_SCHEMA;
} Type guard
const MANIFEST_SCHEMA = 'ruflo.flywheel-anchor-manifest/v1';
interface AnchorManifest { schemaVersion: string; path: string; sha256: string; }
function isV1AnchorManifest(v: unknown): v is AnchorManifest {
return typeof v === 'object' && v !== null && (v as Record<string, unknown>).schemaVersion === MANIFEST_SCHEMA;
} Try / catch
try {
return loadEffectiveFlywheelAnchor(root, opts);
} catch (e) {
if (e instanceof Error && e.message.startsWith('unsupported flywheel anchor manifest schema')) {
throw new Error(`Manifest schemaVersion must be 'ruflo.flywheel-anchor-manifest/v1' (got ${e.message}). Note: the tasks file uses a DIFFERENT schema string.`);
}
throw e;
} Prevention
- Use 'ruflo.flywheel-anchor-manifest/v1' for the manifest and 'ruflo.flywheel-anchor/v1' for tasks — never swap them
- Prefer regenerating manifests with current tooling over hand-editing
- Lint schemaVersion in CI when anchor files change
When it happens
Trigger: A manifest carrying a typo'd or future version string, or the *tasks* schema string (`ruflo.flywheel-anchor/v1`) pasted into the manifest file — the two files use different schema identifiers.
Common situations: Hand-writing the manifest for the first time; version upgrades introducing a v2 schema; copy-paste between the tasks file and the manifest.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- flywheel anchor manifest requires path and sha256
- anchor task has no query
- anchor task requires non-empty string labels
- duplicate anchor task id
- invalid anchor task id at index
AI-assisted analysis of ruvnet/ruflo@2602b642d9 (2026-08-18).
Data as JSON: /api/errors/0619f3e74d31408a.
Report an issue: GitHub.
Appendix: source
Thrown at v3/@claude-flow/cli/src/services/harness-project-anchor.ts:170
options: LoadFlywheelAnchorOptions = {},
): FlywheelAnchorSelection {
const root = resolve(projectRoot);
if (!!options.anchorPath !== !!options.anchorHash) {
throw new Error('anchorPath and anchorHash must be supplied together');
}
if (options.anchorPath && options.anchorHash) {
return toSelection(containedPath(root, options.anchorPath), options.anchorHash);
}
const manifestCandidate = options.manifestPath ?? DEFAULT_PROJECT_ANCHOR_MANIFEST;
const manifestPath = isAbsolute(manifestCandidate)
? manifestCandidate
: resolve(root, manifestCandidate);
if (existsSync(manifestPath)) {
const containedManifest = containedPath(root, manifestPath);
const manifest = JSON.parse(readFileSync(containedManifest, 'utf8')) as ProjectAnchorManifest;
if (manifest.schemaVersion !== PROJECT_ANCHOR_MANIFEST_SCHEMA) {
throw new Error(`unsupported flywheel anchor manifest schema: ${manifest.schemaVersion}`);
}
if (typeof manifest.path !== 'string' || typeof manifest.sha256 !== 'string') {
throw new Error('flywheel anchor manifest requires path and sha256');
}
// Manifest-relative paths are easier to relocate while remaining
// repository-contained; project-relative paths remain supported.
const manifestRelative = resolve(dirname(containedManifest), manifest.path);
const requested = existsSync(manifestRelative) ? manifestRelative : resolve(root, manifest.path);
return toSelection(containedPath(root, requested), manifest.sha256);
}
if (isRufloRepository(root) || process.env.RUFLO_FLYWHEEL_ALLOW_BUILTIN_ANCHOR === '1') {
const frozen = loadFrozenHumanEval();
return {
version: frozen.version,
anchorRef: FROZEN_HUMAN_EVAL_HASH,
source: 'ruflo-built-in',
tasks: frozen.tasks.map((task) => ({View on GitHub (pinned to 2602b642d9)