[object Object]

← back to AbramsOS

savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)

0256450b278da24e5dd91ce18448690f52aa94a5 · 2026-07-13 00:23:59 -0700 · Steve

- scripts/run-savings-advisor.js: dotenv-loaded, dedup-safe regen (local, $0)
- deploy/com.steve.abramsos-savings.plist: daily 6:05am, RunAtLoad off; bootstrap surfaced in header comment

Files touched

Diff

commit 0256450b278da24e5dd91ce18448690f52aa94a5
Author: Steve <steve@designerwallcoverings.com>
Date:   Mon Jul 13 00:23:59 2026 -0700

    savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)
    
    - scripts/run-savings-advisor.js: dotenv-loaded, dedup-safe regen (local, $0)
    - deploy/com.steve.abramsos-savings.plist: daily 6:05am, RunAtLoad off; bootstrap surfaced in header comment
---
 deploy/com.steve.abramsos-savings.plist | 36 +++++++++++++++++++++++++++++++++
 scripts/run-savings-advisor.js          | 27 +++++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/deploy/com.steve.abramsos-savings.plist b/deploy/com.steve.abramsos-savings.plist
new file mode 100644
index 0000000..49e03d0
--- /dev/null
+++ b/deploy/com.steve.abramsos-savings.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!--
+  AbramsOS nightly savings-advisor. Regenerates grounded money-saving suggestions
+  from reorder_item data (local Ollama, $0). Runs daily at 6:05 AM.
+
+  Install (Steve pastes — launchd bootstrap is classifier-gated):
+    launchctl bootstrap gui/$(id -u) ~/Projects/AbramsOS/deploy/com.steve.abramsos-savings.plist
+    launchctl kickstart -k gui/$(id -u)/com.steve.abramsos-savings   # run once now
+  Remove:
+    launchctl bootout gui/$(id -u)/com.steve.abramsos-savings
+-->
+<plist version="1.0">
+<dict>
+  <key>Label</key>
+  <string>com.steve.abramsos-savings</string>
+  <key>ProgramArguments</key>
+  <array>
+    <string>/opt/homebrew/bin/node</string>
+    <string>/Users/macstudio3/Projects/AbramsOS/scripts/run-savings-advisor.js</string>
+  </array>
+  <key>WorkingDirectory</key>
+  <string>/Users/macstudio3/Projects/AbramsOS</string>
+  <key>StartCalendarInterval</key>
+  <dict>
+    <key>Hour</key><integer>6</integer>
+    <key>Minute</key><integer>5</integer>
+  </dict>
+  <key>StandardOutPath</key>
+  <string>/Users/macstudio3/Projects/AbramsOS/logs/savings-advisor.log</string>
+  <key>StandardErrorPath</key>
+  <string>/Users/macstudio3/Projects/AbramsOS/logs/savings-advisor.log</string>
+  <key>RunAtLoad</key>
+  <false/>
+</dict>
+</plist>
diff --git a/scripts/run-savings-advisor.js b/scripts/run-savings-advisor.js
new file mode 100644
index 0000000..9ab544c
--- /dev/null
+++ b/scripts/run-savings-advisor.js
@@ -0,0 +1,27 @@
+#!/usr/bin/env node
+// Nightly savings-advisor run. Reads .env, regenerates grounded savings suggestions
+// for every active reorder item (local Ollama, $0). Safe to run repeatedly — the
+// advisor dedupes by item+strategy, so it only adds genuinely new ideas.
+//
+// Wire it up (Steve pastes — launchd bootstrap is classifier-gated):
+//   launchctl bootstrap gui/$(id -u) ~/Projects/AbramsOS/deploy/com.steve.abramsos-savings.plist
+// Manual run:
+//   node ~/Projects/AbramsOS/scripts/run-savings-advisor.js
+
+require('dotenv').config({ path: require('path').join(__dirname, '..', '.env') });
+const advisor = require('../lib/savings-advisor');
+
+const USER_ID = process.env.SAVINGS_USER_ID || 'user_steve';
+
+(async () => {
+  const started = new Date().toISOString();
+  try {
+    const out = await advisor.generateSuggestions(USER_ID, { limit: 100, timeoutMs: 90_000 });
+    console.log(`[savings-advisor ${started}] scanned=${out.scanned} created=${out.created} skipped=${out.skipped} errors=${out.errors.length}`);
+    if (out.errors.length) console.log('  errors:', out.errors.map((e) => `${e.item}: ${e.error}`).join('; '));
+    process.exit(0);
+  } catch (err) {
+    console.error(`[savings-advisor ${started}] FAILED: ${err.message}`);
+    process.exit(1);
+  }
+})();

← 3e9efe5 docs: life-optimizer roadmap (overnight)  ·  back to AbramsOS  ·  health: Vitals module — BP history + Apple Watch/device read 2d8848c →