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-pausedflag 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-creditse7cc8d0 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. Seeprojects/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 · |
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.
- joins: every process card; alerting
If you change this¶
- Hits: the ordering above ·
rescue-watchdogMAX_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 tickis 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_LOCKserializes 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-handoffmoved 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.pyunder 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 Pagesoddly-pins), which Pinterest auto-publishes; the 10:00pod-pinsCSV is off while~/.config/pod-pins-rss.connectedexists. 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.txtand commits + pushes our scripts in~/.local/binto GitHubEmbeddedEra/ops-scripts(private; third-party binaries are .gitignored; the old local history with binaries is on local branchpre-ops-history, never pushed). cron-watch 26 h. Added 2026-09-28. - offsite-backup / offsite-drill — 05:15 daily: restic repo
embeddedera-backups/offsite-resticin 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-freeclaude -pdiagnosis (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 -pSonnet, 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,weekis 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=0on the pod-day line and in the pod-dispatch drop-infreeze.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-dueowns the emulator then); otherwise boots the bounded emulator, rehearses a draft on each platform, and updates the version pin (runtime/version-pins.json, read byrehearse_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 restoreto 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. Alsocron-runcalls the hook on every failure and user units getOnFailure=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; commitsbriefs/<date>.mdto private repoEmbeddedEra/market-briefsbranchclaude/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-briefsand 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-researchfeeds 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-remoterunning~/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:00nagntfys 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; outputprojects/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.