@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.
Files changed (41) hide show
  1. package/README.md +41 -40
  2. package/catalog.json +956 -5
  3. package/jobs/agriculture/field-soil-test-due-reminder.yaml +35 -0
  4. package/jobs/automotive/fleet-inspection-expiry-check.yaml +35 -0
  5. package/jobs/childcare/classroom-supply-low-stock-check.yaml +28 -0
  6. package/jobs/construction/crew-safety-cert-expiry-check.yaml +35 -0
  7. package/jobs/creator/affiliate-link-expiry-check.yaml +35 -0
  8. package/jobs/crypto/nft-floor-price-watch.yaml +37 -0
  9. package/jobs/ecommerce/coupon-code-expiry-check.yaml +36 -0
  10. package/jobs/education/tuition-payment-plan-delinquency-check.yaml +35 -0
  11. package/jobs/events/post-event-survey-response-rate-watch.yaml +39 -0
  12. package/jobs/fitness/class-waitlist-overflow-check.yaml +31 -0
  13. package/jobs/fleet/vehicle-idle-time-check.yaml +31 -0
  14. package/jobs/gaming/player-contract-renewal-check.yaml +35 -0
  15. package/jobs/government/public-records-retention-purge-check.yaml +32 -0
  16. package/jobs/growth/onboarding-completion-stall-check.yaml +38 -0
  17. package/jobs/healthcare/referral-pending-followup-check.yaml +36 -0
  18. package/jobs/hiring/reference-check-overdue-reminder.yaml +36 -0
  19. package/jobs/home/gutter-cleaning-reminder.yaml +30 -0
  20. package/jobs/hospitality/lost-and-found-item-aging-check.yaml +36 -0
  21. package/jobs/hr/probation-period-review-reminder.yaml +36 -0
  22. package/jobs/insurance/endorsement-request-followup-check.yaml +37 -0
  23. package/jobs/inventory/purchase-order-receiving-delay-check.yaml +33 -0
  24. package/jobs/investing/dca-contribution-reminder.yaml +33 -0
  25. package/jobs/learning/webinar-attendance-reminder.yaml +32 -0
  26. package/jobs/legal/patent-maintenance-fee-reminder.yaml +35 -0
  27. package/jobs/logistics/driver-hos-compliance-check.yaml +38 -0
  28. package/jobs/manufacturing/energy-consumption-spike-check.yaml +37 -0
  29. package/jobs/marketing/broken-campaign-link-check.yaml +31 -0
  30. package/jobs/nonprofit/donation-acknowledgment-lag-check.yaml +32 -0
  31. package/jobs/podcast/rss-feed-health-check.yaml +25 -0
  32. package/jobs/realestate/insurance-policy-renewal-reminder.yaml +31 -0
  33. package/jobs/restaurant/walk-in-cooler-temp-log-check.yaml +31 -0
  34. package/jobs/retail/loyalty-points-expiry-reminder.yaml +31 -0
  35. package/jobs/sales/quote-expiry-reminder.yaml +24 -0
  36. package/jobs/support/knowledge-base-article-staleness-check.yaml +39 -0
  37. package/jobs/team/new-hire-onboarding-task-check.yaml +32 -0
  38. package/jobs/travel/flight-layover-buffer-check.yaml +35 -0
  39. package/jobs/veterinary/lab-result-turnaround-check.yaml +35 -0
  40. package/jobs/warehousing/pallet-putaway-delay-check.yaml +35 -0
  41. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ id: field-soil-test-due-reminder
2
+ version: 1
3
+ name: Field Soil Test Due Reminder
4
+ description: >
5
+ Checks each field's last soil test date against a retest interval and
6
+ flags any field that's overdue. Use this if you've ever applied
7
+ fertilizer off a soil test that was two years stale because nobody was
8
+ tracking when each field was last sampled.
9
+ category: agriculture
10
+ tags: [agriculture, soil, testing, fields]
11
+ schedule: "0 7 1 * *"
12
+ timezone: "America/Chicago"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v interval="{{retest_interval_days}}" -v today="$today" '
17
+ NR==1 {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 last_ts; close(cmd);
21
+ days_since = (today - last_ts) / 86400;
22
+ if (days_since > interval) {
23
+ printf "OVERDUE: %s — last tested %s (%d days ago)\n", $1, $2, days_since;
24
+ }
25
+ }
26
+ ' "{{fields_csv_path}}"
27
+ variables:
28
+ fields_csv_path:
29
+ default: "./fields.csv"
30
+ description: "Path to a CSV with columns: field_name,last_soil_test_date (YYYY-MM-DD)."
31
+ retest_interval_days:
32
+ default: 730
33
+ description: Days allowed between soil tests before a field counts as overdue (default ~2 years).
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Keep fields.csv updated whenever a new soil sample comes back from the lab — one row per field.
@@ -0,0 +1,35 @@
1
+ id: fleet-inspection-expiry-check
2
+ version: 1
3
+ name: Fleet Inspection Expiry Check
4
+ description: >
5
+ Checks each fleet vehicle's state inspection or emissions sticker expiry
6
+ date and flags anything expiring soon. Use this if a shop or fleet
7
+ vehicle has ever gotten pulled over — or failed a customer handoff —
8
+ because its inspection quietly lapsed.
9
+ category: automotive
10
+ tags: [automotive, fleet, inspection, compliance]
11
+ schedule: "0 8 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v warn="{{warn_days}}" -v today="$today" '
17
+ NR==1 {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 exp_ts; close(cmd);
21
+ days_left = (exp_ts - today) / 86400;
22
+ if (days_left <= warn) {
23
+ printf "WARNING: vehicle %s — inspection expires %s (%d days left)\n", $1, $2, days_left;
24
+ }
25
+ }
26
+ ' "{{fleet_csv_path}}"
27
+ variables:
28
+ fleet_csv_path:
29
+ default: "./fleet-inspections.csv"
30
+ description: "Path to a CSV with columns: vehicle_id,inspection_expiry_date (YYYY-MM-DD)."
31
+ warn_days:
32
+ default: 21
33
+ description: Days before expiry to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Update fleet-inspections.csv whenever a vehicle is re-inspected — one row per vehicle in the fleet.
@@ -0,0 +1,28 @@
1
+ id: classroom-supply-low-stock-check
2
+ version: 1
3
+ name: Classroom Supply Low Stock Check
4
+ description: >
5
+ Checks consumable classroom supplies like diapers, wipes, and formula
6
+ against a reorder threshold per item and flags anything running low.
7
+ Use this if a classroom has ever run out of diapers or wipes mid-day
8
+ because nobody noticed the shelf was nearly empty.
9
+ category: childcare
10
+ tags: [childcare, supplies, inventory, classroom]
11
+ schedule: "0 7 * * 1,4"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' '
16
+ NR==1 {next}
17
+ {
18
+ if ($2+0 <= $3+0) {
19
+ printf "LOW STOCK: %s — %d on hand (reorder at %d)\n", $1, $2, $3;
20
+ }
21
+ }
22
+ ' "{{supplies_csv_path}}"
23
+ variables:
24
+ supplies_csv_path:
25
+ default: "./classroom-supplies.csv"
26
+ description: "Path to a CSV with columns: item_name,current_stock,reorder_threshold."
27
+ compatible_agents: [generic, claude, codex]
28
+ notes: Update classroom-supplies.csv whenever a supply count is taken — one row per consumable item tracked.
@@ -0,0 +1,35 @@
1
+ id: crew-safety-cert-expiry-check
2
+ version: 1
3
+ name: Crew Safety Certification Expiry Check
4
+ description: >
5
+ Checks each crew member's safety certifications, like OSHA 10/30 or
6
+ forklift operator cards, against their expiry date and flags anyone
7
+ lapsing soon. Use this if a worker has ever been pulled off a site
8
+ because their safety card expired and nobody caught it beforehand.
9
+ category: construction
10
+ tags: [construction, safety, certification, crew]
11
+ schedule: "0 7 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v warn="{{warn_days}}" -v today="$today" '
17
+ NR==1 {next}
18
+ {
19
+ cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
20
+ cmd | getline exp_ts; close(cmd);
21
+ days_left = (exp_ts - today) / 86400;
22
+ if (days_left <= warn) {
23
+ printf "WARNING: %s — %s expires %s (%d days left)\n", $1, $2, $3, days_left;
24
+ }
25
+ }
26
+ ' "{{crew_certs_csv_path}}"
27
+ variables:
28
+ crew_certs_csv_path:
29
+ default: "./crew-safety-certs.csv"
30
+ description: "Path to a CSV with columns: worker_name,cert_name,expiry_date (YYYY-MM-DD)."
31
+ warn_days:
32
+ default: 30
33
+ description: Days before expiry to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Distinct from subcontractor-insurance-expiry-check — this tracks your own crew's individual safety cards, not a sub's company insurance policy.
@@ -0,0 +1,35 @@
1
+ id: affiliate-link-expiry-check
2
+ version: 1
3
+ name: Affiliate Link Expiry Check
4
+ description: >
5
+ Checks affiliate links and discount codes in your published content
6
+ against their expiry date and flags anything expiring soon. Use this if
7
+ a viewer has ever hit a dead discount code in an old video description
8
+ because nobody remembered to pull or update it before it lapsed.
9
+ category: creator
10
+ tags: [creator, affiliate, links, monetization]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v warn="{{warn_days}}" -v today="$today" '
17
+ NR==1 {next}
18
+ {
19
+ cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
20
+ cmd | getline exp_ts; close(cmd);
21
+ days_left = (exp_ts - today) / 86400;
22
+ if (days_left <= warn) {
23
+ printf "WARNING: code %s (%s) expires %s (%d days left)\n", $1, $2, $3, days_left;
24
+ }
25
+ }
26
+ ' "{{affiliate_links_csv_path}}"
27
+ variables:
28
+ affiliate_links_csv_path:
29
+ default: "./affiliate-links.csv"
30
+ description: "Path to a CSV with columns: code_or_link,associated_post,expiry_date (YYYY-MM-DD)."
31
+ warn_days:
32
+ default: 14
33
+ description: Days before expiry to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Update affiliate-links.csv whenever you add a new sponsored link or code to a post — one row per tracked link.
@@ -0,0 +1,37 @@
1
+ id: nft-floor-price-watch
2
+ version: 1
3
+ name: NFT Floor Price Watch
4
+ description: >
5
+ Checks an NFT collection's floor price via a public marketplace API and
6
+ alerts if it drops below a threshold. Use this if you've ever wanted a
7
+ heads-up when a collection you hold or track dips below a price level
8
+ you care about, without staring at a marketplace tab all day.
9
+ category: crypto
10
+ tags: [crypto, nft, floor-price, marketplace]
11
+ schedule: "0 * * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ floor=$(curl -s -H "accept: application/json" "{{floor_price_api_url}}" |
16
+ grep -o '"floor_price":[0-9.]*' | head -1 | cut -d: -f2);
17
+ if [ -n "$floor" ]; then
18
+ echo "Floor price for {{collection_slug}}: $floor {{price_unit}}";
19
+ awk -v floor="$floor" -v min="{{min_floor_price}}" 'BEGIN{if (floor+0 < min+0) print "LOW FLOOR ALERT: below " min " " "{{price_unit}}" " threshold"}';
20
+ else
21
+ echo "Could not fetch floor price — check API URL/collection slug.";
22
+ fi
23
+ variables:
24
+ floor_price_api_url:
25
+ default: "https://api.opensea.io/api/v2/collections/{{collection_slug}}/stats"
26
+ description: Marketplace API endpoint returning a floor_price field for the collection.
27
+ collection_slug:
28
+ default: "your-collection-slug"
29
+ description: Marketplace slug/identifier for the NFT collection to watch.
30
+ min_floor_price:
31
+ default: 0.1
32
+ description: Floor price threshold below which to alert.
33
+ price_unit:
34
+ default: "ETH"
35
+ description: Unit the floor price is denominated in, for display only.
36
+ compatible_agents: [generic, claude, codex]
37
+ notes: Read-only public API call — some marketplace APIs require a free API key in a header; add it via a wrapper script or an authenticated endpoint if needed.
@@ -0,0 +1,36 @@
1
+ id: coupon-code-expiry-check
2
+ version: 1
3
+ name: Coupon Code Expiry Check
4
+ description: >
5
+ Checks active promo and coupon codes against their expiry date and flags
6
+ any expiring soon so you can decide to extend, replace, or let them
7
+ lapse on purpose. Use this if a customer has ever complained a code from
8
+ your last campaign stopped working and nobody on the team knew it had
9
+ quietly expired.
10
+ category: ecommerce
11
+ tags: [ecommerce, coupons, promotions, marketing]
12
+ schedule: "0 8 * * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ today=$(date +%s);
17
+ awk -F',' -v warn="{{warn_days}}" -v today="$today" '
18
+ NR==1 {next}
19
+ {
20
+ cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
21
+ cmd | getline exp_ts; close(cmd);
22
+ days_left = (exp_ts - today) / 86400;
23
+ if (days_left <= warn) {
24
+ printf "WARNING: code %s expires %s (%d days left)\n", $1, $2, days_left;
25
+ }
26
+ }
27
+ ' "{{coupons_csv_path}}"
28
+ variables:
29
+ coupons_csv_path:
30
+ default: "./coupons.csv"
31
+ description: "Path to a CSV with columns: coupon_code,expiry_date (YYYY-MM-DD)."
32
+ warn_days:
33
+ default: 7
34
+ description: Days before expiry to start warning.
35
+ compatible_agents: [generic, claude, codex]
36
+ notes: Update coupons.csv whenever a new promo code is created or an existing one is deactivated — one row per active code.
@@ -0,0 +1,35 @@
1
+ id: tuition-payment-plan-delinquency-check
2
+ version: 1
3
+ name: Tuition Payment Plan Delinquency Check
4
+ description: >
5
+ Checks tuition installment plans against their due dates and flags
6
+ accounts that have missed a payment. Use this if a family has ever
7
+ fallen behind on a payment plan for weeks before anyone in the office
8
+ noticed and followed up.
9
+ category: education
10
+ tags: [education, tuition, payments, billing]
11
+ schedule: "0 8 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' -v grace="{{grace_days}}" '
16
+ NR==1 {next}
17
+ $4 == "no" {
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 = (now_epoch - due_epoch) / 86400;
22
+ if (diff_days >= grace) {
23
+ printf "DELINQUENT: %s — installment $%s due %s (%d days overdue)\n", $1, $2, $3, diff_days;
24
+ }
25
+ }
26
+ ' "{{payment_plans_csv_path}}"
27
+ variables:
28
+ payment_plans_csv_path:
29
+ default: "./tuition-payment-plans.csv"
30
+ description: "Path to a CSV with columns: student_name,installment_amount,due_date (YYYY-MM-DD),paid (yes/no)."
31
+ grace_days:
32
+ default: 5
33
+ description: Days past the due date before an unpaid installment is flagged as delinquent.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Mark the paid column as soon as a payment clears, or a settled installment will keep showing up as delinquent.
@@ -0,0 +1,39 @@
1
+ id: post-event-survey-response-rate-watch
2
+ version: 1
3
+ name: Post-Event Survey Response Rate Watch
4
+ description: >
5
+ Compares how many attendees were sent a post-event survey against how
6
+ many actually responded, and flags events with a weak response rate.
7
+ Use this if you've ever sent a feedback survey after an event and had
8
+ no idea whether the response rate was normal or a sign nobody cared to
9
+ reply.
10
+ category: events
11
+ tags: [events, survey, feedback, response-rate]
12
+ schedule: "0 9 * * 1"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v min_pct="{{min_response_pct}}" '
17
+ NR==1 {next}
18
+ {
19
+ sent[$1] += 1;
20
+ if ($3 == "yes") responded[$1] += 1;
21
+ }
22
+ END {
23
+ for (event in sent) {
24
+ pct = (responded[event] / sent[event]) * 100;
25
+ if (pct < min_pct) {
26
+ printf "LOW RESPONSE RATE: %s — %d of %d responded (%.0f%%)\n", event, responded[event], sent[event], pct;
27
+ }
28
+ }
29
+ }
30
+ ' "{{survey_sends_csv_path}}"
31
+ variables:
32
+ survey_sends_csv_path:
33
+ default: "./event-survey-sends.csv"
34
+ description: "Path to a CSV with columns: event_name,attendee_email,responded (yes/no)."
35
+ min_response_pct:
36
+ default: 25
37
+ description: Minimum survey response percentage before an event is flagged as low-response.
38
+ compatible_agents: [generic, claude, codex]
39
+ notes: Update the responded column as replies come in — this only reads whatever the CSV currently reflects, it doesn't poll a survey tool directly.
@@ -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,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,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,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,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,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: 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.