@wonsukchoi/crondex 0.18.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 +1955 -58
- package/jobs/agriculture/field-soil-test-due-reminder.yaml +35 -0
- package/jobs/agriculture/grain-storage-temperature-check.yaml +34 -0
- package/jobs/automotive/fleet-inspection-expiry-check.yaml +35 -0
- package/jobs/automotive/warranty-claim-deadline-check.yaml +35 -0
- package/jobs/childcare/allergy-action-plan-expiry-check.yaml +34 -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/construction/material-delivery-delay-check.yaml +32 -0
- package/jobs/creator/affiliate-link-expiry-check.yaml +35 -0
- package/jobs/creator/brand-deal-payment-followup-check.yaml +32 -0
- package/jobs/crypto/nft-floor-price-watch.yaml +37 -0
- package/jobs/crypto/stablecoin-peg-deviation-watch.yaml +33 -0
- package/jobs/ecommerce/coupon-code-expiry-check.yaml +36 -0
- package/jobs/ecommerce/shipping-delay-check.yaml +31 -0
- package/jobs/education/overdue-library-materials-check.yaml +34 -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/events/speaker-confirmation-deadline-check.yaml +35 -0
- package/jobs/fitness/class-waitlist-overflow-check.yaml +31 -0
- package/jobs/fitness/locker-rental-expiry-check.yaml +35 -0
- package/jobs/fleet/fleet-insurance-expiry-check.yaml +34 -0
- package/jobs/fleet/vehicle-idle-time-check.yaml +31 -0
- package/jobs/gaming/game-server-disk-space-check.yaml +34 -0
- package/jobs/gaming/player-contract-renewal-check.yaml +35 -0
- package/jobs/government/public-comment-period-closing-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/growth/seat-utilization-upsell-check.yaml +34 -0
- package/jobs/healthcare/medical-equipment-calibration-check.yaml +35 -0
- package/jobs/healthcare/referral-pending-followup-check.yaml +36 -0
- package/jobs/hiring/job-posting-expiry-check.yaml +41 -0
- package/jobs/hiring/reference-check-overdue-reminder.yaml +36 -0
- package/jobs/home/gutter-cleaning-reminder.yaml +30 -0
- package/jobs/home/utility-bill-anomaly-check.yaml +36 -0
- package/jobs/hospitality/housekeeping-turnover-time-check.yaml +41 -0
- package/jobs/hospitality/lost-and-found-item-aging-check.yaml +36 -0
- package/jobs/hr/i9-reverification-deadline-check.yaml +36 -0
- package/jobs/hr/probation-period-review-reminder.yaml +36 -0
- package/jobs/insurance/beneficiary-designation-review-reminder.yaml +35 -0
- package/jobs/insurance/endorsement-request-followup-check.yaml +37 -0
- package/jobs/inventory/purchase-order-receiving-delay-check.yaml +33 -0
- package/jobs/inventory/supplier-lead-time-drift-check.yaml +34 -0
- package/jobs/investing/bond-cd-maturity-reminder.yaml +31 -0
- package/jobs/investing/dca-contribution-reminder.yaml +33 -0
- package/jobs/learning/practice-streak-check.yaml +33 -0
- package/jobs/learning/webinar-attendance-reminder.yaml +32 -0
- package/jobs/legal/business-license-renewal-check.yaml +37 -0
- package/jobs/legal/patent-maintenance-fee-reminder.yaml +35 -0
- package/jobs/logistics/driver-hos-compliance-check.yaml +38 -0
- package/jobs/logistics/port-congestion-watch.yaml +34 -0
- package/jobs/manufacturing/energy-consumption-spike-check.yaml +37 -0
- package/jobs/manufacturing/equipment-calibration-due-check.yaml +32 -0
- package/jobs/marketing/broken-campaign-link-check.yaml +31 -0
- package/jobs/marketing/newsletter-unsubscribe-spike-check.yaml +37 -0
- package/jobs/nonprofit/donation-acknowledgment-lag-check.yaml +32 -0
- package/jobs/nonprofit/event-rsvp-shortfall-check.yaml +40 -0
- package/jobs/podcast/rss-feed-health-check.yaml +25 -0
- package/jobs/podcast/transcript-publish-lag-check.yaml +31 -0
- package/jobs/realestate/hoa-fee-collection-check.yaml +35 -0
- package/jobs/realestate/insurance-policy-renewal-reminder.yaml +31 -0
- package/jobs/restaurant/supplier-price-increase-watch.yaml +36 -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/retail/markdown-aging-inventory-check.yaml +33 -0
- package/jobs/sales/proposal-followup-nudge.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/support/macro-usage-staleness-check.yaml +33 -0
- package/jobs/team/expense-report-deadline-reminder.yaml +28 -0
- package/jobs/team/new-hire-onboarding-task-check.yaml +32 -0
- package/jobs/travel/flight-layover-buffer-check.yaml +35 -0
- package/jobs/travel/hotel-cancellation-deadline-reminder.yaml +32 -0
- package/jobs/veterinary/lab-result-turnaround-check.yaml +35 -0
- package/jobs/veterinary/medication-inventory-expiry-check.yaml +31 -0
- package/jobs/warehousing/pallet-putaway-delay-check.yaml +35 -0
- package/jobs/warehousing/returns-processing-backlog-check.yaml +33 -0
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: class-waitlist-overflow-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Class Waitlist Overflow Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks upcoming classes for waitlists that have grown past a threshold,
|
|
6
|
+
a sign there's enough demand to justify adding another session. Use
|
|
7
|
+
this if a popular class has ever kept a long waitlist for months
|
|
8
|
+
without anyone noticing there was room to add a second time slot.
|
|
9
|
+
category: fitness
|
|
10
|
+
tags: [fitness, classes, waitlist, demand]
|
|
11
|
+
schedule: "0 8 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v min_wait="{{min_waitlist_size}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
if ($3 >= min_wait) {
|
|
19
|
+
printf "WAITLIST OVERFLOW: %s on %s — %d people waiting\n", $1, $4, $3;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
' "{{classes_csv_path}}"
|
|
23
|
+
variables:
|
|
24
|
+
classes_csv_path:
|
|
25
|
+
default: "./upcoming-classes.csv"
|
|
26
|
+
description: "Path to a CSV with columns: class_name,capacity,waitlist_count,class_date."
|
|
27
|
+
min_waitlist_size:
|
|
28
|
+
default: 5
|
|
29
|
+
description: Minimum number of people on a waitlist before the class is flagged as overflowing.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: A class that overflows the same slot week after week is a stronger signal to add a session than a single busy day.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: locker-rental-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Locker Rental Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks rented lockers against their expiry date and flags the ones
|
|
6
|
+
coming due soon. Use this if a member's belongings have ever been
|
|
7
|
+
cleared out of a locker without warning because the rental quietly
|
|
8
|
+
lapsed.
|
|
9
|
+
category: fitness
|
|
10
|
+
tags: [fitness, lockers, membership]
|
|
11
|
+
schedule: "0 6 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline due_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
22
|
+
if (diff_days <= days) {
|
|
23
|
+
printf "LOCKER EXPIRING: %s (locker %s) — expires %s (%d days)\n", $1, $2, $3, diff_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{lockers_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
lockers_csv_path:
|
|
29
|
+
default: "./locker-rentals.csv"
|
|
30
|
+
description: "Path to a CSV with columns: member_name,locker_number,expiry_date (YYYY-MM-DD)."
|
|
31
|
+
warn_days_before:
|
|
32
|
+
default: 7
|
|
33
|
+
description: How many days before expiry to start warning.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Give members a heads-up before clearing out an expired locker — a courtesy notice avoids losing personal items to a lapsed rental.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: fleet-insurance-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Fleet Insurance Policy Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks each vehicle's insurance policy against its expiry date and flags
|
|
6
|
+
coverage that's about to lapse. Use this if a vehicle has ever been
|
|
7
|
+
driven on an expired policy because renewal paperwork got missed.
|
|
8
|
+
category: fleet
|
|
9
|
+
tags: [fleet, insurance, compliance]
|
|
10
|
+
schedule: "0 7 * * *"
|
|
11
|
+
timezone: "UTC"
|
|
12
|
+
runner: shell
|
|
13
|
+
command: >
|
|
14
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
15
|
+
NR==1 {next}
|
|
16
|
+
{
|
|
17
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
18
|
+
cmd | getline due_epoch; close(cmd);
|
|
19
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
20
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
21
|
+
if (diff_days <= days) {
|
|
22
|
+
printf "POLICY EXPIRING: vehicle %s, policy %s — expires %s (%d days)\n", $1, $2, $3, diff_days;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
' "{{policies_csv_path}}"
|
|
26
|
+
variables:
|
|
27
|
+
policies_csv_path:
|
|
28
|
+
default: "./fleet-insurance-policies.csv"
|
|
29
|
+
description: "Path to a CSV with columns: vehicle_id,policy_number,expiry_date (YYYY-MM-DD)."
|
|
30
|
+
warn_days_before:
|
|
31
|
+
default: 14
|
|
32
|
+
description: How many days before expiry to start warning.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Driving an uninsured vehicle is a legal and financial liability — treat a flag here as urgent, not routine.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: vehicle-idle-time-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Vehicle Idle Time Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks each vehicle's daily engine idle time against a threshold and
|
|
6
|
+
flags the ones burning excess fuel sitting still. Use this if a
|
|
7
|
+
telematics report has ever shown a surprise fuel bill and nobody could
|
|
8
|
+
tell how much of it came from vehicles just left running.
|
|
9
|
+
category: fleet
|
|
10
|
+
tags: [fleet, fuel, idling, telematics]
|
|
11
|
+
schedule: "0 7 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v max_min="{{max_idle_minutes}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
if ($3 > max_min) {
|
|
19
|
+
printf "EXCESS IDLE: vehicle %s on %s — %d idle minutes (limit %d)\n", $1, $2, $3, max_min;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
' "{{idle_report_csv_path}}"
|
|
23
|
+
variables:
|
|
24
|
+
idle_report_csv_path:
|
|
25
|
+
default: "./vehicle-idle-report.csv"
|
|
26
|
+
description: "Path to a daily telematics export CSV with columns: vehicle_id,report_date (YYYY-MM-DD),idle_minutes."
|
|
27
|
+
max_idle_minutes:
|
|
28
|
+
default: 60
|
|
29
|
+
description: Maximum idle minutes per day before a vehicle is flagged for excess idling.
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Requires a telematics/GPS provider that exports a daily idle-minutes-per-vehicle report to CSV; format varies by provider so you may need to reshape the export first.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: game-server-disk-space-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Game Server Disk Space Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks free disk space on your self-hosted game server's world/save
|
|
6
|
+
data volume and warns before it fills up. Use this if a server has
|
|
7
|
+
ever stopped saving the world (or crashed outright) because the disk
|
|
8
|
+
quietly filled up overnight.
|
|
9
|
+
category: gaming
|
|
10
|
+
tags: [gaming, server, disk-space, hosting]
|
|
11
|
+
schedule: "*/30 * * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
usage=$(df -P "{{server_data_path}}" 2>/dev/null | awk 'NR==2 {gsub("%","",$5); print $5}');
|
|
16
|
+
if [ -z "$usage" ]; then
|
|
17
|
+
echo "ERROR: could not read disk usage for {{server_data_path}}";
|
|
18
|
+
exit 1;
|
|
19
|
+
fi;
|
|
20
|
+
if [ "$usage" -ge "{{warn_pct}}" ]; then
|
|
21
|
+
echo "WARNING: disk usage at ${usage}% for {{server_data_path}} — world saves may fail soon";
|
|
22
|
+
exit 1;
|
|
23
|
+
else
|
|
24
|
+
echo "OK: disk usage at ${usage}% for {{server_data_path}}";
|
|
25
|
+
fi
|
|
26
|
+
variables:
|
|
27
|
+
server_data_path:
|
|
28
|
+
default: "/srv/gameserver"
|
|
29
|
+
description: Path to the game server's world/save data directory (or its mount point).
|
|
30
|
+
warn_pct:
|
|
31
|
+
default: 85
|
|
32
|
+
description: Disk usage percent that triggers a warning.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Run this on the same host as the game server (or via an ssh wrapper) — it reads local disk usage with `df`, not a remote API.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: player-contract-renewal-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Esports Player Contract Renewal Check
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a roster player's or staff member's contract expires.
|
|
6
|
+
Use this if a player has ever gone unsigned mid-season because a
|
|
7
|
+
contract end date slipped past without anyone flagging it in time to
|
|
8
|
+
negotiate a renewal.
|
|
9
|
+
category: gaming
|
|
10
|
+
tags: [gaming, esports, roster, contracts]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline exp_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (exp_epoch - now_epoch) / 86400;
|
|
22
|
+
if (diff_days <= days && diff_days >= 0) {
|
|
23
|
+
printf "CONTRACT EXPIRING: %s (%s) — expires %s (%d days)\n", $1, $3, $2, diff_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{roster_contracts_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
roster_contracts_csv_path:
|
|
29
|
+
default: "./roster-contracts.csv"
|
|
30
|
+
description: "Path to a CSV with columns: person_name,contract_end_date (YYYY-MM-DD),role."
|
|
31
|
+
warn_days_before:
|
|
32
|
+
default: 30
|
|
33
|
+
description: How many days before contract expiry to start warning.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Start renewal talks well before the warning window closes — a starting player benched by an expired contract is a roster gap, not just paperwork.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: public-comment-period-closing-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Public Comment Period Closing Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks open public comment periods for pending rules or proposals
|
|
6
|
+
against their close date and flags the ones closing soon. Use this if
|
|
7
|
+
a comment period has ever expired with barely any public input logged
|
|
8
|
+
because nobody was tracking the closing date.
|
|
9
|
+
category: government
|
|
10
|
+
tags: [government, public-comment, compliance, deadline]
|
|
11
|
+
schedule: "0 8 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$3 == "open" {
|
|
18
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline due_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
22
|
+
if (diff_days <= days) {
|
|
23
|
+
printf "COMMENT PERIOD CLOSING: %s — closes %s (%d days)\n", $1, $2, diff_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{comment_periods_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
comment_periods_csv_path:
|
|
29
|
+
default: "./public-comment-periods.csv"
|
|
30
|
+
description: "Path to a CSV with columns: proposal_name,close_date (YYYY-MM-DD),status (open/closed)."
|
|
31
|
+
warn_days_before:
|
|
32
|
+
default: 7
|
|
33
|
+
description: How many days before the close date to start warning.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: This tracks comment windows on proposals/rules specifically — for meeting notice timing use public-meeting-notice-compliance-check instead.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: public-records-retention-purge-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Public Records Retention Purge Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks records against their retention schedule and flags anything past
|
|
6
|
+
its retention period as eligible for archival review or purge. Use this
|
|
7
|
+
if a records room has ever quietly kept documents years past their
|
|
8
|
+
legally required retention window simply because nobody was tracking
|
|
9
|
+
expiry dates.
|
|
10
|
+
category: government
|
|
11
|
+
tags: [government, records, retention, compliance]
|
|
12
|
+
schedule: "0 8 1 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$4 == "no" {
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline exp_epoch; close(cmd);
|
|
22
|
+
if (today >= exp_epoch) {
|
|
23
|
+
printf "RETENTION EXPIRED: %s (%s) — retention ended %s\n", $1, $2, $3;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{records_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
records_csv_path:
|
|
29
|
+
default: "./records-retention-schedule.csv"
|
|
30
|
+
description: "Path to a CSV with columns: record_id,record_type,retention_end_date (YYYY-MM-DD),reviewed (yes/no)."
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: This flags records as eligible for review, not for automatic deletion — always confirm against your jurisdiction's retention schedule and any legal hold before purging anything.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: onboarding-completion-stall-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Onboarding Completion Stall Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks new users against your onboarding checklist and flags anyone
|
|
6
|
+
who's been stuck on the same step for too long. Use this if new users
|
|
7
|
+
have ever quietly abandoned setup partway through and nobody reached
|
|
8
|
+
out until they'd already churned.
|
|
9
|
+
category: growth
|
|
10
|
+
tags: [growth, onboarding, activation, retention]
|
|
11
|
+
schedule: "0 10 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v stall_days="{{stall_days}}" -v last_step="{{final_step}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$2 != last_step {
|
|
18
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline step_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (now_epoch - step_epoch) / 86400;
|
|
22
|
+
if (diff_days >= stall_days) {
|
|
23
|
+
printf "STALLED: %s — stuck on \"%s\" for %d day(s)\n", $1, $2, diff_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{onboarding_status_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
onboarding_status_csv_path:
|
|
29
|
+
default: "./onboarding-status.csv"
|
|
30
|
+
description: "Path to a CSV with columns: user_email,current_step,step_reached_date (YYYY-MM-DD)."
|
|
31
|
+
final_step:
|
|
32
|
+
default: "complete"
|
|
33
|
+
description: The value in current_step that marks onboarding as finished (users at this step are never flagged).
|
|
34
|
+
stall_days:
|
|
35
|
+
default: 3
|
|
36
|
+
description: Days a user can sit on the same non-final step before being flagged as stalled.
|
|
37
|
+
compatible_agents: [generic, claude, codex]
|
|
38
|
+
notes: You maintain onboarding-status.csv yourself (update current_step and step_reached_date as your product tracks progress) — doesn't integrate with any analytics platform directly.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: seat-utilization-upsell-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Seat Utilization Upsell Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags accounts that are using most or all of their purchased seats, a
|
|
6
|
+
strong signal they're about to hit a limit. Use this if you've ever
|
|
7
|
+
found out an account outgrew its plan only after they complained about
|
|
8
|
+
being locked out of adding a new user.
|
|
9
|
+
category: growth
|
|
10
|
+
tags: [growth, upsell, seats, expansion]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v threshold="{{utilization_threshold_pct}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
if ($2 > 0) {
|
|
19
|
+
pct = ($3 / $2) * 100;
|
|
20
|
+
if (pct >= threshold) {
|
|
21
|
+
printf "UPSELL OPPORTUNITY: %s — %d/%d seats used (%.0f%%)\n", $1, $3, $2, pct;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
' "{{accounts_csv_path}}"
|
|
26
|
+
variables:
|
|
27
|
+
accounts_csv_path:
|
|
28
|
+
default: "./account-seats.csv"
|
|
29
|
+
description: "Path to a CSV with columns: account_name,seats_purchased,seats_used."
|
|
30
|
+
utilization_threshold_pct:
|
|
31
|
+
default: 90
|
|
32
|
+
description: Seat utilization percent that flags an account as an upsell opportunity.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: High seat utilization is a strong signal to reach out about expanding the plan before the account hits a hard limit.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: medical-equipment-calibration-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Medical Equipment Calibration Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks a tracked list of medical equipment (blood pressure cuffs,
|
|
6
|
+
glucometers, defibrillators, scales) against calibration due dates and
|
|
7
|
+
warns before any lapse. Use this if a piece of equipment has ever been
|
|
8
|
+
found overdue for calibration only when an inspector or auditor flagged it.
|
|
9
|
+
category: healthcare
|
|
10
|
+
tags: [compliance, equipment, calibration, healthcare]
|
|
11
|
+
schedule: "0 8 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline due_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
22
|
+
if (diff_days <= days) {
|
|
23
|
+
printf "CALIBRATION DUE: %s (%s) — due %s (%d days)\n", $1, $2, $3, diff_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{equipment_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
equipment_csv_path:
|
|
29
|
+
default: "./equipment-calibration.csv"
|
|
30
|
+
description: "Path to a CSV of tracked equipment with columns: equipment_name,equipment_id,calibration_due_date (YYYY-MM-DD)."
|
|
31
|
+
warn_days_before:
|
|
32
|
+
default: 30
|
|
33
|
+
description: How many days before the calibration due date to start warning.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Assumes a maintained CSV export from your biomedical equipment tracking system, updated whenever a unit is calibrated or newly deployed.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: referral-pending-followup-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Pending Referral Follow-up Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks outbound specialist referrals that haven't been scheduled or
|
|
6
|
+
completed within a set window and flags them for follow-up. Use this
|
|
7
|
+
if a patient has ever fallen through the cracks after being referred
|
|
8
|
+
out, with nobody confirming they actually got the appointment.
|
|
9
|
+
category: healthcare
|
|
10
|
+
tags: [referrals, follow-up, care-coordination, compliance]
|
|
11
|
+
schedule: "0 8 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v days="{{stale_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 != "" {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline sent_epoch; close(cmd);
|
|
22
|
+
pending_days = (today - sent_epoch) / 86400;
|
|
23
|
+
if (pending_days >= days) {
|
|
24
|
+
printf "STALE REFERRAL: %s -> %s sent %s (%d days pending, no scheduled date)\n", $1, $2, $3, pending_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{referrals_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
referrals_csv_path:
|
|
30
|
+
default: "./referrals.csv"
|
|
31
|
+
description: "Path to a CSV with columns: patient_name,specialist_name,referral_sent_date (YYYY-MM-DD),scheduled_date (blank if not yet scheduled)."
|
|
32
|
+
stale_days:
|
|
33
|
+
default: 14
|
|
34
|
+
description: Days since a referral was sent, with no scheduled date, before it's flagged.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Assumes a maintained CSV export of outbound referrals from your EHR or referral-tracking system; adjust columns to match your export.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: job-posting-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Job Posting Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks open job postings against their planned expiry or repost date and
|
|
6
|
+
flags any that have gone stale on a job board. Use this if a posting has
|
|
7
|
+
ever sat expired for weeks before anyone noticed applications had quietly
|
|
8
|
+
stopped coming in.
|
|
9
|
+
category: hiring
|
|
10
|
+
tags: [hiring, recruiting, job-postings]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v stale="{{stale_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
cmd = "date -d \"" $4 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $4 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline expiry_epoch; close(cmd);
|
|
21
|
+
if (expiry_epoch != "" && expiry_epoch <= today) {
|
|
22
|
+
printf "EXPIRED: %s on %s — expired %s\n", $1, $2, $4;
|
|
23
|
+
next;
|
|
24
|
+
}
|
|
25
|
+
cmd2 = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
26
|
+
cmd2 | getline posted_epoch; close(cmd2);
|
|
27
|
+
posted_days = (today - posted_epoch) / 86400;
|
|
28
|
+
if (posted_days >= stale) {
|
|
29
|
+
printf "STALE: %s on %s — posted %d days ago (%s)\n", $1, $2, posted_days, $3;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
' "{{postings_csv_path}}"
|
|
33
|
+
variables:
|
|
34
|
+
postings_csv_path:
|
|
35
|
+
default: "./job-postings.csv"
|
|
36
|
+
description: "Path to a CSV of active postings with columns: posting_title,job_board,posted_date,expiry_date (YYYY-MM-DD, expiry_date may be blank)."
|
|
37
|
+
stale_days:
|
|
38
|
+
default: 30
|
|
39
|
+
description: Days since posting before a posting with no expiry date is flagged as stale.
|
|
40
|
+
compatible_agents: [generic, claude, codex]
|
|
41
|
+
notes: Assumes a CSV export of active postings from your ATS or job board account; re-posting requirements vary by board (LinkedIn, Indeed) so confirm before reposting.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: reference-check-overdue-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Reference Check Overdue Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Checks candidates whose reference checks were requested but never came
|
|
6
|
+
back within a set window and flags them so recruiters can chase them
|
|
7
|
+
down. Use this if an offer has ever stalled because a reference check
|
|
8
|
+
quietly sat unanswered for weeks.
|
|
9
|
+
category: hiring
|
|
10
|
+
tags: [hiring, recruiting, references, follow-up]
|
|
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 days="{{overdue_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 != "" {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline requested_epoch; close(cmd);
|
|
22
|
+
pending_days = (today - requested_epoch) / 86400;
|
|
23
|
+
if (pending_days >= days) {
|
|
24
|
+
printf "OVERDUE: %s — reference from %s requested %s (%d days, no response)\n", $1, $2, $3, pending_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{reference_checks_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
reference_checks_csv_path:
|
|
30
|
+
default: "./reference-checks.csv"
|
|
31
|
+
description: "Path to a CSV with columns: candidate_name,referrer_name,requested_date (YYYY-MM-DD),completed_date (blank if not yet received)."
|
|
32
|
+
overdue_days:
|
|
33
|
+
default: 7
|
|
34
|
+
description: Days since a reference check was requested, with no completion date, before it's flagged.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Assumes a CSV export of reference-check requests from your ATS; distinct from background-check-status-check, which tracks third-party background screening rather than personal/professional references.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
id: gutter-cleaning-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: Gutter Cleaning Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Reminds you to clean out your gutters based on how long it's been
|
|
6
|
+
since the last cleaning. Use this if you've ever noticed water
|
|
7
|
+
overflowing or plants sprouting in your gutters because it had been
|
|
8
|
+
way longer than you thought.
|
|
9
|
+
category: home
|
|
10
|
+
tags: [home, maintenance, gutters, seasonal]
|
|
11
|
+
schedule: "0 9 1 * *"
|
|
12
|
+
timezone: "America/Los_Angeles"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
last={{last_cleaned_date}}; interval={{interval_months}};
|
|
16
|
+
last_epoch=$(date -j -f %Y-%m-%d "$last" +%s 2>/dev/null || date -d "$last" +%s);
|
|
17
|
+
today_epoch=$(date +%s);
|
|
18
|
+
days_since=$(( (today_epoch-last_epoch)/86400 ));
|
|
19
|
+
interval_days=$(( interval * 30 ));
|
|
20
|
+
if [ "$days_since" -ge "$interval_days" ]; then echo "REMINDER: gutters last cleaned $days_since day(s) ago (every ${interval} months) — clean them.";
|
|
21
|
+
else echo "OK: gutters cleaned $days_since day(s) ago, due again around day $interval_days."; fi
|
|
22
|
+
variables:
|
|
23
|
+
last_cleaned_date:
|
|
24
|
+
default: "2026-01-01"
|
|
25
|
+
description: Date (YYYY-MM-DD) you last cleaned the gutters — update this yourself.
|
|
26
|
+
interval_months:
|
|
27
|
+
default: 6
|
|
28
|
+
description: How often to clean the gutters, in months.
|
|
29
|
+
compatible_agents: [generic, claude, codex]
|
|
30
|
+
notes: Zero-token. You update last_cleaned_date yourself each time you actually clean them; adjust interval_months if you have heavy tree cover.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: utility-bill-anomaly-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Utility Bill Anomaly Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares each newly logged utility bill against your recent average for
|
|
6
|
+
that utility and flags a reading that spikes well beyond normal. Use this
|
|
7
|
+
if a bill has ever jumped because of a hidden leak or a device left
|
|
8
|
+
running, and you only found out once the bill arrived.
|
|
9
|
+
category: home
|
|
10
|
+
tags: [home, utilities, budgeting, anomaly]
|
|
11
|
+
schedule: "0 9 5 * *"
|
|
12
|
+
timezone: "America/Los_Angeles"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v threshold="{{spike_threshold_pct}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{ util=$2; amt=$3+0; count[util]++; sum[util]+=amt; last[util]=amt; lastdate[util]=$1; }
|
|
18
|
+
END {
|
|
19
|
+
for (u in count) {
|
|
20
|
+
if (count[u] < 2) continue;
|
|
21
|
+
avg = (sum[u] - last[u]) / (count[u] - 1);
|
|
22
|
+
if (avg > 0 && last[u] >= avg * (1 + threshold / 100)) {
|
|
23
|
+
printf "SPIKE: %s bill on %s was %.2f, vs recent average %.2f\n", u, lastdate[u], last[u], avg;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{utility_bills_csv}}"
|
|
28
|
+
variables:
|
|
29
|
+
utility_bills_csv:
|
|
30
|
+
default: "utility-bills.csv"
|
|
31
|
+
description: "CSV with header row, columns: date(YYYY-MM-DD),utility,amount. Rows must be in chronological order per utility."
|
|
32
|
+
spike_threshold_pct:
|
|
33
|
+
default: 25
|
|
34
|
+
description: Percent above the recent average that counts as a spike.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Add a row to utility-bills.csv each time a bill arrives; needs at least a few months of history per utility before the average is meaningful.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: housekeeping-turnover-time-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Housekeeping Turnover Time Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks logged checkout and room-ready timestamps and flags any room whose
|
|
6
|
+
turnover took longer than your target window, or is still missing a
|
|
7
|
+
ready time. Use this if a room has ever still been mid-clean when the
|
|
8
|
+
next guest arrived because nobody was tracking turnover times.
|
|
9
|
+
category: hospitality
|
|
10
|
+
tags: [hospitality, housekeeping, operations]
|
|
11
|
+
schedule: "0 */2 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
now=$(date +%s);
|
|
16
|
+
awk -F',' -v now="$now" -v max="{{max_turnover_minutes}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
room=$1; checkout=$2; ready=$3;
|
|
20
|
+
cmd = "date -d \"" checkout "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" checkout "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline checkout_epoch; close(cmd);
|
|
22
|
+
if (ready == "") {
|
|
23
|
+
elapsed = (now - checkout_epoch) / 60;
|
|
24
|
+
if (elapsed >= max) printf "OVERDUE: room %s checked out %s, still not marked ready (%d min)\n", room, checkout, elapsed;
|
|
25
|
+
next;
|
|
26
|
+
}
|
|
27
|
+
cmd2 = "date -d \"" ready "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" ready "\" +%s 2>/dev/null";
|
|
28
|
+
cmd2 | getline ready_epoch; close(cmd2);
|
|
29
|
+
turnover = (ready_epoch - checkout_epoch) / 60;
|
|
30
|
+
if (turnover > max) printf "SLOW TURNOVER: room %s took %d min (checkout %s, ready %s)\n", room, turnover, checkout, ready;
|
|
31
|
+
}
|
|
32
|
+
' "{{turnover_log_csv}}"
|
|
33
|
+
variables:
|
|
34
|
+
turnover_log_csv:
|
|
35
|
+
default: "turnover-log.csv"
|
|
36
|
+
description: "CSV with header row, columns: room_number,checkout_time,ready_time (YYYY-MM-DD HH:MM, ready_time blank if not yet marked ready)."
|
|
37
|
+
max_turnover_minutes:
|
|
38
|
+
default: 45
|
|
39
|
+
description: Target minutes from checkout to room-ready before a room is flagged.
|
|
40
|
+
compatible_agents: [generic, claude, codex]
|
|
41
|
+
notes: Assumes housekeeping logs checkout_time and ready_time per room to a shared CSV or PMS export throughout the day.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: lost-and-found-item-aging-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Lost and Found Item Aging Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks logged lost-and-found items against your retention policy and
|
|
6
|
+
flags any that are old enough to donate, discard, or ship back to a
|
|
7
|
+
guest. Use this if a lost-and-found closet has ever turned into a pile
|
|
8
|
+
nobody knows what to do with because items just sat there indefinitely.
|
|
9
|
+
category: hospitality
|
|
10
|
+
tags: [hospitality, lost-and-found, guest-services, compliance]
|
|
11
|
+
schedule: "0 7 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v days="{{retention_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 != "" {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline found_epoch; close(cmd);
|
|
22
|
+
age_days = (today - found_epoch) / 86400;
|
|
23
|
+
if (age_days >= days) {
|
|
24
|
+
printf "AGED OUT: %s (room %s) found %s (%d days, unclaimed) — dispose or donate per policy\n", $1, $2, $3, age_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{lost_found_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
lost_found_csv_path:
|
|
30
|
+
default: "./lost-and-found.csv"
|
|
31
|
+
description: "Path to a CSV with columns: item_description,room_or_area,found_date (YYYY-MM-DD),claimed_date (blank if still unclaimed)."
|
|
32
|
+
retention_days:
|
|
33
|
+
default: 90
|
|
34
|
+
description: Days an item can sit unclaimed before it's flagged as past your retention policy.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: Assumes a maintained CSV log of found items from front desk/housekeeping; check local law on retention periods for items of value (cash, electronics, IDs) before disposing.
|