Skip to content

Schedules — everything that runs on a clock, in clock order

Facebook/Instagram OFF (owner 2026-10-23); website-only since 2026-10-24. Social is opt-in via ~/.config/social-enabled (absent = website-only); the old ~/.config/social-paused flag is no longer read by the content code. SOP-018 v7.0.

One table. If it is not here it does not run. Times are local (America/New_York).

2026-11-04 content recovery: owner approved a cycle-only $10 transfer from sales-copy to content ($50/$10 through November 7; normal $40/$20 allocations return November 8; total cap stays $90). api-credits e7cc8d0 supports dated allocations. Assistant a75394b names budget/reset in preparation reports and uses the installed reviewer CLI. Live review/revision/re-review on Sonnet 5.5 queued the ESP32-S3 note for November 9; reserve five days, outcome reconciler green with reserve warning. See projects/content-pipeline.md.

When What Mechanism Runs as Log / result
:05 hourly + 3 min after boot (was 00:05 daily until 2026-10-27) stairs-season: updated 2026-10-31 for 15 stair zones: bottom GPIO33 starts native Up60, top GPIO2 Down61; first3 entry stairs together, then add remaining stairs at alternating0.1/0.2s (walking feedback2026-10-31), preserve already-lit stairs, then hold chosen gradient180s and Off1. --preview ID gives a two-hour review override; --resume-season restores calendar. All13 seasonal looks visually approved2026-10-31; review override cleared and normal calendar restored (Halloween18 today, Harvest19 Nov1). Approved snapshots in the stair hardware note directory. Raleigh-local seasonal fallbacks: springMar1, summerMay15, fallSep21; holiday dates take priority. Point the stair-light sensors (WLED 192.168.4.47) at today's season/holiday look; holidays computed yearly; no-op when unchanged; never leaves the lights on; also sets HA input_text.house_theme (look name, e.g. pumpkin_glow) for the panels' seasonal UI theme, best effort. Hourly so an HA restart or a missed midnight heals itself; the helper has no initial (it used to reset to early_fall on every HA restart) angel crontab via cron-run angel ~/.local/state/cron-run/stairs-season.log; ntfy on failure; wled-stairs notes in hardware/wled-stairs/README.md
every 2 min panel-photos: photo screensaver pictures for the wall panels — random photo from Immich album "Kitchen panel" (nightstand: "Nightstand", else kitchen), fitted to each screen, written to HA /config/panel_photos/ for the camera.*_panel_photo local_file cameras; no Immich key = no-op angel crontab via cron-run angel ~/.local/state/cron-run/panel-photos.log; key ~/.config/immich/env; repo kitchen-hub HANDOFF 2026-10-26
hourly :52 content-reconcile: website content OUTCOME check (>=4 consecutive queued days else page; no new queued note in 26 h while reserve <7 = stall; today's note live by 09:00; live RSS dates == release dates). Writes ~/.local/state/content-reconcile/status.json; installed as a symlink to ~/assistant/scripts/content-reconcile (no copy drift) angel crontab via cron-run angel ~/.local/state/cron-run/content-reconcile.log; non-zero exit -> job-failure incident + ntfy (2026-10-24)
hourly :17 snapraid-age: parity freshness check; exit 1 when the last snapraid-sync.service run failed or the newest log ending summary:exit:ok is ≥36 h old. No root (unit state + /var/log/snapraid are world-readable). Written 2026-10-26; crontab line is in crontab.txt but not installed yet (classifier blocked crontab) angel crontab via cron-run angel ~/.local/state/cron-run/snapraid-age.log; non-zero exit → job-failure incident (one page + Kanboard fix task, closes when green)
every 5 min sec-watch: intrusion and exposure checks, pages on a finding (SOP-049) angel crontab angel ~/.local/state/cron-run/sec-watch.log; ntfy SECURITY ...
every 5 min booking-warm: GET /api/book/slots (next 14 days) so the website's D1 busy-time cache stays under 5 min old (embeddedera-site PR #9), then POST /api/book/remind (30- and 15-minute call reminder emails, PR #18, added 2026-11-08); non-200 pages. Points at https://embeddedera.com since 2026-10-24 (#9 merged ba206cf; added 2026-10-24) angel crontab via cron-run angel ~/.local/state/cron-run/booking-warm.log; ntfy on failure
every 15 min list-sync: R2 newsletter capture → Listmonk; bounded read retries, verified cleanup, exceptions retained (SOP-033) angel crontab angel ~/.claude/routines/list-sync.log; existing ntfy route on failure
every 1 min (+≤10sec) Repair running development ingress after WordPress address changes ee-store-ingress-refresh.timer (user) angel journalctl --user -u ee-store-ingress-refresh; never starts stopped store containers
On-demand testing only (timer disabled 2026-09-22; 1 min while started) Development store orders → ERP sandbox; refunds/cancellations and shipment return ee-store-order-sync.timer (user, Persistent) angel journalctl --user -u ee-store-order-sync; SOP-037; no production ERP writes
every 5 min Production store (dark) health: 127.0.0.1:8510 200, scheduler healthy, no failed scheduled actions, newest store dump < 26 h ee-store-prod-health.timer (user) angel journalctl --user -u ee-store-prod-health; job-failure hook pages
every 1 min Purge exact changed development-store URLs from Cloudflare edge cache ee-store-cloudflare-purge.timer (user, Persistent) angel journalctl --user -u ee-store-cloudflare-purge; host-only token; versioned queue retries failures after lease expiry; embeddedera-store-sandbox
On-demand testing only (timer disabled 2026-09-22; 5 min while started) Development store battery ERP observation; GET only, private metadata only ee-store-catalog-observe.timer (user, Persistent) angel journalctl --user -u ee-store-catalog-observe; embeddedera-store-sandbox
every 30 min at :15/:45 (+≤45 sec) Bounded authorized AI draft/review jobs; capacity + task-digest checks; no live-source edits ai-work-runner.timer (user, Persistent) angel ~/.local/state/ai-work-runner; status; ../host/claude-tooling
every 5 min Codex allowance refresh, read-only/no inference ai-capacity-refresh.timer (user) angel ~/.local/state/ai-capacity/codex.json; journalctl --user -u ai-capacity-refresh + drop-in runs ai-budget watch (ntfy once per pool per window when ahead of pace)
Mon 14:10 (Persistent) Weekly AI burn report from ccusage → Log of projects/ai-capacity.md ai-budget-weekly.timer (user) angel journalctl --user -u ai-budget-weekly; SOP-025
every 5 min (+≤20 sec) Check the real Postiz scheduler worker; restart only its orchestrator if stalled after startup grace postiz-scheduler-watchdog.timer (user, Persistent) angel ~/.local/state/assistant/postiz-scheduler-watchdog.json; ntfy on recovery or failed repair
every 15 min (+≤30 sec) Read-only Postiz publication observations; no AI calls or retries content-delivery-check.timer (user, Persistent) angel ~/.local/state/assistant/delivery-status.json; shown on Home Content approvals; stale after 45 min
every 15 min at :02/:17/:32/:47 (+≤30 sec) Reconcile published-note records and Eastern daily feed slots for today + seven days; alert on gaps, duplicate risk, overdue/failed delivery or unavailable evidence content-schedule-audit.timer (user, Persistent) angel ~/.local/state/assistant/social-coverage.json; Home daily calendar; ntfy on changes/recovery and every 6 hours while unresolved; SOP-018
18:30 (+≤2 min), plus immediately after note publication Create any missing branded feed/Story artwork, place the exact package in Home for delegated editorial review, and send a clickable reminder; never schedules by itself content-review-prep.timer + publish-note trigger (user, Persistent timer) angel ~/.local/state/assistant/content-review-prep.json; ntfy once per day while pending
every 1 min restart wg-easy if stopped wg-docker-watchdog.timer root journal
every 5 min VPN egress check → Homepage VPN tile (via hub /api/vpn-*) angel crontab vpn-check angel ~/torrentvpn/homer/assets/vpn-status.json
every 1 min qBittorrent kill switch: stops the qbittorrent container when gluetun is down/unhealthy or leaking (2 bad checks); restarts after 3 good ones angel crontab qbit-killswitch watch angel ~/.local/state/qbit-killswitch/log; ntfy on trip and recovery
hourly :00 rsnapshot hourly (24 kept) /etc/cron.d/rsnapshot root rsnapshot's own
01:00 docker-backup.sh → /mnt/storage/docker-backups/snapshots/ (7 kept) root crontab root /var/log/docker-backup.log
01:30 rescue-sync.sh → /mnt/rescue archive + host/ + Kuma heartbeat root crontab root /var/log/rescue-sync.log
02:00 Immich nightly DB dump (14 kept) Immich internal container /mnt/storage/immich/backups/
02:20 precious-sync.sh copy + sampled verify angel crontab angel /var/log/precious-sync.log
02:30 store-backup = erp-backup store — production store DB dump + uploads, age-encrypted → /mnt/storage/EmbeddedEra/backups/store/ (30 d) + R2 store/<stamp>/ (before the 02:50 restic run) angel crontab via cron-run angel ~/.local/state/erp-backup/erp-backup.log, last-store.json; ntfy + job-failure on failure
02:30 / 02:35 Sun / 02:40 1st / 02:45 Jan 1 rsnapshot daily / weekly / monthly / yearly /etc/cron.d/rsnapshot root —
02:47 vault-push — copy every ~/.config/*/env, */*.env, credentials/* file into Vaultwarden as Secure Notes "server · " (org Plex Server, account server@embeddedera.com; skips unchanged by sha256; never deletes; notes keep no history) vault-push.timer (user, Persistent) angel journalctl --user -u vault-push; OnFailure=job-failure@
02:50 history-backup backup — restic snapshot into the parity-protected repo angel crontab angel ~/.local/state/history-backup/history-backup.log
03:00 Tue / Thu smartd long self-test sdc / sdd; short tests nightly 02:00–03:00 including parity /etc/smartd.conf -s smartd smartctl -l selftest; ntfy on failure. Parity long-test removed 09-20: hd-idle stretched it into Sunday scrub and the drive reached 57 °C; weekly scrub supplies parity surface coverage.
03:15 erp-backup backup — encrypted DB dumps (InvenTree/listmonk/immich) + vaultwarden sqlite → local + R2 embeddedera-backups angel crontab angel ~/.local/state/erp-backup/erp-backup.log; ntfy on failure
03:30 daily SnapRAID sync via guard → precheck → snapraid -l … sync snapraid-sync.timer (Persistent) root /var/log/snapraid/sync-YYYYMMDD.log; snapraid-alert@ on failure
03:45 training-sync prealarm (deadline 04:30) angel crontab angel ~/.claude/routines/training-sync.log, last-run-prealarm.json
04:00 Sun SnapRAID scrub -p 12 -o 7 snapraid-scrub.timer (Persistent) root /var/log/snapraid/scrub-YYYYMMDD.log
04:30 update-claude.sh — claude update, restart claude-remote if the version changed, roll back + exit 1 if it won't start claude-update.timer (user) angel (systemd --user) journalctl --user -u claude-update
05:00 craft-setup — upgrade the 13 storytold Craft apps, prune to current+previous craft-update.timer (user, linked from ~/Notes/bin/systemd/) angel (systemd --user) journalctl --user -u craft-update
2026-11-05 09:00 (one shot) therealcow-close-github — turn off GitHub Pages + make the two old Cow tool repos private, ntfy (SOP-047) therealcow-close-github.timer (user, Persistent, units in ~/Notes/bin/systemd/) angel (systemd --user) ntfy + journalctl --user -u therealcow-close-github
04:50 (+≤10 min) part-watch --yes — lifecycle/price findings over active-BOM MPNs ↔ Kanboard tasks (SOP-034); refreshes only records older than 7 days, inside part-lookup's daily budget part-watch.timer (Persistent, user) angel (systemd --user) stdout via journalctl --user -u part-watch
05:00 1st Sun precious-sync.sh --verify-full (sha256 every file) angel crontab angel precious log
04:30, 2nd of the month retention-sweep.timer enforces decisions/retention.md: logs 90 d, transcripts 30 d, intake originals 1 y (receipts 7 y); counts into the next digest
05:30 Sun history-backup weekly — prune, 2 % data check, restore drill, off-box copy angel crontab angel history log; ntfy on drill/prune
05:30 Mon part-refresh --run — distributor data for ERP parts (30 d) and EmbeddedEra symbols (90 d) only, budget-capped angel crontab angel ~/.claude/routines/part-refresh.log
06:10 training-sync morning (deadline 13:00) angel crontab angel routines log
06:15 Sun erp-backup verify — restores newest InvenTree dump into a throwaway postgres, checks row counts, plus (2026-10-26) quick_check on every restored SQLite and >=1 Vaultwarden user + item; then (2026-10-06) the newest store set into a throwaway --network none MariaDB (store-verify) angel crontab angel ~/.local/state/erp-backup/erp-backup.log; ntfy on failure
07:00, 1st day of Jan/Apr/Jul/Oct quarterly-pack — drafts SOP-015 review pack including the fresh-agent cold-read checklist angel crontab angel ~/Notes/meetings/YYYY-QN.md; ~/Notes/audits/YYYY-QN-cold-read.md is completed before the meeting
07:15 (+≤5 min) sop-tasks --yes — failing sop-audit checks ↔ Kanboard tasks (SOP-017), after the 06:50 Monday audit sop-tasks.timer (Persistent, user) angel (systemd --user) stdout via journalctl --user -u sop-tasks
05:30 Sunday kicad-check.timer ERC/DRC across every KiCad project, saved for the audit
23:40 daily tasks-metrics.timer snapshot the task register into the reports DB for Grafana
06:40 + 15:40 daily surfaces-check.timer internal pages: gate holds, page renders, scripts parse, APIs answer; 2026-11-04 task #351: status 0 / 5xx now fail as unavailable, not as unauthenticated exposure (~/.local/bin 5486af8); live service all checks passed 06:22 ET
every 5 min task-verify.timer checks every task in a Review column against its Verify: block; closes it, bounces it with Missing:, or asks a human verifier (SOP-017 v1.1)
07:20 daily kanboard-cron.timer Kanboard's own cronjob: overdue notifications, recurring tasks
hourly :05, 07–21 tasks-notify.timer one batched email per person when something happened on their tasks (assigned, Verified, Missing, check waiting, closed); under the daily mail budget
07:30 daily tasks-digest.timer one email per person: overdue, due today, due this week
09:30 daily tasks-digest-canary.timer pages if the digest did not run at all
09:00 (+≤5 min) rescue-watchdog — archive age/size/device check rescue-watchdog.timer (Persistent) root /var/log/rescue-watchdog.log
21:00 training-sync evening (deadline 23:45) angel crontab angel routines log
one-shot 09-08 23:00 · 09-09 08:00 · 09-11 08:00 maint-badblocks · maint-drill · maint-dedupe (hardening items 17, 15, 16 B) maint-*.timer, dated, not Persistent root ~/maintenance/output/<job>-<date>.md + ntfy — see processes/scheduled-maintenance
continuous hd-idle spins parity down after 1800 s idle hd-idle.service root /var/log/hd-idle.log
continuous smartd 30-min attribute poll → /var/lib/smartmontools/attrlog.*.csv smartmontools.service root those CSVs (world-readable)
Sun 03:10 e2scrub_all — no-op (LVM only, no LVs) e2scrub_all.timer root —

Ordering that matters: docker-backup (01:00) before rescue-sync (01:30); Immich dump (02:00) before precious-sync (02:20) before history-backup (02:50) before the 03:30 sync (so parity covers the new packs); sync (03:30) before scrub (Sun 04:00).

Root's crontab is not readable by angel; the 01:00/01:30 entries are asserted by rescue-sync.sh:5-6 and the log timestamps (01:00, 01:31–01:35 on 09-08).

Connected to

Audit implementation: ~/.local/bin/sop-audit is installed from assistant/scripts/sop-audit (2026-09-18, main c749282). SOP-018 content checks have offline regression fixtures; missing draft/production source directories report skip. No audit schedule changed. Evidence: ../../../audits/2026-09-18-content-audit-checks.

If you change this

  • Hits: the ordering above · rescue-watchdog MAX_AGE_H=30 assumes a nightly build · training-sync deadlines are hard-coded per mode (training-sync:20-22).
  • Does not hit: anything not on this table.

See

  • Source: systemctl list-timers --all · crontab -l · /etc/cron.d/rsnapshot · /etc/smartd.conf

One-time business correspondence — 2026-09-17

Resend holds the 09:00 EDT CPA coordination send to the assigned internal owner. The 09:20 EDT existing-client exemption-document request was canceled and read back as canceled on September 17 at Angel’s instruction; do not resume without his explicit OK. IDs and status are in business-progress-2026-09-17. Scheduling is not delivery confirmation. The proposed local business-mail-20260917.timer is disabled after its Claude Gmail read-access preflight failed; it will not dispatch the four ready Gmail drafts.

  • 2026-09-22: Replaced the daily 06:00 research cron with 7 * * * * /usr/bin/timeout --signal=TERM --kill-after=30s 45m /home/angel/.local/bin/content-buffer-fill. Hourly count is deterministic; model work occurs only when the seven-day feed-content supply is short. Maximum three drafts per run, shared writer lock, capacity checks and editorial approval retained. Source: assistant scripts/content-buffer-fill and content_buffer.py; SOP-018 v6.0.

  • 2026-09-23: Content approval now queues dated website notes; no website-release timer was added. Candidate note_queue.py tick is disabled unless explicitly enabled after complete daily-package integration. Existing research :07 cron now replenishes seven unpublished notes, excluding already-public notes and legacy feeds. Full five-stage daily readiness remains unverified; see ../../../projects/content-pipeline.

  • tester-api ERP retry — every 120 s, a thread inside tester-api.service (not a timer) re-runs pending tester→ERP work (TESTER_ERP_RETRY_SECONDS, 0 disables). In-process so _MIRROR_LOCK serializes it with post-event syncs. Added 2026-09-26.

  • content-daily-release — cron every 5 min 07:00–19:55 (flock), runs the daily package engine; pages once per real problem; off switch ~/.config/content-release.disabled. story-handoff moved 07:15 → 06:50. Added 2026-09-27.

  • opportunity-radar-scan / -digest — cron 06:25 and 18:25 daily (scan 16 public feeds, free-model triage, contact lookup) and Monday 06:40 (notebook page + ntfy top five). ~/assistant/scripts/opportunity-radar.py under the openrouter-delegate Python; state ~/.local/state/opportunity-radar/. cron-watch 14 h / 192 h. Added 2026-09-27.
  • pod-golive / pod-pin-feeds — every 15 min: published designs get Etsy disclosure, section, siblings, go live and are snapshotted; republished designs get who_made + siblings restored (pod.run golive, cron-watch 1 h). 09:45/18:45: Pinterest RSS feeds per board + listing pages on oddlyfittinggoods.com (Cloudflare Pages oddly-pins), which Pinterest auto-publishes; the 10:00 pod-pins CSV is off while ~/.config/pod-pins-rss.connected exists. cron-watch 14 h. Added 2026-09-28.
  • content-approve-missing — every 3 h at :17: published EmbeddedEra notes without feed posts get their stale packages rebuilt (https Facebook CTA, approved art style), re-reviewed and scheduled in Postiz (--apply --limit 2; stop file ~/.config/content-approve.disabled). cron-watch 7 h. Added 2026-09-28.
  • ops-commit — 02:20: exports the crontab to ~/.local/bin/crontab.txt and commits + pushes our scripts in ~/.local/bin to GitHub EmbeddedEra/ops-scripts (private; third-party binaries are .gitignored; the old local history with binaries is on local branch pre-ops-history, never pushed). cron-watch 26 h. Added 2026-09-28.
  • offsite-backup / offsite-drill — 05:15 daily: restic repo embeddedera-backups/offsite-restic in Cloudflare R2 (free tier), the data that cannot be recreated (home state and ledgers, ~/.config, scripts, Notes, EmbeddedEra business/finance/Projects/Labels/test-data/content/CAD); S3 keys derived from the Cloudflare token; guard sums every bucket: alert 7 GB, stop 9 GB; keep 7d/4w/6m, prune Sundays. Drill 05:45 on the 1st. Password ~/.config/restic/offsite-password (must also be in escrow). cron-watch 26 h / 800 h. Added 2026-09-28.
  • cf-zone-baseline — Mon 04:00: same safe settings on every Cloudflare zone (Always HTTPS, HTTPS rewrites, TLS >= 1.2, TLS 1.3, Early Hints, Brotli; no HSTS). cron-watch 192 h. Added 2026-09-28.
  • fixer — every 5 min, both companies: failed/late cron-run heartbeats become incidents in the EE crew ledger → safe runbook (fixer/runbook.yml: reset an allowlisted stale unit, retry only retry_safe jobs) → tool-free claude -p diagnosis (Sonnet, Fable when Sonnet fails — owner decision 2026-09-30: Sonnet is the default) → Codex code fix only for ~/assistant and ~/story-publisher, merged only if the full suite exits 0 and an independent review approves (max 6/day) → fresh ok heartbeat, or owner inbox after 2 attempts. Never root/fstab/snapraid/precious/ERP data/Etsy art/secrets/crontab, never its own code. Kill switch ~/.config/fixer.disabled. cron-watch 1 h. Added 2026-09-28.
  • pod-scout — 06/09/12/15/18/21: same-day trend watch (Google Trends RSS + near occasions → one classifier call → Etsy aggregate demand → trend_jump → pop-up → max 2 designs/day). cron-watch 10 h (overnight gap). Added 2026-09-28.
  • pod-coach / pod-scoreboard — daily 07:45 Coach (repeat-problem sweep, fix proposals, confirms fixes after 7 quiet days), 07:50 scoreboard (per-role numbers, Boss role-split proposals). cron-watch 26/26 h. Added 2026-09-28.
  • pod-research / pod-audit / pod-merch — Sun 20:00 evergreen Etsy demand research (numbers only, ≤300 calls); Sat 07:30 Quality audit of live listings (read-only); daily 08:30 Merch title rewrites for GM-flagged unseen listings (5/day). cron-watch 192/192/26 h. Added 2026-09-27.
  • pod-gm / pod-analyst — Oddly Fitting Goods company roles: Mon 07:15 GM weekly meeting (after the 07:00 analyst run, since 2026-09-29) (claude -p Sonnet, Fable when Sonnet fails, tool-free — owner decision 2026-09-30: Sonnet is the default; minutes in the notebook, ntfy summary, owner inbox), daily 07:00 Analyst (own listing stats + sales, no buyer data). cron-watch 192/26 h. Added 2026-09-27.
  • pod-calendar / pod-week / pod-publish / pod-pins / pod-orders — Oddly Fitting Goods Etsy shop (SOP-042): Mon 05:20 occasion page, daily 05:30 designs (pod.run day: weekly cap spread over the week, week is an alias) → unpublished Printify products, daily 09:00 publish (gated on ~/.config/pod-shop.live) + Etsy attribution/sections, daily 10:00 Pinterest CSV of new listings to ntfy (until the Pinterest API is approved), 08:00/18:00 order pings. env -C ~/assistant venv python -m pod.run …, log ~/.local/state/pod/cron.log; off switch ~/.config/pod-shop.disabled. cron-watch 192/26/26/14 h (pod-day daily since 2026-09-28). Added 2026-09-27. Frozen 2026-11-01: POD_WEEKLY_CAP=0 on the pod-day line and in the pod-dispatch drop-in freeze.conf (owner; remove both to unfreeze).
  • story-preflight — daily 07:30: ~/story-publisher/story_preflight.py (wrapper ~/.local/bin/story-preflight), catches a Facebook/Instagram app auto-update before the version-pin guard silently blocks a Story (as happened 2026-09-28→30, unnoticed for two days). Skips entirely if a Story job is due within the hour (story-publish-due owns the emulator then); otherwise boots the bounded emulator, rehearses a draft on each platform, and updates the version pin (runtime/version-pins.json, read by rehearse_meta.PROFILES), leaves it alone, or writes ~/.config/story-publish-<platform>.disabled + ntfy alert (the other platform keeps running) — failing cron-run heartbeat opens a Fixer incident. Play Store auto-update disabled on the AVD (pm disable-user com.android.vending); known-good APKs backed up to ~/.local/share/story-publisher/apks/<package>/<version>/ (apk_backup.py restore to roll back). cron-watch 26 h. Added 2026-09-30.

  • x-post-prompt — daily 12:30, cron-run; ntfy one-tap X share-intent prompt for the owner to post manually (X API is paid). See content-pipeline.

  • job-failure-sweep / job-failure-report — every 10 min: job-failure sweep (picks up failures nobody hooked, escalates deferred ones, closes incidents that went green); Mon 07:20: weekly failure report via app notify + ntfy. Both via cron-run, cron-watch 1 h / 192 h. Also cron-run calls the hook on every failure and user units get OnFailure=job-failure@%n.service. Detection, unchanged re-run, alert, ticket, log only (no AI). ../../processes/job-failure-handling, SOP-043. Added 2026-10-06.

  • market-brief (2026-10-15) — cloud routine "Market brief" (trig_01TueZEVC69Voq5PWuPHBsuA, Anthropic cloud, Mon+Thu 10:30 UTC, Sonnet, web search/fetch + git only, no connectors, Default environment set to Full network 2026-10-15; commits briefs/<date>.md to private repo EmbeddedEra/market-briefs branch claude/briefs (Claude GitHub App covers all org repos; Reddit and Stack Exchange block the cloud, the server-side opportunity radar covers those); prompt home ~/Notes/projects/market-brief/routine-prompt.md, paste changes into the routine) researches note ideas, threads to answer, leads and news across nine service groups. market-brief-pull (angel crontab Mon+Thu 07:30 via cron-run) fetches ~/market-briefs and copies the day's file into ~/Notes/projects/market-brief/<date>.md (no model; the routines API truncates long messages so it is not used), syncs the vault, ntfys the notebook link; weekly-research feeds the newest brief's Note ideas (≤10 days) to the topic picker. The other cloud routine is the 07:00 Gmail "Daily inbox cleanup"; both are listed at claude.ai/code/routines, not on this server.
  • market-brief-meeting (2026-10-15) — Mon+Thu 08:00 market-brief-meeting start (cron-run) opens a Remote Control background session "Brief meeting " in ~/claude-remote running ~/Notes/projects/market-brief/meeting-prompt.md: owner picks via AskUserQuestion (approve waiting notes at Home, next note topics → top of ~/.claude/routines/note-backlog.md, forum threads to answer, leads → Gmail drafts only, builds → site note Open list); closes by touching ~/.local/state/market-brief/meeting-<date>.done. 12:00 + 17:00 nag ntfys while not done. Recurring Google Calendar event (angelgdo7 calendar) Mon+Thu 08:00–08:15.
  • 2026-11-02: meeting now first runs ~/.local/bin/site-data-digest <date> (Search Console, Bing Webmaster, Clarity; read-only, no model; output projects/market-brief/site-data-<date>.md). Cloud routine prompt rewritten: buyer-side/funding/supply-chain/competitor sources first, no forum reply targets.
  • 2026-11-02: site-data-digest also runs note-outcomes (per-note Search Console ledger).

Vault write lock (2026-11-09)

cockpit-index and pod.activity hold ~/Notes/.git/notes-sync.lock while writing tracked vault files, because a write during notes-sync's rebase leaves the vault stuck. Other vault writers do not take it yet; see Open in plex-server.

Storage audit November 10 2026

Storage audit and proposed fixes covers 81 active angel cron entries, 28 user timers and 25 system timers. Per-job inventory. Root cron was read from the 01:30 rescue export, not directly: it also contains a daily 02:00 ~/torrentvpn-backup.sh job omitted from the table above. The November 10 log fails because /media/angel/ESD-USB is not mounted. No schedules changed.