Parent Epic
#12065 — Sub 5 of 9. Depends on Sub 3 (orchestrator method substrate).
Premise
Per Discussion #12062 §2.9 (operator-direct workflow): operator reads sandman_handoff.md → sees top-5 weighted items → does 5 PRs → wants cheap refresh of the strategic brief without paying the full REM cycle cost. Full REM = MINUTES × N gemma calls; refresh = ~10s-1min (graph-walk + 1 interpretive LLM call). 10-60× cost asymmetry.
Currently the orchestrator's 'golden-path' cadence task bundles with the dream task via dependencies: ['dream'] — it only fires WITHIN the cadence cycle. There's no operator-invocable refresh-only path.
Prescription
New method on Orchestrator.mjs:
async refreshGoldenPath({reason}) {
return withHeavyMaintenanceLease(async () => {
const remRun = this.openRemRun({runId: crypto.randomUUID(), reason, mode: 'refresh'});
try {
await GoldenPathSynthesizer.synthesizeGoldenPath({
repoEnrichmentEnabled: this.goldenPathRepoEnrichmentEnabled
});
this.closeRemRun(remRun, 'completed');
} catch (e) {
this.closeRemRun(remRun, 'failed', {error: e});
throw e;
}
}, {owner: 'orchestrator-golden-path-refresh', reason});
}
Add npm script ai:refresh-golden-path invoking runSandman.mjs refresh (Sub 4's mode-selector).
Acceptance Criteria
Avoided Traps
- ❌ Trigger any gemma extraction in refresh path — defeats the 10-60× cost asymmetry
- ❌ Skip lease semantics — risks concurrent graph mutation during heavy work
- ❌ Hide behind
executeRemCycle({mode: 'refresh-only'}) — separate method is clearer + matches Discussion §2.9 design
Related
- Epic #12065
- Discussion #12062 §2.9 (cheap-refresh UX argument; split-and-recompose principle) + OQ2 [RESOLVED_TO_AC]
- Sub 3 (executeRemCycle peer method on same orchestrator)
Parent Epic
#12065 — Sub 5 of 9. Depends on Sub 3 (orchestrator method substrate).
Premise
Per Discussion #12062 §2.9 (operator-direct workflow): operator reads
sandman_handoff.md→ sees top-5 weighted items → does 5 PRs → wants cheap refresh of the strategic brief without paying the full REM cycle cost. Full REM = MINUTES × N gemma calls; refresh = ~10s-1min (graph-walk + 1 interpretive LLM call). 10-60× cost asymmetry.Currently the orchestrator's
'golden-path'cadence task bundles with the dream task viadependencies: ['dream']— it only fires WITHIN the cadence cycle. There's no operator-invocable refresh-only path.Prescription
New method on
Orchestrator.mjs:async refreshGoldenPath({reason}) { // No gemma extraction; just Hybrid GraphRAG over current graph state + 1 interpretive call return withHeavyMaintenanceLease(async () => { const remRun = this.openRemRun({runId: crypto.randomUUID(), reason, mode: 'refresh'}); try { await GoldenPathSynthesizer.synthesizeGoldenPath({ repoEnrichmentEnabled: this.goldenPathRepoEnrichmentEnabled }); this.closeRemRun(remRun, 'completed'); } catch (e) { this.closeRemRun(remRun, 'failed', {error: e}); throw e; } }, {owner: 'orchestrator-golden-path-refresh', reason}); }Add npm script
ai:refresh-golden-pathinvokingrunSandman.mjs refresh(Sub 4's mode-selector).Acceptance Criteria
Orchestrator.refreshGoldenPath()method shippedmode: 'refresh'distinguishes from full cycle)ai:refresh-golden-pathlands (preferred operator UX; not justai:run-sandman refresh)learn/agentos/describing the cheap-refresh UX + when to use it (post-PR-merge refresh use case)Avoided Traps
executeRemCycle({mode: 'refresh-only'})— separate method is clearer + matches Discussion §2.9 designRelated