ruvnet/ruflo · error · PodTemplateValidationError
pod-template at ${path}: bench.scheduleHours must be ≥1
Error message
pod-template at ${path}: bench.scheduleHours must be ≥1 What it means
Thrown inside validatePodBench() after requireNumber() confirms scheduleHours is a finite number. Fires when that number is less than 1 (zero, negative, or a fraction like 0.5). scheduleHours defines the cadence between bench evaluations; a sub-hour cadence is rejected as unreasonable.
Source
Thrown at v3/@claude-flow/cli/src/business-pods/pod-schema.ts:151
};
}
function validatePodBench(item: unknown, path: string): PodBench {
if (!isObject(item)) throw new PodTemplateValidationError('bench must be an object', path);
const name = requireString(item, 'name', path);
const description = requireString(item, 'description', path);
const successCriteria = requireArray(item, 'successCriteria', path, (s, sp) => {
if (typeof s !== 'string' || s.length === 0) {
throw new PodTemplateValidationError('successCriteria entries must be non-empty strings', sp);
}
return s;
});
if (successCriteria.length === 0) {
throw new PodTemplateValidationError('bench.successCriteria must have ≥1 entry', path);
}
const scheduleHours = requireNumber(item, 'scheduleHours', path);
if (scheduleHours < 1) {
throw new PodTemplateValidationError('bench.scheduleHours must be ≥1', path);
}
return { name, description, successCriteria, scheduleHours };
}
function validateAuditReadView(item: unknown, path: string): PodAuditReadView {
if (!isObject(item)) {
throw new PodTemplateValidationError('auditReadView must be an object', path);
}
const includedEventTypes = requireArray(item, 'includedEventTypes', path, (s, sp) => {
if (typeof s !== 'string' || s.length === 0) {
throw new PodTemplateValidationError('includedEventTypes entries must be non-empty strings', sp);
}
return s;
});
const retentionDays = requireNumber(item, 'retentionDays', path);
if (retentionDays < 1) {
throw new PodTemplateValidationError('auditReadView.retentionDays must be ≥1', path);
}View on GitHub (pinned to 6b01dc5a68)
Solutions
- Set bench.scheduleHours to an integer >= 1 (e.g., 24 for daily, 168 for weekly)
- If you need sub-hour cadence, that is not supported by the bench scheduler — reconsider the requirement
Example fix
// before: "scheduleHours": 0 // throws // after: "scheduleHours": 24 // daily
Defensive patterns
Strategy: validation
Validate before calling
import { validatePodTemplate, PodTemplateValidationError } from '@claude-flow/cli/business-pods/pod-schema';
try {
const pod = validatePodTemplate(parsedJson);
} catch (e) {
if (e instanceof PodTemplateValidationError) {
console.error(`scheduleHours error at ${e.path}: ${e.message}`);
}
} Try / catch
import { validatePodTemplate, PodTemplateValidationError } from '@claude-flow/cli/business-pods/pod-schema';
try {
const pod = validatePodTemplate(raw);
} catch (e) {
if (e instanceof PodTemplateValidationError) {
console.error(e.message);
process.exit(1);
}
throw e;
} Prevention
- Set bench.scheduleHours to an integer >= 1 (24 for daily, 168 for weekly)
- Do not confuse hours with minutes — the field is hours, not minutes
- Validate templates with validatePodTemplate() before deployment
When it happens
Trigger: validatePodBench() reads bench.scheduleHours, requireNumber() passes (it is a finite number), but the value is < 1.
Common situations: scheduleHours set to 0 (disabled sentinel); a fractional value meant to mean minutes; a negative value from a misconfigured default; a template that confused hours with minutes.
Related errors
- pod-template at ${path}: field "${key}" must be a finite num
- pod-template at ${path}: bench must be an object
- pod-template at ${path}: successCriteria entries must be non
- pod-template at ${path}: bench.successCriteria must have ≥1
- pod-template at ${path}: auditReadView.retentionDays must be
AI-assisted analysis of ruvnet/ruflo@6b01dc5a68 (2026-08-12).
Data as JSON: /api/errors/ea3c8739f2ec4950.
Report an issue: GitHub.