@wonsukchoi/crondex 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -40
- package/catalog.json +956 -5
- package/jobs/agriculture/field-soil-test-due-reminder.yaml +35 -0
- package/jobs/automotive/fleet-inspection-expiry-check.yaml +35 -0
- package/jobs/childcare/classroom-supply-low-stock-check.yaml +28 -0
- package/jobs/construction/crew-safety-cert-expiry-check.yaml +35 -0
- package/jobs/creator/affiliate-link-expiry-check.yaml +35 -0
- package/jobs/crypto/nft-floor-price-watch.yaml +37 -0
- package/jobs/ecommerce/coupon-code-expiry-check.yaml +36 -0
- package/jobs/education/tuition-payment-plan-delinquency-check.yaml +35 -0
- package/jobs/events/post-event-survey-response-rate-watch.yaml +39 -0
- package/jobs/fitness/class-waitlist-overflow-check.yaml +31 -0
- package/jobs/fleet/vehicle-idle-time-check.yaml +31 -0
- package/jobs/gaming/player-contract-renewal-check.yaml +35 -0
- package/jobs/government/public-records-retention-purge-check.yaml +32 -0
- package/jobs/growth/onboarding-completion-stall-check.yaml +38 -0
- package/jobs/healthcare/referral-pending-followup-check.yaml +36 -0
- package/jobs/hiring/reference-check-overdue-reminder.yaml +36 -0
- package/jobs/home/gutter-cleaning-reminder.yaml +30 -0
- package/jobs/hospitality/lost-and-found-item-aging-check.yaml +36 -0
- package/jobs/hr/probation-period-review-reminder.yaml +36 -0
- package/jobs/insurance/endorsement-request-followup-check.yaml +37 -0
- package/jobs/inventory/purchase-order-receiving-delay-check.yaml +33 -0
- package/jobs/investing/dca-contribution-reminder.yaml +33 -0
- package/jobs/learning/webinar-attendance-reminder.yaml +32 -0
- package/jobs/legal/patent-maintenance-fee-reminder.yaml +35 -0
- package/jobs/logistics/driver-hos-compliance-check.yaml +38 -0
- package/jobs/manufacturing/energy-consumption-spike-check.yaml +37 -0
- package/jobs/marketing/broken-campaign-link-check.yaml +31 -0
- package/jobs/nonprofit/donation-acknowledgment-lag-check.yaml +32 -0
- package/jobs/podcast/rss-feed-health-check.yaml +25 -0
- package/jobs/realestate/insurance-policy-renewal-reminder.yaml +31 -0
- package/jobs/restaurant/walk-in-cooler-temp-log-check.yaml +31 -0
- package/jobs/retail/loyalty-points-expiry-reminder.yaml +31 -0
- package/jobs/sales/quote-expiry-reminder.yaml +24 -0
- package/jobs/support/knowledge-base-article-staleness-check.yaml +39 -0
- package/jobs/team/new-hire-onboarding-task-check.yaml +32 -0
- package/jobs/travel/flight-layover-buffer-check.yaml +35 -0
- package/jobs/veterinary/lab-result-turnaround-check.yaml +35 -0
- package/jobs/warehousing/pallet-putaway-delay-check.yaml +35 -0
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: probation-period-review-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Probation Period Review Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a new hire's probation period ends so a manager can
|
|
6
|
+
complete the required review before it lapses automatically. Use this
|
|
7
|
+
if a probation deadline has ever passed with no review on file and
|
|
8
|
+
nobody caught it until it became a compliance headache.
|
|
9
|
+
category: hr
|
|
10
|
+
tags: [hr, probation, new-hire, compliance]
|
|
11
|
+
schedule: "0 8 * * 1"
|
|
12
|
+
timezone: "America/New_York"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$3 != "" {next}
|
|
18
|
+
{
|
|
19
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline end_epoch; close(cmd);
|
|
21
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
22
|
+
diff_days = (end_epoch - now_epoch) / 86400;
|
|
23
|
+
if (diff_days <= days) {
|
|
24
|
+
printf "REVIEW DUE: %s — probation ends %s (%d days), no review on file\n", $1, $2, diff_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{probation_tracking_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
probation_tracking_csv_path:
|
|
30
|
+
default: "./probation-tracking.csv"
|
|
31
|
+
description: "Path to a CSV with columns: employee_name,probation_end_date (YYYY-MM-DD),review_completed_date (blank if not yet done)."
|
|
32
|
+
warn_days_before:
|
|
33
|
+
default: 14
|
|
34
|
+
description: How many days before probation ends to start warning if no review is on file.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Assumes a maintained CSV export from your HRIS tracking probation end dates and review completion; distinct from performance-review-cycle-reminder, which covers ongoing cyclical reviews rather than one-time new-hire probation.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: endorsement-request-followup-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Policy Endorsement Request Follow-up Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks requested policy endorsements or amendments (e.g. adding a
|
|
6
|
+
driver, changing coverage limits) that haven't been confirmed processed
|
|
7
|
+
within a set window and flags them for follow-up. Use this if you've
|
|
8
|
+
ever submitted a change request to a carrier and only found out months
|
|
9
|
+
later it was never actually applied.
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, endorsement, policy-changes, follow-up]
|
|
12
|
+
schedule: "0 9 * * 1-5"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v days="{{overdue_days}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$4 != "" {next}
|
|
20
|
+
{
|
|
21
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
22
|
+
cmd | getline requested_epoch; close(cmd);
|
|
23
|
+
pending_days = (today - requested_epoch) / 86400;
|
|
24
|
+
if (pending_days >= days) {
|
|
25
|
+
printf "OVERDUE: %s — %s requested %s (%d days, not confirmed processed)\n", $1, $2, $3, pending_days;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{endorsements_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
endorsements_csv_path:
|
|
31
|
+
default: "./endorsement-requests.csv"
|
|
32
|
+
description: "Path to a CSV with columns: policy_name,requested_change,requested_date (YYYY-MM-DD),confirmed_date (blank if not yet confirmed by the carrier)."
|
|
33
|
+
overdue_days:
|
|
34
|
+
default: 10
|
|
35
|
+
description: Days since an endorsement was requested, with no carrier confirmation, before it's flagged.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: Maintain the CSV manually or export it from your broker/agency management system; distinct from claim-status-check, which tracks claims rather than policy change requests.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: purchase-order-receiving-delay-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Purchase Order Receiving Delay Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks open purchase orders against their expected delivery date and
|
|
6
|
+
flags any that are overdue and not yet marked received. Use this if
|
|
7
|
+
stock has ever run out because a purchase order was quietly late and
|
|
8
|
+
nobody chased the supplier until shelves were already empty.
|
|
9
|
+
category: inventory
|
|
10
|
+
tags: [inventory, purchase-orders, receiving, suppliers]
|
|
11
|
+
schedule: "0 7 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$5 != "" {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $4 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $4 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline expected_epoch; close(cmd);
|
|
22
|
+
overdue_days = (today - expected_epoch) / 86400;
|
|
23
|
+
if (overdue_days > 0) {
|
|
24
|
+
printf "OVERDUE: PO %s from %s expected %s (%d days late, not received)\n", $1, $2, $4, overdue_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{purchase_orders_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
purchase_orders_csv_path:
|
|
30
|
+
default: "./purchase-orders.csv"
|
|
31
|
+
description: "Path to a CSV with columns: po_number,supplier_name,order_date (YYYY-MM-DD),expected_delivery_date (YYYY-MM-DD),received_date (blank if not yet received)."
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Assumes a maintained CSV export from your procurement/inventory system; distinct from supplier-lead-time-drift-check, which tracks aggregate lead-time trends rather than individual overdue POs.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: dca-contribution-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: DCA Contribution Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Checks your dollar-cost-averaging log and warns if it's been longer than
|
|
6
|
+
your planned interval since the last logged contribution. Use this if
|
|
7
|
+
you've ever meant to invest a fixed amount on a schedule and let a month
|
|
8
|
+
slip by without actually placing the order.
|
|
9
|
+
category: investing
|
|
10
|
+
tags: [investing, dca, dollar-cost-averaging, contributions]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
last_line=$(tail -n 1 "{{contribution_log_csv}}" 2>/dev/null);
|
|
16
|
+
if [ -z "$last_line" ]; then echo "WARNING: no contributions logged yet in {{contribution_log_csv}}"; exit 1; fi;
|
|
17
|
+
last_date=$(echo "$last_line" | cut -d',' -f1);
|
|
18
|
+
last_ts=$(date -d "$last_date" +%s 2>/dev/null || date -jf "%Y-%m-%d" "$last_date" +%s 2>/dev/null);
|
|
19
|
+
today_ts=$(date +%s);
|
|
20
|
+
days_since=$(( (today_ts - last_ts) / 86400 ));
|
|
21
|
+
if [ "$days_since" -ge "{{interval_days}}" ]; then
|
|
22
|
+
echo "WARNING: last DCA contribution was $days_since days ago (on $last_date) — due for another (${{interval_days}}-day interval)";
|
|
23
|
+
exit 1;
|
|
24
|
+
else echo "OK: last DCA contribution was $days_since days ago (on $last_date), within the ${{interval_days}}-day interval"; fi
|
|
25
|
+
variables:
|
|
26
|
+
contribution_log_csv:
|
|
27
|
+
default: "dca-contributions.csv"
|
|
28
|
+
description: "CSV with header row, columns: date(YYYY-MM-DD),amount,ticker — append a row each time you invest."
|
|
29
|
+
interval_days:
|
|
30
|
+
default: 30
|
|
31
|
+
description: Expected number of days between contributions before this flags as overdue.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Append a row to dca-contributions.csv yourself (or via your brokerage export) each time you make a scheduled contribution.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: webinar-attendance-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Webinar Attendance Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Checks a list of webinars/workshops you've registered for and flags any
|
|
6
|
+
happening soon so you can block the time and prep. Use this if you've
|
|
7
|
+
ever signed up for a webinar and completely forgotten about it by the
|
|
8
|
+
time it started.
|
|
9
|
+
category: learning
|
|
10
|
+
tags: [learning, webinars, events, reminders]
|
|
11
|
+
schedule: "0 8 * * *"
|
|
12
|
+
timezone: "America/Los_Angeles"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
17
|
+
NR>1 {
|
|
18
|
+
cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
|
|
19
|
+
cmd | getline event_ts; close(cmd);
|
|
20
|
+
days_left = int((event_ts - today) / 86400);
|
|
21
|
+
if (days_left >= 0 && days_left <= warn) print "UPCOMING: \"" $1 "\" on " $2 " (in " days_left " day(s))";
|
|
22
|
+
}
|
|
23
|
+
' "{{registrations_csv}}"
|
|
24
|
+
variables:
|
|
25
|
+
registrations_csv:
|
|
26
|
+
default: "webinar-registrations.csv"
|
|
27
|
+
description: "CSV with header row, columns: title,date(YYYY-MM-DD)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 3
|
|
30
|
+
description: Days ahead of a webinar to start flagging it as upcoming.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: Add a row to webinar-registrations.csv whenever you sign up for a webinar or workshop — this job only reads it, it doesn't register you anywhere.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: patent-maintenance-fee-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Patent Maintenance Fee Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a patent maintenance (annuity) fee comes due so the
|
|
6
|
+
patent doesn't lapse. Use this if a patent has ever gone abandoned
|
|
7
|
+
because a maintenance fee deadline was missed.
|
|
8
|
+
category: legal
|
|
9
|
+
tags: [legal, patents, ip, maintenance-fees]
|
|
10
|
+
schedule: "0 9 1 * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
today=$(date +%s);
|
|
15
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
16
|
+
NR>1 {
|
|
17
|
+
cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
|
|
18
|
+
cmd | getline due_ts; close(cmd);
|
|
19
|
+
days_left = int((due_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn) print "WARNING: patent \"" $1 "\" maintenance fee due in " days_left " days (" $2 ")";
|
|
21
|
+
}
|
|
22
|
+
' "{{patents_csv}}"
|
|
23
|
+
variables:
|
|
24
|
+
patents_csv:
|
|
25
|
+
default: "patent-maintenance-fees.csv"
|
|
26
|
+
description: "CSV with header row, columns: patent_name_or_number,fee_due_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 60
|
|
29
|
+
description: Days before a maintenance fee due date to start warning — most jurisdictions allow a grace period but with a surcharge, so warn early.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: >
|
|
32
|
+
Keep patent-maintenance-fees.csv updated with each patent's next fee due
|
|
33
|
+
date (from your IP counsel or the relevant patent office schedule) —
|
|
34
|
+
fee intervals and amounts vary by jurisdiction, so this job only tracks
|
|
35
|
+
dates you supply.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: driver-hos-compliance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Driver Hours-of-Service Compliance Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks logged driving hours against the daily hours-of-service limit and
|
|
6
|
+
flags any driver close to or over it. Use this if a driver has ever run
|
|
7
|
+
over their legal on-duty hours because nobody was tallying it in real
|
|
8
|
+
time.
|
|
9
|
+
category: logistics
|
|
10
|
+
tags: [logistics, drivers, hos, compliance, safety]
|
|
11
|
+
schedule: "0 */4 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v limit={{daily_hours_limit}} -v warn={{warn_hours_remaining}} '
|
|
16
|
+
NR>1 {
|
|
17
|
+
driver = $1; hours_today = $2;
|
|
18
|
+
remaining = limit - hours_today;
|
|
19
|
+
if (hours_today >= limit) print "OVER LIMIT: " driver " has logged " hours_today "h, exceeds the " limit "h daily limit";
|
|
20
|
+
else if (remaining <= warn) print "WARNING: " driver " has logged " hours_today "h, only " remaining "h remaining before the " limit "h daily limit";
|
|
21
|
+
}
|
|
22
|
+
' "{{driver_hours_csv}}"
|
|
23
|
+
variables:
|
|
24
|
+
driver_hours_csv:
|
|
25
|
+
default: "driver-hours-today.csv"
|
|
26
|
+
description: "CSV with header row, columns: driver_name,hours_logged_today — update from your ELD (electronic logging device) export."
|
|
27
|
+
daily_hours_limit:
|
|
28
|
+
default: 11
|
|
29
|
+
description: Maximum on-duty driving hours allowed per day under your governing HOS rules.
|
|
30
|
+
warn_hours_remaining:
|
|
31
|
+
default: 1
|
|
32
|
+
description: Hours remaining before the limit at which to start warning a driver is close.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: >
|
|
35
|
+
Defaults reflect the US FMCSA 11-hour driving limit — adjust
|
|
36
|
+
daily_hours_limit for your jurisdiction's rules. This is a schedule-side
|
|
37
|
+
check against a CSV you export from your ELD/telematics system, not a
|
|
38
|
+
replacement for that system's own compliance logging.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: energy-consumption-spike-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Energy Consumption Spike Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares today's logged energy usage against a rolling baseline and
|
|
6
|
+
flags an unusual spike. Use this if a jump in electricity use has ever
|
|
7
|
+
gone unnoticed until the utility bill arrived, when it could have
|
|
8
|
+
pointed to a failing motor, a stuck compressor, or equipment left
|
|
9
|
+
running.
|
|
10
|
+
category: manufacturing
|
|
11
|
+
tags: [manufacturing, energy, utilities, anomaly]
|
|
12
|
+
schedule: "0 7 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v threshold={{spike_pct_threshold}} '
|
|
17
|
+
NR>1 { sum += $2; count++; readings[count] = $2 }
|
|
18
|
+
END {
|
|
19
|
+
if (count < 2) { print "OK: not enough readings yet to establish a baseline"; exit 0 }
|
|
20
|
+
latest = readings[count];
|
|
21
|
+
baseline_sum = sum - latest;
|
|
22
|
+
baseline_avg = baseline_sum / (count - 1);
|
|
23
|
+
if (baseline_avg == 0) { print "OK: baseline average is zero, skipping comparison"; exit 0 }
|
|
24
|
+
pct_over = ((latest - baseline_avg) / baseline_avg) * 100;
|
|
25
|
+
if (pct_over >= threshold) printf "SPIKE: latest reading %.1f kWh is %.1f%% above the %.1f kWh rolling baseline\n", latest, pct_over, baseline_avg;
|
|
26
|
+
else printf "OK: latest reading %.1f kWh is within %.1f%% of the %.1f kWh rolling baseline\n", latest, threshold, baseline_avg;
|
|
27
|
+
}
|
|
28
|
+
' "{{energy_readings_csv}}"
|
|
29
|
+
variables:
|
|
30
|
+
energy_readings_csv:
|
|
31
|
+
default: "energy-readings.csv"
|
|
32
|
+
description: "CSV with header row, columns: date,kwh — one row per day, most recent row last."
|
|
33
|
+
spike_pct_threshold:
|
|
34
|
+
default: 25
|
|
35
|
+
description: Percent above the rolling baseline average that counts as a spike worth flagging.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: Append a row to energy-readings.csv daily (from a smart meter export or utility portal) — the baseline is just the average of all prior rows, so accuracy improves as history builds up.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: broken-campaign-link-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Broken Campaign Link Check
|
|
4
|
+
description: >
|
|
5
|
+
Requests each active campaign's landing page URL and flags any that
|
|
6
|
+
return an error instead of loading. Use this if paid traffic has ever
|
|
7
|
+
kept flowing to a campaign whose landing page was quietly down or
|
|
8
|
+
redirecting to a 404.
|
|
9
|
+
category: marketing
|
|
10
|
+
tags: [marketing, campaigns, links, uptime]
|
|
11
|
+
schedule: "0 */2 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
while IFS=',' read -r name url; do
|
|
16
|
+
[ "$name" = "campaign_name" ] && continue;
|
|
17
|
+
[ -z "$url" ] && continue;
|
|
18
|
+
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time {{timeout_seconds}} "$url");
|
|
19
|
+
if [ "$code" -ge 400 ] || [ "$code" = "000" ]; then
|
|
20
|
+
echo "BROKEN: \"$name\" -> $url returned HTTP $code";
|
|
21
|
+
fi;
|
|
22
|
+
done < "{{campaign_urls_csv}}"
|
|
23
|
+
variables:
|
|
24
|
+
campaign_urls_csv:
|
|
25
|
+
default: "campaign-urls.csv"
|
|
26
|
+
description: "CSV with header row, columns: campaign_name,landing_page_url — one row per active campaign."
|
|
27
|
+
timeout_seconds:
|
|
28
|
+
default: 10
|
|
29
|
+
description: Seconds to wait for each landing page before treating it as unreachable.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep campaign-urls.csv in sync with whatever's currently live in your ad platform — a URL left in the file after a campaign ends will keep getting checked (and may false-flag if the page is intentionally retired).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: donation-acknowledgment-lag-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Donation Acknowledgment Lag Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags donations that haven't been thanked yet and are approaching or
|
|
6
|
+
past your acknowledgment window. Use this if a donor has ever given and
|
|
7
|
+
waited weeks for a thank-you, or if a gift needing a timely
|
|
8
|
+
tax-receipt letter almost slipped past the deadline.
|
|
9
|
+
category: nonprofit
|
|
10
|
+
tags: [nonprofit, donors, acknowledgments, stewardship]
|
|
11
|
+
schedule: "0 9 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
17
|
+
NR>1 && $3 == "no" {
|
|
18
|
+
cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
|
|
19
|
+
cmd | getline gift_ts; close(cmd);
|
|
20
|
+
days_since = int((today - gift_ts) / 86400);
|
|
21
|
+
if (days_since >= warn) print "UNACKNOWLEDGED: " $1 " gave on " $2 " (" days_since " days ago, not yet thanked)";
|
|
22
|
+
}
|
|
23
|
+
' "{{donations_csv}}"
|
|
24
|
+
variables:
|
|
25
|
+
donations_csv:
|
|
26
|
+
default: "donations.csv"
|
|
27
|
+
description: "CSV with header row, columns: donor_name,gift_date(YYYY-MM-DD),acknowledged(yes/no)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 7
|
|
30
|
+
description: Days since the gift date before an unacknowledged donation gets flagged.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: Mark a donation's acknowledged column "yes" once a thank-you/receipt goes out — export donations.csv from your CRM or update it manually.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: rss-feed-health-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Podcast RSS Feed Health Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks that your podcast's RSS feed is reachable and still valid XML with
|
|
6
|
+
the required podcast tags. Use this if a feed has ever silently broken
|
|
7
|
+
(bad edit, hosting hiccup, malformed enclosure) and stopped new episodes
|
|
8
|
+
from reaching Apple Podcasts or Spotify for days before anyone noticed.
|
|
9
|
+
category: podcast
|
|
10
|
+
tags: [podcast, rss, feed, distribution]
|
|
11
|
+
schedule: "0 */6 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
http_code=$(curl -s -o /tmp/rss-feed-check.xml -w "%{http_code}" "{{feed_url}}");
|
|
16
|
+
if [ "$http_code" != "200" ]; then echo "FAIL: feed_url returned HTTP $http_code"; exit 1; fi;
|
|
17
|
+
if ! grep -q "<rss" /tmp/rss-feed-check.xml; then echo "FAIL: response is not RSS XML"; exit 1; fi;
|
|
18
|
+
if ! grep -q "<enclosure" /tmp/rss-feed-check.xml; then echo "WARNING: no <enclosure> tag found — feed may have no episodes"; exit 1; fi;
|
|
19
|
+
echo "OK: feed reachable and looks valid"
|
|
20
|
+
variables:
|
|
21
|
+
feed_url:
|
|
22
|
+
default: "https://example.com/podcast/feed.xml"
|
|
23
|
+
description: Public URL of your podcast's RSS feed.
|
|
24
|
+
compatible_agents: [generic, claude, codex]
|
|
25
|
+
notes: A passing check confirms the feed is reachable and structurally sane — it doesn't validate against the full RSS/iTunes spec, so still run a dedicated feed validator before a big launch.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: insurance-policy-renewal-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Property Insurance Policy Renewal Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Flags property insurance policies that are coming up for renewal within a
|
|
6
|
+
set window. Use this if a policy has ever lapsed because the renewal
|
|
7
|
+
notice got buried in an inbox and nobody caught it in time.
|
|
8
|
+
category: realestate
|
|
9
|
+
tags: [realestate, insurance, renewals, compliance]
|
|
10
|
+
schedule: "0 8 * * 1"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
today=$(date +%s);
|
|
15
|
+
awk -F, -v today="$today" -v warn={{warn_days}} '
|
|
16
|
+
NR>1 {
|
|
17
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
18
|
+
cmd | getline exp_ts; close(cmd);
|
|
19
|
+
days_left = int((exp_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn) print "RENEWAL DUE: " $1 " policy " $2 " expires in " days_left " days (" $3 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{policies_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
policies_csv:
|
|
25
|
+
default: "property-insurance-policies.csv"
|
|
26
|
+
description: "CSV with header row, columns: property_name,policy_number,expiration_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 30
|
|
29
|
+
description: Days before expiration to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Keep property-insurance-policies.csv updated whenever a policy is bound, renewed, or switched carriers.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: walk-in-cooler-temp-log-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Walk-In Cooler Temperature Log Check
|
|
4
|
+
description: >
|
|
5
|
+
Scans today's logged cooler/freezer temperature readings and flags any
|
|
6
|
+
that fall outside the safe range. Use this if an out-of-range reading has
|
|
7
|
+
ever sat unnoticed in a paper log until a health inspector found it.
|
|
8
|
+
category: restaurant
|
|
9
|
+
tags: [restaurant, food-safety, temperature, compliance]
|
|
10
|
+
schedule: "0 11,17,23 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
awk -F',' -v min="{{min_safe_f}}" -v max="{{max_safe_f}}" '
|
|
15
|
+
NR==1 {next}
|
|
16
|
+
{
|
|
17
|
+
if ($3 < min || $3 > max) printf "OUT OF RANGE: %s %s reading %.1fF at %s\n", $1, $2, $3, $4;
|
|
18
|
+
}
|
|
19
|
+
' "{{temp_log_csv}}"
|
|
20
|
+
variables:
|
|
21
|
+
temp_log_csv:
|
|
22
|
+
default: "./cooler-temp-log.csv"
|
|
23
|
+
description: "CSV with header row, columns: unit_name,unit_type,temp_f,logged_at — one row per temperature check."
|
|
24
|
+
min_safe_f:
|
|
25
|
+
default: 33
|
|
26
|
+
description: Minimum safe temperature in Fahrenheit for a walk-in cooler/freezer reading.
|
|
27
|
+
max_safe_f:
|
|
28
|
+
default: 40
|
|
29
|
+
description: Maximum safe temperature in Fahrenheit for a walk-in cooler/freezer reading.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Freezer units need a separate, much lower range — run this job once per unit_type with min_safe_f/max_safe_f set accordingly, or pre-filter the CSV.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: loyalty-points-expiry-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Loyalty Points Expiry Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Finds customers whose loyalty/reward points are about to expire unused.
|
|
6
|
+
Use this if points have ever quietly expired on customers who would have
|
|
7
|
+
redeemed them if someone had just reminded them in time.
|
|
8
|
+
category: retail
|
|
9
|
+
tags: [retail, loyalty, customers, rewards]
|
|
10
|
+
schedule: "0 9 * * 1"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
today=$(date +%s);
|
|
15
|
+
awk -F, -v today="$today" -v warn={{warn_days}} '
|
|
16
|
+
NR>1 {
|
|
17
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
18
|
+
cmd | getline exp_ts; close(cmd);
|
|
19
|
+
days_left = int((exp_ts - today) / 86400);
|
|
20
|
+
if (days_left <= warn && days_left >= 0 && $2 > 0) print "EXPIRING: " $1 " has " $2 " points expiring in " days_left " days (" $3 ")";
|
|
21
|
+
}
|
|
22
|
+
' {{loyalty_csv}}
|
|
23
|
+
variables:
|
|
24
|
+
loyalty_csv:
|
|
25
|
+
default: "loyalty-points.csv"
|
|
26
|
+
description: "CSV with header row, columns: customer_name,points_balance,expiration_date(YYYY-MM-DD)."
|
|
27
|
+
warn_days:
|
|
28
|
+
default: 14
|
|
29
|
+
description: Days before expiration to start warning.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Export loyalty-points.csv from your loyalty/POS platform on a schedule that matches how it tracks per-point expiration.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
id: quote-expiry-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Sales Quote Expiry Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Flags outstanding price quotes that are about to expire before the
|
|
6
|
+
customer has accepted them. Use this if a quote has ever lapsed and
|
|
7
|
+
forced a re-negotiation because nobody followed up before the locked-in
|
|
8
|
+
pricing ran out.
|
|
9
|
+
category: sales
|
|
10
|
+
tags: [sales, quotes, pricing, followup]
|
|
11
|
+
schedule: "0 8 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
psql "{{database_url}}" -t -c "select customer_name, owner, quote_number, expires_at from quotes where status = 'sent' and expires_at < now() + interval '{{warn_days}} days';"
|
|
16
|
+
variables:
|
|
17
|
+
database_url:
|
|
18
|
+
default: "postgres://user:pass@host:5432/db"
|
|
19
|
+
description: Connection string for the quotes/CPQ database.
|
|
20
|
+
warn_days:
|
|
21
|
+
default: 5
|
|
22
|
+
description: Days before expires_at to start flagging a quote.
|
|
23
|
+
compatible_agents: [generic, claude, codex]
|
|
24
|
+
notes: Assumes a `quotes` table with `status`, `expires_at`, and `owner` columns — adjust the query to your CPQ or CRM's schema.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
id: knowledge-base-article-staleness-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Knowledge Base Article Staleness Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags published help center articles that haven't been reviewed or
|
|
6
|
+
updated in a long time. Use this if a stale article has ever kept giving
|
|
7
|
+
customers outdated instructions because nobody was tracking when it was
|
|
8
|
+
last touched.
|
|
9
|
+
category: support
|
|
10
|
+
tags: [support, knowledge-base, content, self-service]
|
|
11
|
+
schedule: "0 9 1 * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
curl -s -H "Authorization: Bearer {{api_token}}" "{{kb_api_url}}" | grep -o '"title":"[^"]*","updated_at":"[^"]*"' | while IFS= read -r line; do
|
|
17
|
+
title=$(echo "$line" | sed -E 's/.*"title":"([^"]*)".*/\1/');
|
|
18
|
+
updated=$(echo "$line" | sed -E 's/.*"updated_at":"([^"]*)".*/\1/');
|
|
19
|
+
upd_ts=$(date -d "$updated" +%s 2>/dev/null || date -jf "%Y-%m-%dT%H:%M:%S" "$updated" +%s 2>/dev/null);
|
|
20
|
+
if [ -n "$upd_ts" ]; then
|
|
21
|
+
age_days=$(( (today - upd_ts) / 86400 ));
|
|
22
|
+
if [ "$age_days" -ge {{stale_days}} ]; then echo "STALE: \"$title\" last updated $age_days days ago"; fi;
|
|
23
|
+
fi;
|
|
24
|
+
done
|
|
25
|
+
variables:
|
|
26
|
+
kb_api_url:
|
|
27
|
+
default: "https://api.example-helpdesk.com/help_center/articles?status=published"
|
|
28
|
+
description: Help center API endpoint listing published articles with title and updated_at fields.
|
|
29
|
+
api_token:
|
|
30
|
+
default: "your-api-token"
|
|
31
|
+
description: Bearer token for the help center API.
|
|
32
|
+
stale_days:
|
|
33
|
+
default: 365
|
|
34
|
+
description: Days since last update before an article counts as stale.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: >
|
|
37
|
+
The JSON field extraction here is deliberately simple (grep/sed, no jq
|
|
38
|
+
dependency) — if your help center API's JSON is nested or multi-line,
|
|
39
|
+
swap in `jq` for reliable parsing instead.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: new-hire-onboarding-task-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: New Hire Onboarding Task Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks which new hires have onboarding tasks (accounts, equipment,
|
|
6
|
+
paperwork) that are still open past their target date. Use this if a
|
|
7
|
+
new hire has ever shown up without laptop access or benefits paperwork
|
|
8
|
+
because a checklist item silently slipped through the cracks.
|
|
9
|
+
category: team
|
|
10
|
+
tags: [team, onboarding, new-hire, checklist]
|
|
11
|
+
schedule: "0 8 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 == "open" {
|
|
19
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline due_epoch; close(cmd);
|
|
21
|
+
age_days = (today - due_epoch) / 86400;
|
|
22
|
+
if (age_days >= 0) {
|
|
23
|
+
printf "OVERDUE: %s — task \"%s\" due %s (%d day(s) late)\n", $1, $2, $3, age_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{onboarding_tasks_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
onboarding_tasks_csv_path:
|
|
29
|
+
default: "./onboarding-tasks.csv"
|
|
30
|
+
description: "Path to a CSV with columns: new_hire_name,task_name,due_date (YYYY-MM-DD),status (open/done)."
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: Assumes a maintained onboarding checklist export (from an HRIS or a spreadsheet) — this is the backstop that flags what's still open past its due date, not a source of truth for the checklist itself.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: flight-layover-buffer-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Flight Layover Buffer Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks your upcoming itinerary for connections shorter than a safe
|
|
6
|
+
minimum layover time. Use this if you've ever booked a multi-leg trip
|
|
7
|
+
and only noticed a 35-minute connection the night before flying.
|
|
8
|
+
category: travel
|
|
9
|
+
tags: [travel, flights, layover, itinerary]
|
|
10
|
+
schedule: "0 9 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
awk -F',' -v min_minutes="{{min_layover_minutes}}" '
|
|
15
|
+
NR==1 {next}
|
|
16
|
+
{
|
|
17
|
+
cmd1 = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $2 "\" +%s 2>/dev/null";
|
|
18
|
+
cmd1 | getline arrival_epoch; close(cmd1);
|
|
19
|
+
cmd2 = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $3 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd2 | getline next_departure_epoch; close(cmd2);
|
|
21
|
+
layover_minutes = (next_departure_epoch - arrival_epoch) / 60;
|
|
22
|
+
if (layover_minutes < min_minutes) {
|
|
23
|
+
printf "TIGHT LAYOVER: %s — only %d minute(s) between arrival and next departure\n", $1, layover_minutes;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{itinerary_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
itinerary_csv_path:
|
|
29
|
+
default: "./flight-itinerary.csv"
|
|
30
|
+
description: "Path to a CSV with columns: connection_airport,arrival_time (YYYY-MM-DD HH:MM),next_departure_time (YYYY-MM-DD HH:MM)."
|
|
31
|
+
min_layover_minutes:
|
|
32
|
+
default: 60
|
|
33
|
+
description: Minimum minutes between arrival and next departure before a connection counts as tight. Raise this for connections requiring a terminal change, customs, or international-to-domestic transfers.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Zero-token. You maintain the itinerary CSV yourself — this doesn't pull from any airline or booking system. Times should be in the connection airport's local timezone.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: lab-result-turnaround-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Lab Result Turnaround Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks which submitted lab orders still have no result logged past
|
|
6
|
+
their expected turnaround time. Use this if a sample has ever sat at
|
|
7
|
+
an outside lab for a week with nobody following up because no one was
|
|
8
|
+
tracking orders against their expected turnaround.
|
|
9
|
+
category: veterinary
|
|
10
|
+
tags: [veterinary, lab-results, patients, turnaround]
|
|
11
|
+
schedule: "0 9 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v warn_days="{{overdue_after_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 == "pending" {
|
|
19
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline submitted_epoch; close(cmd);
|
|
21
|
+
age_days = (today - submitted_epoch) / 86400;
|
|
22
|
+
if (age_days >= warn_days) {
|
|
23
|
+
printf "OVERDUE RESULT: %s (%s) — %s submitted %s (%d day(s) ago, still pending)\n", $1, $2, $5, $3, age_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{lab_orders_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
lab_orders_csv_path:
|
|
29
|
+
default: "./lab-orders.csv"
|
|
30
|
+
description: "Path to a CSV with columns: pet_name,owner_name,submitted_date (YYYY-MM-DD),status (pending/resulted),test_type."
|
|
31
|
+
overdue_after_days:
|
|
32
|
+
default: 5
|
|
33
|
+
description: Days since a sample was submitted before a still-pending result counts as overdue for follow-up with the lab.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Assumes a maintained export from your practice management or lab-ordering system — this flags orders that fell out of tracking, it doesn't chase the lab itself.
|