@wonsukchoi/crondex 0.18.0 → 0.19.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 +39 -39
  2. package/catalog.json +979 -33
  3. package/jobs/agriculture/grain-storage-temperature-check.yaml +34 -0
  4. package/jobs/automotive/warranty-claim-deadline-check.yaml +35 -0
  5. package/jobs/childcare/allergy-action-plan-expiry-check.yaml +34 -0
  6. package/jobs/construction/material-delivery-delay-check.yaml +32 -0
  7. package/jobs/creator/brand-deal-payment-followup-check.yaml +32 -0
  8. package/jobs/crypto/stablecoin-peg-deviation-watch.yaml +33 -0
  9. package/jobs/ecommerce/shipping-delay-check.yaml +31 -0
  10. package/jobs/education/overdue-library-materials-check.yaml +34 -0
  11. package/jobs/events/speaker-confirmation-deadline-check.yaml +35 -0
  12. package/jobs/fitness/locker-rental-expiry-check.yaml +35 -0
  13. package/jobs/fleet/fleet-insurance-expiry-check.yaml +34 -0
  14. package/jobs/gaming/game-server-disk-space-check.yaml +34 -0
  15. package/jobs/government/public-comment-period-closing-check.yaml +35 -0
  16. package/jobs/growth/seat-utilization-upsell-check.yaml +34 -0
  17. package/jobs/healthcare/medical-equipment-calibration-check.yaml +35 -0
  18. package/jobs/hiring/job-posting-expiry-check.yaml +41 -0
  19. package/jobs/home/utility-bill-anomaly-check.yaml +36 -0
  20. package/jobs/hospitality/housekeeping-turnover-time-check.yaml +41 -0
  21. package/jobs/hr/i9-reverification-deadline-check.yaml +36 -0
  22. package/jobs/insurance/beneficiary-designation-review-reminder.yaml +35 -0
  23. package/jobs/inventory/supplier-lead-time-drift-check.yaml +34 -0
  24. package/jobs/investing/bond-cd-maturity-reminder.yaml +31 -0
  25. package/jobs/learning/practice-streak-check.yaml +33 -0
  26. package/jobs/legal/business-license-renewal-check.yaml +37 -0
  27. package/jobs/logistics/port-congestion-watch.yaml +34 -0
  28. package/jobs/manufacturing/equipment-calibration-due-check.yaml +32 -0
  29. package/jobs/marketing/newsletter-unsubscribe-spike-check.yaml +37 -0
  30. package/jobs/nonprofit/event-rsvp-shortfall-check.yaml +40 -0
  31. package/jobs/podcast/transcript-publish-lag-check.yaml +31 -0
  32. package/jobs/realestate/hoa-fee-collection-check.yaml +35 -0
  33. package/jobs/restaurant/supplier-price-increase-watch.yaml +36 -0
  34. package/jobs/retail/markdown-aging-inventory-check.yaml +33 -0
  35. package/jobs/sales/proposal-followup-nudge.yaml +31 -0
  36. package/jobs/support/macro-usage-staleness-check.yaml +33 -0
  37. package/jobs/team/expense-report-deadline-reminder.yaml +28 -0
  38. package/jobs/travel/hotel-cancellation-deadline-reminder.yaml +32 -0
  39. package/jobs/veterinary/medication-inventory-expiry-check.yaml +31 -0
  40. package/jobs/warehousing/returns-processing-backlog-check.yaml +33 -0
  41. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ id: grain-storage-temperature-check
2
+ version: 1
3
+ name: Grain Storage Temperature Check
4
+ description: >
5
+ Checks logged grain bin temperature and moisture readings against safe
6
+ storage thresholds and flags any bin trending toward spoilage. Use this
7
+ if you've ever caught hot spots or mold in stored grain only after the
8
+ smell gave it away.
9
+ category: agriculture
10
+ tags: [agriculture, grain, storage, spoilage]
11
+ schedule: "0 6 * * *"
12
+ timezone: "America/Chicago"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' -v maxtemp="{{max_temp_f}}" -v maxmoist="{{max_moisture_pct}}" '
16
+ NR==1 {next}
17
+ {
18
+ if ($2+0 > maxtemp+0 || $3+0 > maxmoist+0) {
19
+ printf "ALERT: bin %s — %.1f°F, %.1f%% moisture (limits %s°F / %s%%)\n", $1, $2, $3, maxtemp, maxmoist;
20
+ }
21
+ }
22
+ ' "{{bin_readings_csv_path}}"
23
+ variables:
24
+ bin_readings_csv_path:
25
+ default: "./grain-bin-readings.csv"
26
+ description: "Path to a CSV with columns: bin_id,temperature_f,moisture_pct."
27
+ max_temp_f:
28
+ default: 70
29
+ description: Temperature (F) above which a bin is flagged as a spoilage risk.
30
+ max_moisture_pct:
31
+ default: 15
32
+ description: Moisture percentage above which a bin is flagged as a spoilage risk.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: Reads whatever your bin sensor system exports to CSV — point bin_readings_csv_path at that export. Safe thresholds vary by grain type; adjust the defaults accordingly.
@@ -0,0 +1,35 @@
1
+ id: warranty-claim-deadline-check
2
+ version: 1
3
+ name: Warranty Claim Deadline Check
4
+ description: >
5
+ Checks open warranty claims against the manufacturer's submission
6
+ deadline and flags any about to expire unfiled. Use this if a claim has
7
+ ever gone unpaid because it was submitted a day past the manufacturer's
8
+ filing window.
9
+ category: automotive
10
+ tags: [automotive, warranty, claims, deadline]
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 warn="{{warn_days_before}}" '
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 deadline_epoch; close(cmd);
21
+ days_left = (deadline_epoch - today) / 86400;
22
+ if (days_left <= warn) {
23
+ printf "DEADLINE: claim %s for RO %s — due %s (%d days left)\n", $1, $2, $3, days_left;
24
+ }
25
+ }
26
+ ' "{{warranty_claims_csv_path}}"
27
+ variables:
28
+ warranty_claims_csv_path:
29
+ default: "./warranty-claims.csv"
30
+ description: "Path to a CSV with columns: claim_id,ro_number,filing_deadline (YYYY-MM-DD),status (open/submitted)."
31
+ warn_days_before:
32
+ default: 5
33
+ description: Days before the filing deadline to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Filing deadlines vary by manufacturer — keep warranty-claims.csv current from your DMS/warranty system export.
@@ -0,0 +1,34 @@
1
+ id: allergy-action-plan-expiry-check
2
+ version: 1
3
+ name: Allergy Action Plan Expiry Check
4
+ description: >
5
+ Checks each child's allergy action plan against its annual renewal date
6
+ and warns before it lapses. Use this if a plan has ever gone stale
7
+ without anyone noticing until an incident made it obvious.
8
+ category: childcare
9
+ tags: [childcare, allergy, health, compliance]
10
+ schedule: "0 8 * * 1"
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 \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
18
+ cmd | getline expiry_epoch; close(cmd);
19
+ "date +%s" | getline now_epoch; close("date +%s");
20
+ diff_days = (expiry_epoch - now_epoch) / 86400;
21
+ if (diff_days <= days) {
22
+ printf "EXPIRING: %s — allergy action plan expires %s (%d days)\n", $1, $2, diff_days;
23
+ }
24
+ }
25
+ ' "{{allergy_plans_csv_path}}"
26
+ variables:
27
+ allergy_plans_csv_path:
28
+ default: "./allergy-action-plans.csv"
29
+ description: "Path to a CSV with columns: child_name,plan_expiry_date (YYYY-MM-DD)."
30
+ warn_days_before:
31
+ default: 30
32
+ description: How many days before a plan expires to start warning.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: A lapsed plan means staff no longer have a current, doctor-signed protocol on file — treat this as a same-week fix, not a queue item.
@@ -0,0 +1,32 @@
1
+ id: material-delivery-delay-check
2
+ version: 1
3
+ name: Material Delivery Delay Check
4
+ description: >
5
+ Checks ordered construction materials against their expected delivery
6
+ date and flags anything overdue from the supplier. Use this if a crew
7
+ has ever stood idle on site because a material delivery was quietly
8
+ late and nobody chased it up.
9
+ category: construction
10
+ tags: [construction, materials, delivery, supplier]
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
+ $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 expected_epoch; close(cmd);
21
+ if (today > expected_epoch) {
22
+ overdue_days = (today - expected_epoch) / 86400;
23
+ printf "OVERDUE: %s for job %s — expected %s (%d days late)\n", $1, $2, $3, overdue_days;
24
+ }
25
+ }
26
+ ' "{{material_orders_csv_path}}"
27
+ variables:
28
+ material_orders_csv_path:
29
+ default: "./material-orders.csv"
30
+ description: "Path to a CSV with columns: material_name,job_site,expected_delivery_date (YYYY-MM-DD),status (pending/delivered)."
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Follow up directly with the supplier once flagged overdue — this job only surfaces the gap, it doesn't contact anyone.
@@ -0,0 +1,32 @@
1
+ id: brand-deal-payment-followup-check
2
+ version: 1
3
+ name: Brand Deal Payment Followup Check
4
+ description: >
5
+ Checks sponsor invoices against their agreed payment due date and flags
6
+ anything overdue and unpaid. Use this if a sponsor has ever gone quiet
7
+ on an invoice and you only noticed the payment never showed up weeks
8
+ later.
9
+ category: creator
10
+ tags: [creator, sponsorship, invoicing, payment]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" '
17
+ NR==1 {next}
18
+ $4 == "unpaid" {
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
+ if (today > due_epoch) {
22
+ overdue_days = (today - due_epoch) / 86400;
23
+ printf "OVERDUE: invoice %s to %s — due %s (%d days late)\n", $1, $2, $3, overdue_days;
24
+ }
25
+ }
26
+ ' "{{sponsor_invoices_csv_path}}"
27
+ variables:
28
+ sponsor_invoices_csv_path:
29
+ default: "./sponsor-invoices.csv"
30
+ description: "Path to a CSV with columns: invoice_id,sponsor_name,due_date (YYYY-MM-DD),status (unpaid/paid)."
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Send the actual follow-up email yourself once flagged — this job only surfaces which invoices are overdue.
@@ -0,0 +1,33 @@
1
+ id: stablecoin-peg-deviation-watch
2
+ version: 1
3
+ name: Stablecoin Peg Deviation Watch
4
+ description: >
5
+ Checks a stablecoin's market price against its $1 peg and alerts when it
6
+ drifts beyond your threshold. Use this if you've ever held a "stable"
7
+ balance through a depeg event because nothing was watching the price.
8
+ category: crypto
9
+ tags: [crypto, stablecoin, peg, price]
10
+ schedule: "*/30 * * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ price=$(curl -s "https://api.coingecko.com/api/v3/simple/price?ids={{coingecko_id}}&vs_currencies=usd" |
15
+ grep -o '"usd":[0-9.]*' | grep -o '[0-9.]*$');
16
+ if [ -n "$price" ]; then
17
+ awk -v p="$price" -v dev="{{deviation_pct}}" 'BEGIN{
18
+ diff = (p-1)*100; if (diff < 0) diff = -diff;
19
+ printf "Current price: $%.4f\n", p;
20
+ if (diff >= dev+0) printf "DEPEG ALERT: %.2f%% off $1 peg\n", diff;
21
+ }';
22
+ else
23
+ echo "Could not fetch price — check coingecko_id.";
24
+ fi
25
+ variables:
26
+ coingecko_id:
27
+ default: "usd-coin"
28
+ description: CoinGecko API id for the stablecoin to track (e.g. "usd-coin", "tether").
29
+ deviation_pct:
30
+ default: 1
31
+ description: Percentage deviation from the $1 peg that triggers an alert.
32
+ compatible_agents: [generic, claude, codex]
33
+ notes: Uses CoinGecko's free public API — no key required, but rate limits apply if you increase the schedule frequency.
@@ -0,0 +1,31 @@
1
+ id: shipping-delay-check
2
+ version: 1
3
+ name: Shipping Delay Check
4
+ description: >
5
+ Checks shipped orders against their expected delivery date and flags
6
+ anything running late. Use this if a customer has ever emailed asking
7
+ "where's my order" before you had any idea it was already late.
8
+ category: ecommerce
9
+ tags: [ecommerce, shipping, fulfillment, delivery]
10
+ schedule: "0 8 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F',' -v today="$today" '
16
+ NR==1 {next}
17
+ $4 == "in_transit" {
18
+ cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
19
+ cmd | getline expected_epoch; close(cmd);
20
+ if (today > expected_epoch) {
21
+ overdue_days = (today - expected_epoch) / 86400;
22
+ printf "LATE: order %s — expected %s (%d days late), tracking %s\n", $1, $3, overdue_days, $2;
23
+ }
24
+ }
25
+ ' "{{shipments_csv_path}}"
26
+ variables:
27
+ shipments_csv_path:
28
+ default: "./shipments.csv"
29
+ description: "Path to a CSV with columns: order_id,tracking_number,expected_delivery_date (YYYY-MM-DD),status (in_transit/delivered)."
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: Reads whatever your fulfillment platform exports to CSV — point shipments_csv_path at that export.
@@ -0,0 +1,34 @@
1
+ id: overdue-library-materials-check
2
+ version: 1
3
+ name: Overdue Library Materials Check
4
+ description: >
5
+ Scans checked-out library items and flags anything past its due date by
6
+ more than a grace period. Use this if overdue textbooks or library books
7
+ have ever piled up unnoticed until inventory time.
8
+ category: education
9
+ tags: [education, library, overdue]
10
+ schedule: "0 8 * * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ awk -F',' -v graceDays="{{grace_days}}" '
15
+ NR==1 {next}
16
+ $3 == "no" {
17
+ cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
18
+ cmd | getline due_epoch; close(cmd);
19
+ "date +%s" | getline now_epoch; close("date +%s");
20
+ diff_days = (now_epoch - due_epoch) / 86400;
21
+ if (diff_days >= graceDays) {
22
+ printf "OVERDUE: %s — due %s (%d days overdue)\n", $1, $2, diff_days;
23
+ }
24
+ }
25
+ ' "{{checkouts_csv_path}}"
26
+ variables:
27
+ checkouts_csv_path:
28
+ default: "./library-checkouts.csv"
29
+ description: "Path to a CSV with columns: item_title,due_date (YYYY-MM-DD),returned (yes/no)."
30
+ grace_days:
31
+ default: 3
32
+ description: Days past the due date before an item is flagged as overdue.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: Update the returned column as soon as items come back, or every returned item will keep showing up as overdue.
@@ -0,0 +1,35 @@
1
+ id: speaker-confirmation-deadline-check
2
+ version: 1
3
+ name: Speaker Confirmation Deadline Check
4
+ description: >
5
+ Checks the speaker/presenter list against each person's confirm-by date
6
+ and flags anyone who hasn't confirmed yet. Use this if an event has ever
7
+ gotten close with a session slot still unconfirmed and nobody noticed
8
+ until the program had to go to print.
9
+ category: events
10
+ tags: [events, speakers, confirmation]
11
+ schedule: "0 9 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' -v days="{{warn_days_before}}" '
16
+ NR==1 {next}
17
+ $3 == "no" {
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 "UNCONFIRMED: %s — confirm by %s (%d days)\n", $1, $2, diff_days;
24
+ }
25
+ }
26
+ ' "{{speakers_csv_path}}"
27
+ variables:
28
+ speakers_csv_path:
29
+ default: "./event-speakers.csv"
30
+ description: "Path to a CSV with columns: speaker_name,confirm_by_date (YYYY-MM-DD),confirmed (yes/no)."
31
+ warn_days_before:
32
+ default: 7
33
+ description: How many days before the confirm-by date to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Chase unconfirmed speakers early — an empty session slot is much harder to fill a few days out than a few weeks out.
@@ -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,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: 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,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,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: 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.