effectiveStaleness = actualStaleness × (normalizedDepth + 1) ^ (depthWeight × emphasis)
_generatedAt (capped at MAX_STALENESS_SECONDS = 31 536 000 seconds / 365 days if never synthesized or extremely stale). Bounding prevents Infinity × depthFactor = Infinity for all depths, which would make staleness-based prioritization meaningless._emphasis multiplier (default 1). Higher = updates more oftenThe scheduler uses the phase-state machine to select one phase per tick across the entire corpus, instead of enqueuing full synthesis cycles.
Phases are prioritized by band:
Within each band, candidates are ranked by weighted staleness. The single highest-priority owed phase is selected per tick.
The built-in croner scheduler runs on the configured cron expression (default: every 30 minutes).
Each tick:
autoSeed rules are configured, walk for matching directories via the watcher and seed any that lack a .meta/ directory/walk endpoint_phaseState for legacy metas without itfailed → pending for all failed phases_phaseState, check _synthesisCount >= architectEvery and bump architect to pending if neededtier2ScanLimit, default 50), walk scope for structure hash changes and check steer/crossRefs changes against archive to detect invalidationAny meta with _disabled: true in its meta.json is excluded from automatic scheduling — the scheduler and the auto-select path of POST /synthesize both skip it. Manual triggers (meta_trigger with an explicit path or POST /synthesize with an explicit path) still run disabled metas on demand. Use meta_update (or PATCH /metas/:path) to toggle the flag.
When no stale candidates are found:
tickCount % backoffMultiplierThe synthesis queue has three layers:
Key behaviors:
POST /queue/clear removes only override entriespending and state fields remain for backward compatibility