diff --git a/src/prompts/scheduler-flow.md b/src/prompts/scheduler-flow.md index 52c5284..83e67c2 100644 --- a/src/prompts/scheduler-flow.md +++ b/src/prompts/scheduler-flow.md @@ -32,10 +32,16 @@ Every agent prompt invoked by the schedulers (daily/weekly) MUST enforce this co - Record active unresolved reproducible items in `KNOWN_ISSUES.md` 4. **Execute memory retrieval before implementation begins**: - Run configured memory retrieval workflow before prompt execution (for example via `scheduler.memoryPolicyByCadence..retrieveCommand`) - - For current scheduler enforcement, retrieval command MUST emit `MEMORY_RETRIEVED` and/or create the configured artifact (`.scheduler-memory/retrieve-daily.ok` or `.scheduler-memory/retrieve-weekly.ok`) + - Retrieval command MUST call real memory services (`src/services/memory/index.js#getRelevantMemories` with `ingestEvents` seeding) and MUST emit deterministic marker `MEMORY_RETRIEVED`. + - Retrieval command MUST write cadence-scoped evidence artifacts: + - `.scheduler-memory/retrieve-.ok` + - `.scheduler-memory/retrieve-.json` containing operation inputs/outputs (`agentId`, `query`, seeded event count, ingested count, retrieved count). 5. **Store memory after implementation and before completion publish**: - Run configured memory storage workflow after prompt execution (for example via `scheduler.memoryPolicyByCadence..storeCommand`) - - For current scheduler enforcement, storage command MUST emit `MEMORY_STORED` and/or create the configured artifact (`.scheduler-memory/store-daily.ok` or `.scheduler-memory/store-weekly.ok`) + - Storage command MUST call real memory services (`src/services/memory/index.js#ingestEvents`, which uses ingestor/summarizer pipeline) and MUST emit deterministic marker `MEMORY_STORED`. + - Storage command MUST write cadence-scoped evidence artifacts: + - `.scheduler-memory/store-.ok` + - `.scheduler-memory/store-.json` containing operation inputs/outputs (`agentId`, input event count, stored count, generated summaries). 6. **Publish lock completion only after validation passes and before writing success logs**: - Run `npm run lock:complete -- --agent --cadence ` (or equivalent `complete`) successfully - If any validation command exits non-zero, do **not** call `lock:complete`; write `_failed.md` with the validation failure reason and stop @@ -139,12 +145,20 @@ Every agent prompt invoked by the schedulers (daily/weekly) MUST enforce this co - Memory retrieval evidence must exist for this run (output marker and/or artifact file). - Memory storage evidence must exist for this run (output marker and/or artifact file). - - Enforced daily commands in `torch-config.json` currently run: - - `echo MEMORY_RETRIEVED && mkdir -p .scheduler-memory && : > .scheduler-memory/retrieve-daily.ok` - - `echo MEMORY_STORED && mkdir -p .scheduler-memory && : > .scheduler-memory/store-daily.ok` - - Enforced weekly commands in `torch-config.json` currently run: - - `echo MEMORY_RETRIEVED && mkdir -p .scheduler-memory && : > .scheduler-memory/retrieve-weekly.ok` - - `echo MEMORY_STORED && mkdir -p .scheduler-memory && : > .scheduler-memory/store-weekly.ok` + - Enforced daily/weekly commands in `torch-config.json` run `node --input-type=module` snippets that call `src/services/memory/index.js` APIs directly: + - Retrieval path: `ingestEvents(...)` seed + `getRelevantMemories(...)` retrieval. + - Storage path: `ingestEvents(...)` (ingestor + summarizer path). + - Input contract for retrieval evidence JSON: + - Required keys: `cadence`, `operation: "retrieve"`, `servicePath`, `inputs`, `outputs`, `status: "ok"`. + - `inputs` must include `agentId`, `query`, and seeded `events` count. + - `outputs` must include `ingestedCount` and `retrievedCount`. + - Input contract for storage evidence JSON: + - Required keys: `cadence`, `operation: "store"`, `servicePath`, `inputs`, `outputs`, `status: "ok"`. + - `inputs` must include `agentId` and input `events` count. + - `outputs` must include `storedCount` and generated `summaries`. + - Failure semantics for required mode: + - If retrieval/store command exits non-zero, scheduler writes `_failed.md` and stops. + - If command succeeds but markers/artifacts are missing, scheduler treats this as missing memory evidence. - Prompt authors MUST keep any command changes aligned with configured markers/artifacts so scheduler evidence checks remain satisfiable. - If `scheduler.memoryPolicyByCadence..mode = required`, missing evidence is a hard failure. - If mode is `optional`, log warning context and continue. diff --git a/torch-config.json b/torch-config.json index c491b72..58dcd0b 100644 --- a/torch-config.json +++ b/torch-config.json @@ -25,8 +25,8 @@ "memoryPolicyByCadence": { "daily": { "mode": "required", - "retrieveCommand": "echo MEMORY_RETRIEVED && mkdir -p .scheduler-memory && : > .scheduler-memory/retrieve-daily.ok", - "storeCommand": "echo MEMORY_STORED && mkdir -p .scheduler-memory && : > .scheduler-memory/store-daily.ok", + "retrieveCommand": "set -euo pipefail; mkdir -p .scheduler-memory; node --input-type=module -e \"import { ingestEvents, getRelevantMemories } from './src/services/memory/index.js'; import { writeFileSync } from 'node:fs'; const cadence='daily'; const agentId='scheduler-memory-daily'; const query='scheduler daily memory retrieval'; const timestamp=1700000000000; const events=[{ agent_id: agentId, content: 'Memory retrieval seed for ' + cadence, timestamp, tags:['scheduler', cadence], metadata:{ session_id:'scheduler-' + cadence, source:'scheduler-retrieve', importance:0.4 } }]; const ingested=await ingestEvents(events,{ agent_id: agentId }); const retrieved=await getRelevantMemories({ agent_id: agentId, query, k: 5 }); const artifact={ cadence, operation:'retrieve', servicePath:'src/services/memory/index.js#getRelevantMemories', inputs:{ agentId, query, events:events.length }, outputs:{ ingestedCount:ingested.length, retrievedCount:retrieved.length }, status:'ok' }; writeFileSync('.scheduler-memory/retrieve-daily.json', JSON.stringify(artifact, null, 2)); writeFileSync('.scheduler-memory/retrieve-daily.ok', 'MEMORY_RETRIEVED\\n');\"; echo MEMORY_RETRIEVED", + "storeCommand": "set -euo pipefail; mkdir -p .scheduler-memory; node --input-type=module -e \"import { ingestEvents } from './src/services/memory/index.js'; import { writeFileSync } from 'node:fs'; const cadence='daily'; const agentId='scheduler-memory-daily'; const baseTs=1700000100000; const events=[{ agent_id: agentId, content: 'Store memory event A for ' + cadence, timestamp: baseTs, tags:['scheduler', cadence, 'store'], metadata:{ session_id:'scheduler-' + cadence + '-store', source:'scheduler-store', importance:0.55 } },{ agent_id: agentId, content: 'Store memory event B for ' + cadence, timestamp: baseTs + 1, tags:['scheduler', cadence, 'store'], metadata:{ session_id:'scheduler-' + cadence + '-store', source:'scheduler-store', importance:0.55 } }]; const stored=await ingestEvents(events,{ agent_id: agentId }); const artifact={ cadence, operation:'store', servicePath:'src/services/memory/index.js#ingestEvents', inputs:{ agentId, events:events.length }, outputs:{ storedCount:stored.length, summaries:stored.map((m)=>m.summary) }, status:'ok' }; writeFileSync('.scheduler-memory/store-daily.json', JSON.stringify(artifact, null, 2)); writeFileSync('.scheduler-memory/store-daily.ok', 'MEMORY_STORED\\n');\"; echo MEMORY_STORED", "retrieveSuccessMarkers": [ "MEMORY_RETRIEVED" ], @@ -34,16 +34,18 @@ "MEMORY_STORED" ], "retrieveArtifacts": [ - ".scheduler-memory/retrieve-daily.ok" + ".scheduler-memory/retrieve-daily.ok", + ".scheduler-memory/retrieve-daily.json" ], "storeArtifacts": [ - ".scheduler-memory/store-daily.ok" + ".scheduler-memory/store-daily.ok", + ".scheduler-memory/store-daily.json" ] }, "weekly": { "mode": "required", - "retrieveCommand": "echo MEMORY_RETRIEVED && mkdir -p .scheduler-memory && : > .scheduler-memory/retrieve-weekly.ok", - "storeCommand": "echo MEMORY_STORED && mkdir -p .scheduler-memory && : > .scheduler-memory/store-weekly.ok", + "retrieveCommand": "set -euo pipefail; mkdir -p .scheduler-memory; node --input-type=module -e \"import { ingestEvents, getRelevantMemories } from './src/services/memory/index.js'; import { writeFileSync } from 'node:fs'; const cadence='weekly'; const agentId='scheduler-memory-weekly'; const query='scheduler weekly memory retrieval'; const timestamp=1700000000000; const events=[{ agent_id: agentId, content: 'Memory retrieval seed for ' + cadence, timestamp, tags:['scheduler', cadence], metadata:{ session_id:'scheduler-' + cadence, source:'scheduler-retrieve', importance:0.4 } }]; const ingested=await ingestEvents(events,{ agent_id: agentId }); const retrieved=await getRelevantMemories({ agent_id: agentId, query, k: 5 }); const artifact={ cadence, operation:'retrieve', servicePath:'src/services/memory/index.js#getRelevantMemories', inputs:{ agentId, query, events:events.length }, outputs:{ ingestedCount:ingested.length, retrievedCount:retrieved.length }, status:'ok' }; writeFileSync('.scheduler-memory/retrieve-weekly.json', JSON.stringify(artifact, null, 2)); writeFileSync('.scheduler-memory/retrieve-weekly.ok', 'MEMORY_RETRIEVED\\n');\"; echo MEMORY_RETRIEVED", + "storeCommand": "set -euo pipefail; mkdir -p .scheduler-memory; node --input-type=module -e \"import { ingestEvents } from './src/services/memory/index.js'; import { writeFileSync } from 'node:fs'; const cadence='weekly'; const agentId='scheduler-memory-weekly'; const baseTs=1700000100000; const events=[{ agent_id: agentId, content: 'Store memory event A for ' + cadence, timestamp: baseTs, tags:['scheduler', cadence, 'store'], metadata:{ session_id:'scheduler-' + cadence + '-store', source:'scheduler-store', importance:0.55 } },{ agent_id: agentId, content: 'Store memory event B for ' + cadence, timestamp: baseTs + 1, tags:['scheduler', cadence, 'store'], metadata:{ session_id:'scheduler-' + cadence + '-store', source:'scheduler-store', importance:0.55 } }]; const stored=await ingestEvents(events,{ agent_id: agentId }); const artifact={ cadence, operation:'store', servicePath:'src/services/memory/index.js#ingestEvents', inputs:{ agentId, events:events.length }, outputs:{ storedCount:stored.length, summaries:stored.map((m)=>m.summary) }, status:'ok' }; writeFileSync('.scheduler-memory/store-weekly.json', JSON.stringify(artifact, null, 2)); writeFileSync('.scheduler-memory/store-weekly.ok', 'MEMORY_STORED\\n');\"; echo MEMORY_STORED", "retrieveSuccessMarkers": [ "MEMORY_RETRIEVED" ], @@ -51,10 +53,12 @@ "MEMORY_STORED" ], "retrieveArtifacts": [ - ".scheduler-memory/retrieve-weekly.ok" + ".scheduler-memory/retrieve-weekly.ok", + ".scheduler-memory/retrieve-weekly.json" ], "storeArtifacts": [ - ".scheduler-memory/store-weekly.ok" + ".scheduler-memory/store-weekly.ok", + ".scheduler-memory/store-weekly.json" ] } }