@wonsukchoi/crondex 0.20.1 → 0.22.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 (121) hide show
  1. package/README.md +20 -30
  2. package/catalog.json +3052 -81
  3. package/jobs/ecommerce/affiliate-commission-payout-check.yaml +38 -0
  4. package/jobs/ecommerce/back-in-stock-notification-backlog-check.yaml +30 -0
  5. package/jobs/ecommerce/bundle-component-stock-mismatch-check.yaml +37 -0
  6. package/jobs/ecommerce/chargeback-fraud-risk-order-review.yaml +43 -0
  7. package/jobs/ecommerce/competitor-price-watch.yaml +60 -0
  8. package/jobs/ecommerce/economic-nexus-threshold-check.yaml +43 -0
  9. package/jobs/ecommerce/failed-payment-dunning-check.yaml +35 -0
  10. package/jobs/ecommerce/marketplace-listing-sync-drift-check.yaml +48 -0
  11. package/jobs/ecommerce/product-feed-health-check.yaml +35 -0
  12. package/jobs/ecommerce/purchase-order-overdue-check.yaml +32 -0
  13. package/jobs/ecommerce/storefront-ssl-domain-expiry-check.yaml +46 -0
  14. package/jobs/ecommerce/vip-tier-reclassification-check.yaml +55 -0
  15. package/jobs/ecommerce/wishlist-abandonment-check.yaml +37 -0
  16. package/jobs/fieldservice/maintenance-contract-renewal-check.yaml +36 -0
  17. package/jobs/fieldservice/parts-low-stock-reorder-check.yaml +29 -0
  18. package/jobs/fieldservice/tech-eta-no-show-check.yaml +32 -0
  19. package/jobs/fieldservice/tech-license-renewal-check.yaml +36 -0
  20. package/jobs/fieldservice/unpaid-invoice-aging-check.yaml +35 -0
  21. package/jobs/fieldservice/unresolved-callback-tracker.yaml +35 -0
  22. package/jobs/fieldservice/warranty-claim-expiry-check.yaml +35 -0
  23. package/jobs/finance/accounts-payable-aging-check.yaml +40 -0
  24. package/jobs/finance/bank-statement-reconciliation-check.yaml +40 -0
  25. package/jobs/finance/budget-vs-actual-variance-report.yaml +38 -0
  26. package/jobs/finance/contractor-1099-threshold-tracker.yaml +43 -0
  27. package/jobs/finance/credit-utilization-watch.yaml +40 -0
  28. package/jobs/finance/duplicate-payment-detection.yaml +43 -0
  29. package/jobs/finance/expense-report-compliance-check.yaml +46 -0
  30. package/jobs/finance/late-fee-interest-risk-check.yaml +43 -0
  31. package/jobs/finance/loan-covenant-compliance-check.yaml +37 -0
  32. package/jobs/finance/month-end-close-checklist-tracker.yaml +39 -0
  33. package/jobs/finance/multi-account-cash-position-rollup.yaml +45 -0
  34. package/jobs/finance/petty-cash-float-reconciliation.yaml +43 -0
  35. package/jobs/finance/quarterly-estimated-tax-calculator.yaml +66 -0
  36. package/jobs/finance/vendor-early-pay-discount-tracker.yaml +45 -0
  37. package/jobs/healthcare/appointment-slot-utilization-check.yaml +56 -0
  38. package/jobs/healthcare/claims-denial-resubmission-check.yaml +43 -0
  39. package/jobs/healthcare/clinical-supply-low-stock-check.yaml +30 -0
  40. package/jobs/healthcare/controlled-substance-inventory-reconciliation.yaml +42 -0
  41. package/jobs/healthcare/hipaa-access-log-audit.yaml +74 -0
  42. package/jobs/healthcare/patient-balance-collections-aging-check.yaml +41 -0
  43. package/jobs/healthcare/patient-immunization-schedule-check.yaml +41 -0
  44. package/jobs/healthcare/patient-portal-message-backlog-check.yaml +39 -0
  45. package/jobs/healthcare/patient-satisfaction-survey-tracking.yaml +59 -0
  46. package/jobs/healthcare/prescription-refill-request-backlog-check.yaml +38 -0
  47. package/jobs/healthcare/prior-authorization-expiry-check.yaml +53 -0
  48. package/jobs/healthcare/staff-cme-credit-tracking.yaml +41 -0
  49. package/jobs/healthcare/telehealth-session-issue-check.yaml +51 -0
  50. package/jobs/hr/aca-fte-threshold-monitor.yaml +44 -0
  51. package/jobs/hr/cobra-notification-deadline-tracker.yaml +47 -0
  52. package/jobs/hr/compliance-training-completion-check.yaml +41 -0
  53. package/jobs/hr/eeo1-filing-deadline-reminder.yaml +37 -0
  54. package/jobs/hr/handbook-acknowledgment-tracking.yaml +34 -0
  55. package/jobs/hr/headcount-budget-variance-check.yaml +37 -0
  56. package/jobs/hr/leave-of-absence-return-tracker.yaml +42 -0
  57. package/jobs/hr/org-chart-manager-drift-check.yaml +40 -0
  58. package/jobs/hr/pay-equity-band-outlier-check.yaml +58 -0
  59. package/jobs/hr/pto-year-end-use-it-or-lose-it-check.yaml +49 -0
  60. package/jobs/hr/retirement-plan-enrollment-deadline-check.yaml +40 -0
  61. package/jobs/hr/workers-comp-claim-status-check.yaml +42 -0
  62. package/jobs/legal/conflict-of-interest-check-tracker.yaml +38 -0
  63. package/jobs/legal/corporate-minute-book-completeness-check.yaml +31 -0
  64. package/jobs/legal/data-privacy-request-deadline-tracker.yaml +61 -0
  65. package/jobs/legal/entity-authority-document-expiry-check.yaml +37 -0
  66. package/jobs/legal/legal-document-retention-purge-review.yaml +39 -0
  67. package/jobs/legal/litigation-hold-acknowledgment-tracker.yaml +40 -0
  68. package/jobs/legal/non-compete-expiry-tracker.yaml +37 -0
  69. package/jobs/legal/outside-counsel-invoice-budget-check.yaml +37 -0
  70. package/jobs/legal/settlement-payment-schedule-tracker.yaml +34 -0
  71. package/jobs/legal/timekeeper-billable-hours-compliance-check.yaml +39 -0
  72. package/jobs/legal/trademark-infringement-watch.yaml +43 -0
  73. package/jobs/legal/vendor-coi-expiry-tracker.yaml +37 -0
  74. package/jobs/publishing/arc-review-copy-followup.yaml +35 -0
  75. package/jobs/publishing/isbn-registration-tracker.yaml +35 -0
  76. package/jobs/publishing/manuscript-deadline-tracker.yaml +34 -0
  77. package/jobs/publishing/permissions-clearance-tracker.yaml +36 -0
  78. package/jobs/publishing/print-run-reorder-threshold-check.yaml +32 -0
  79. package/jobs/publishing/rights-license-expiry-check.yaml +35 -0
  80. package/jobs/publishing/royalty-statement-due-check.yaml +33 -0
  81. package/jobs/realestate/capital-reserve-fund-threshold-check.yaml +32 -0
  82. package/jobs/realestate/eviction-notice-deadline-tracker.yaml +37 -0
  83. package/jobs/realestate/landlord-insurance-claim-status-check.yaml +35 -0
  84. package/jobs/realestate/lease-renewal-offer-window-check.yaml +35 -0
  85. package/jobs/realestate/maintenance-request-sla-check.yaml +39 -0
  86. package/jobs/realestate/move-in-move-out-inspection-tracker.yaml +35 -0
  87. package/jobs/realestate/rent-increase-notice-deadline-check.yaml +54 -0
  88. package/jobs/realestate/rent-roll-vacancy-loss-report.yaml +32 -0
  89. package/jobs/realestate/rental-license-renewal-check.yaml +35 -0
  90. package/jobs/realestate/security-deposit-return-deadline-check.yaml +38 -0
  91. package/jobs/realestate/tenant-application-review-backlog-check.yaml +35 -0
  92. package/jobs/realestate/tenant-renters-insurance-compliance-check.yaml +35 -0
  93. package/jobs/realestate/utility-billback-reconciliation-check.yaml +41 -0
  94. package/jobs/sales/champion-departure-watch.yaml +44 -0
  95. package/jobs/sales/closed-lost-reason-audit.yaml +42 -0
  96. package/jobs/sales/commission-payout-tracker.yaml +32 -0
  97. package/jobs/sales/contract-renewal-opportunity-tracker.yaml +28 -0
  98. package/jobs/sales/discount-approval-pending-check.yaml +31 -0
  99. package/jobs/sales/forecast-submission-compliance-check.yaml +42 -0
  100. package/jobs/sales/multi-year-renewal-escalation-tracker.yaml +31 -0
  101. package/jobs/sales/pipeline-hygiene-audit.yaml +26 -0
  102. package/jobs/sales/poc-trial-conversion-tracker.yaml +29 -0
  103. package/jobs/sales/referral-followup-tracker.yaml +40 -0
  104. package/jobs/sales/territory-coverage-gap-check.yaml +43 -0
  105. package/jobs/spa/appointment-no-show-tracker.yaml +46 -0
  106. package/jobs/spa/gift-card-expiry-check.yaml +35 -0
  107. package/jobs/spa/license-renewal-tracker.yaml +35 -0
  108. package/jobs/spa/membership-unused-session-expiry-check.yaml +35 -0
  109. package/jobs/spa/product-chemical-expiry-check.yaml +35 -0
  110. package/jobs/spa/retail-product-low-stock-check.yaml +26 -0
  111. package/jobs/spa/safety-inspection-due-reminder.yaml +33 -0
  112. package/jobs/telecom/circuit-outage-detection.yaml +38 -0
  113. package/jobs/telecom/circuit-provisioning-order-aging.yaml +36 -0
  114. package/jobs/telecom/cpe-firmware-update-tracker.yaml +45 -0
  115. package/jobs/telecom/link-capacity-threshold-alert.yaml +37 -0
  116. package/jobs/telecom/peering-transit-contract-renewal-check.yaml +36 -0
  117. package/jobs/telecom/service-ticket-churn-risk-review.yaml +56 -0
  118. package/jobs/telecom/sla-uptime-breach-tracker.yaml +36 -0
  119. package/lib/category-descriptions.js +4 -0
  120. package/lib/duplicates-allowlist.js +10 -0
  121. package/package.json +2 -2
@@ -0,0 +1,33 @@
1
+ id: royalty-statement-due-check
2
+ version: 1
3
+ name: Royalty Statement Due Check
4
+ description: >
5
+ Warns you before a royalty statement and payment is due to an author or
6
+ co-author. Use this if a royalty statement has ever gone out late (or
7
+ didn't go out at all) because the payout schedule wasn't tracked anywhere.
8
+ category: publishing
9
+ tags: [publishing, royalties, authors, payments]
10
+ schedule: "0 9 1 * *"
11
+ timezone: "UTC"
12
+ runner: shell
13
+ command: >
14
+ today=$(date +%s);
15
+ awk -F',' -v today="$today" -v warn={{warn_days}} '
16
+ NR>1 {
17
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
18
+ cmd | getline due_ts; close(cmd);
19
+ days_left = int((due_ts - today) / 86400);
20
+ if (days_left <= warn) print "WARNING: royalty statement for \"" $1 "\" due in " days_left " days (" $2 ")";
21
+ }
22
+ ' "{{royalty_schedule_csv}}"
23
+ variables:
24
+ royalty_schedule_csv:
25
+ default: "./royalty-schedule.csv"
26
+ description: "CSV with header row, columns: author_or_title,statement_due_date(YYYY-MM-DD)."
27
+ warn_days:
28
+ default: 14
29
+ description: Days before a statement due date to start warning.
30
+ compatible_agents: [generic, claude, codex]
31
+ notes: >
32
+ Most contracts pay semiannually or quarterly on fixed dates — keep
33
+ royalty-schedule.csv in sync with each contract's payout cadence.
@@ -0,0 +1,32 @@
1
+ id: capital-reserve-fund-threshold-check
2
+ version: 1
3
+ name: Capital Reserve Fund Threshold Check
4
+ description: >
5
+ Compares each property's or HOA's capital reserve fund balance against
6
+ its target minimum and flags any that have dropped below threshold.
7
+ Use this if a roof or elevator replacement has ever turned into a
8
+ surprise special assessment because nobody was watching the reserve
9
+ balance drift down over time.
10
+ category: realestate
11
+ tags: [realestate, reserve-fund, capex, budgeting]
12
+ schedule: "0 8 1 * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' '
17
+ NR==1 {next}
18
+ {
19
+ pct_of_target = ($3 > 0) ? ($2 / $3 * 100) : 0;
20
+ if ($2 < $3) {
21
+ printf "BELOW TARGET: %s reserve fund $%.2f is %.1f%% of target $%.2f (short $%.2f)\n", $1, $2, pct_of_target, $3, $3 - $2;
22
+ } else {
23
+ printf "OK: %s reserve fund $%.2f meets target $%.2f\n", $1, $2, $3;
24
+ }
25
+ }
26
+ ' "{{reserve_fund_csv}}"
27
+ variables:
28
+ reserve_fund_csv:
29
+ default: "./capital-reserve-fund.csv"
30
+ description: "CSV with header row, columns: property_name,current_balance,target_balance."
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Target balance should come from a reserve study or capital plan, not a guess — update target_balance when major capital items age closer to replacement.
@@ -0,0 +1,37 @@
1
+ id: eviction-notice-deadline-tracker
2
+ version: 1
3
+ name: Eviction / Notice-to-Quit Deadline Tracker
4
+ description: >
5
+ Tracks active notice-to-quit and eviction filings against their next
6
+ legal deadline (cure period expiry, court date, response window) and
7
+ flags anything coming up. Use this if a case has ever stalled or been
8
+ dismissed on a technicality because a filing or hearing deadline was
9
+ missed.
10
+ category: realestate
11
+ tags: [realestate, eviction, legal, deadline, compliance]
12
+ schedule: "0 8 * * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ today=$(date +%s);
17
+ awk -F',' -v today="$today" -v warn="{{warn_days}}" '
18
+ NR==1 {next}
19
+ $4 == "open" {
20
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
21
+ cmd | getline deadline_ts; close(cmd);
22
+ days_left = int((deadline_ts - today) / 86400);
23
+ if (days_left <= warn) {
24
+ status = (days_left < 0) ? "PAST DEADLINE" : "DEADLINE APPROACHING";
25
+ printf "%s: unit %s — %s deadline %s (%d day(s))\n", status, $1, $2, $3, days_left;
26
+ }
27
+ }
28
+ ' "{{eviction_cases_csv}}"
29
+ variables:
30
+ eviction_cases_csv:
31
+ default: "./eviction-case-tracker.csv"
32
+ description: "CSV with header row, columns: unit,next_deadline_type(cure_period/response_window/court_date),next_deadline_date(YYYY-MM-DD),case_status(open/closed)."
33
+ warn_days:
34
+ default: 5
35
+ description: Days before an upcoming legal deadline to start warning.
36
+ compatible_agents: [generic, claude, codex]
37
+ notes: Eviction procedure and timelines are highly jurisdiction-specific and often require an attorney — this only tracks dates you've already entered, it does not calculate legal deadlines for you.
@@ -0,0 +1,35 @@
1
+ id: landlord-insurance-claim-status-check
2
+ version: 1
3
+ name: Landlord Insurance Claim Status Check
4
+ description: >
5
+ Tracks open property insurance claims and flags any that haven't had a
6
+ status update within a set number of days. Use this if a claim has ever
7
+ gone quiet for weeks with the adjuster because nobody was following up
8
+ on where it stood.
9
+ category: realestate
10
+ tags: [realestate, insurance, claims, follow-up]
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 stale="{{stale_days}}" '
17
+ NR==1 {next}
18
+ $5 == "open" {
19
+ cmd="date -d \"" $4 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $4 "\" +%s";
20
+ cmd | getline update_ts; close(cmd);
21
+ days_stale = int((today - update_ts) / 86400);
22
+ if (days_stale >= stale) {
23
+ printf "CLAIM NEEDS FOLLOW-UP: %s — claim #%s (%s), last update %d day(s) ago\n", $1, $2, $3, days_stale;
24
+ }
25
+ }
26
+ ' "{{insurance_claims_csv}}"
27
+ variables:
28
+ insurance_claims_csv:
29
+ default: "./insurance-claims-tracker.csv"
30
+ description: "CSV with header row, columns: property_name,claim_number,claim_type,last_update_date(YYYY-MM-DD),status(open/closed)."
31
+ stale_days:
32
+ default: 14
33
+ description: Days without a status update before an open claim is flagged for follow-up.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Distinct from insurance-policy-renewal-reminder, which only watches policy renewal dates — this tracks the lifecycle of active claims after a loss, from filing to settlement.
@@ -0,0 +1,35 @@
1
+ id: lease-renewal-offer-window-check
2
+ version: 1
3
+ name: Lease Renewal Offer Window Check
4
+ description: >
5
+ Flags leases approaching expiry where no renewal offer has been sent
6
+ yet, so tenants get a decision window before they start apartment
7
+ hunting elsewhere. Use this if a good tenant has ever given notice to
8
+ leave simply because nobody proactively offered them a renewal in time.
9
+ category: realestate
10
+ tags: [realestate, lease-renewal, retention]
11
+ schedule: "0 8 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v lead="{{offer_lead_days}}" '
17
+ NR==1 {next}
18
+ $3 == "no" {
19
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
20
+ cmd | getline end_ts; close(cmd);
21
+ days_left = int((end_ts - today) / 86400);
22
+ if (days_left <= lead && days_left >= 0) {
23
+ printf "SEND RENEWAL OFFER: %s (unit %s) lease ends in %d day(s), no offer sent yet\n", $1, $4, days_left;
24
+ }
25
+ }
26
+ ' "{{leases_csv}}"
27
+ variables:
28
+ leases_csv:
29
+ default: "./lease-renewal-status.csv"
30
+ description: "CSV with header row, columns: tenant_name,lease_end_date(YYYY-MM-DD),renewal_offer_sent(yes/no),unit."
31
+ offer_lead_days:
32
+ default: 90
33
+ description: Days before lease end by which a renewal offer should have been sent.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Distinct from lease-expiry-reminder, which just warns that an end date is approaching — this tracks whether the renewal-offer action itself has been taken, flip renewal_offer_sent to "yes" once the offer goes out.
@@ -0,0 +1,39 @@
1
+ id: maintenance-request-sla-check
2
+ version: 1
3
+ name: Maintenance Request SLA Check
4
+ description: >
5
+ Scans open tenant maintenance requests and flags any that have blown
6
+ past your response or resolution SLA. Use this if a leaky faucet or
7
+ broken heater has ever sat unaddressed for weeks because the request
8
+ got logged and then forgotten.
9
+ category: realestate
10
+ tags: [realestate, maintenance, sla, tenant-requests]
11
+ schedule: "0 8 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v sla_normal="{{sla_hours_normal}}" -v sla_urgent="{{sla_hours_urgent}}" '
17
+ NR==1 {next}
18
+ $4 == "open" {
19
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d %H:%M\" \"" $2 "\" +%s";
20
+ cmd | getline opened_ts; close(cmd);
21
+ hours_open = (today - opened_ts) / 3600;
22
+ sla = ($3 == "urgent") ? sla_urgent : sla_normal;
23
+ if (hours_open >= sla) {
24
+ printf "SLA BREACH: unit %s — \"%s\" open %.0f hrs (priority: %s, SLA: %s hrs)\n", $1, $5, hours_open, $3, sla;
25
+ }
26
+ }
27
+ ' "{{maintenance_requests_csv}}"
28
+ variables:
29
+ maintenance_requests_csv:
30
+ default: "./maintenance-requests.csv"
31
+ description: "CSV with header row, columns: unit,opened_at(YYYY-MM-DD HH:MM),priority(normal/urgent),status(open/closed),description."
32
+ sla_hours_normal:
33
+ default: 72
34
+ description: Hours allowed to resolve a normal-priority request before it counts as an SLA breach.
35
+ sla_hours_urgent:
36
+ default: 12
37
+ description: Hours allowed to resolve an urgent-priority request (e.g. no heat, active leak) before it counts as an SLA breach.
38
+ compatible_agents: [generic, claude, codex]
39
+ notes: Distinct from the routine walkthrough tracked by property-maintenance-inspection-reminder — this watches tenant-initiated repair tickets against a response/resolution clock, not scheduled inspections.
@@ -0,0 +1,35 @@
1
+ id: move-in-move-out-inspection-tracker
2
+ version: 1
3
+ name: Move-In/Move-Out Inspection Checklist Tracker
4
+ description: >
5
+ Flags move-ins and move-outs where the condition inspection checklist
6
+ hasn't been completed within a set number of days of the move date. Use
7
+ this if a deposit dispute has ever fallen apart because there was no
8
+ signed move-in or move-out condition report to point to.
9
+ category: realestate
10
+ tags: [realestate, inspection, move-in, move-out, documentation]
11
+ schedule: "0 8 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v grace="{{grace_days}}" '
17
+ NR==1 {next}
18
+ $4 == "incomplete" {
19
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
20
+ cmd | getline move_ts; close(cmd);
21
+ days_since = int((today - move_ts) / 86400);
22
+ if (days_since >= grace) {
23
+ printf "MISSING CHECKLIST: %s unit %s — %s inspection incomplete, %d day(s) since move date %s\n", $1, $2, $5, days_since, $3;
24
+ }
25
+ }
26
+ ' "{{inspections_csv}}"
27
+ variables:
28
+ inspections_csv:
29
+ default: "./move-inspection-tracker.csv"
30
+ description: "CSV with header row, columns: tenant_name,unit,move_date(YYYY-MM-DD),checklist_status(complete/incomplete),move_type(move_in/move_out)."
31
+ grace_days:
32
+ default: 3
33
+ description: Days after the move date before an incomplete checklist gets flagged.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: A completed, signed checklist with photos is usually the single biggest factor in winning a security deposit dispute — mark checklist_status complete only once it's actually signed and filed.
@@ -0,0 +1,54 @@
1
+ id: rent-increase-notice-deadline-check
2
+ version: 1
3
+ name: Rent Increase Notice Deadline Check
4
+ description: >
5
+ Checks upcoming lease anniversaries against the legally required notice
6
+ period for a rent increase, and drafts the increase notice once one is
7
+ due. Use this if you've ever missed the window to raise rent at renewal
8
+ because the required notice lead time (30/60/90 days, depending on
9
+ jurisdiction) quietly passed.
10
+ category: realestate
11
+ tags: [realestate, rent, rent-increase, notice, compliance]
12
+ schedule: "0 8 * * 1"
13
+ timezone: "UTC"
14
+ runner: hybrid
15
+ command: >
16
+ today=$(date +%s);
17
+ awk -F',' -v today="$today" -v lead="{{notice_lead_days}}" '
18
+ NR==1 {next}
19
+ {
20
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
21
+ cmd | getline anniv_ts; close(cmd);
22
+ days_out = int((anniv_ts - today) / 86400);
23
+ notice_deadline_days = days_out - lead;
24
+ if (days_out >= 0 && notice_deadline_days <= 7) {
25
+ printf "NOTICE DUE SOON: %s renews %s — send rent increase notice within %d day(s) to meet the %d-day requirement\n", $1, $2, lead, notice_deadline_days;
26
+ }
27
+ }
28
+ ' "{{leases_csv}}"
29
+ prompt: >
30
+ A property manager needs rent increase notices drafted for leases flagged
31
+ by the attached check as needing notice within the next 7 days. For each
32
+ flagged tenant/unit, draft a short, compliant rent increase notice letter
33
+ stating the current rent, new rent (using {{increase_pct}}% as the default
34
+ increase unless a specific figure is provided), effective date, and the
35
+ jurisdiction's required minimum notice period ({{notice_lead_days}} days).
36
+ Keep tone professional and neutral, and flag if the requested effective
37
+ date does not leave the full required notice period.
38
+ script_note: >
39
+ The shell command flags which leases need a notice sent this week using
40
+ static date math; it does not draft the actual notice letter or account
41
+ for jurisdiction-specific required legal language, both of which the
42
+ prompt pass adds.
43
+ variables:
44
+ leases_csv:
45
+ default: "./lease-anniversaries.csv"
46
+ description: "CSV with header row, columns: tenant_name,anniversary_date(YYYY-MM-DD)."
47
+ notice_lead_days:
48
+ default: 60
49
+ description: Minimum days of advance notice required before a rent increase takes effect (check local law).
50
+ increase_pct:
51
+ default: 3
52
+ description: Default percentage rent increase to propose when drafting a notice.
53
+ compatible_agents: [claude, codex, generic]
54
+ notes: Required notice periods vary widely by state/city and by increase size — verify local rules before sending; this job does not know your jurisdiction's specific statute.
@@ -0,0 +1,32 @@
1
+ id: rent-roll-vacancy-loss-report
2
+ version: 1
3
+ name: Rent Roll Vacancy Loss Report
4
+ description: >
5
+ Rolls up the whole portfolio's rent ledger to calculate total dollar
6
+ vacancy loss (market rent for every vacant unit, summed) for the
7
+ period. Use this if you've ever known "a few units are empty" without
8
+ knowing what that's actually costing you in dollars this month.
9
+ category: realestate
10
+ tags: [realestate, vacancy, rent-roll, reporting]
11
+ schedule: "0 8 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' '
16
+ NR==1 {next}
17
+ {
18
+ total_units++;
19
+ total_market_rent += $3;
20
+ if ($4 == "vacant") { vacant_units++; vacancy_loss += $3; }
21
+ }
22
+ END {
23
+ vacancy_rate = (total_units > 0) ? (vacant_units / total_units * 100) : 0;
24
+ printf "VACANCY LOSS REPORT: %d of %d unit(s) vacant (%.1f%%), lost market rent = $%.2f of $%.2f total portfolio potential\n", vacant_units, total_units, vacancy_rate, vacancy_loss, total_market_rent;
25
+ }
26
+ ' "{{rent_roll_csv}}"
27
+ variables:
28
+ rent_roll_csv:
29
+ default: "./rent-roll.csv"
30
+ description: "CSV with header row, columns: unit,tenant_name,market_rent,occupancy_status(occupied/vacant)."
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: Distinct from rental-vacancy-check, which watches a single listing's days-vacant clock — this rolls up the whole rent roll into a dollar vacancy-loss figure for the period, useful for owner reporting.
@@ -0,0 +1,35 @@
1
+ id: rental-license-renewal-check
2
+ version: 1
3
+ name: Rental License / Registration Renewal Check
4
+ description: >
5
+ Warns before a municipal rental license, landlord registration, or
6
+ certificate of occupancy for rental use is due to expire. Use this if
7
+ a city has ever fined you, or blocked a new lease, because a rental
8
+ registration lapsed and nobody was tracking its renewal cycle.
9
+ category: realestate
10
+ tags: [realestate, rental-license, municipal, compliance]
11
+ schedule: "0 8 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v warn="{{warn_days}}" '
17
+ NR==1 {next}
18
+ {
19
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
20
+ cmd | getline exp_ts; close(cmd);
21
+ days_left = int((exp_ts - today) / 86400);
22
+ if (days_left <= warn) {
23
+ printf "LICENSE RENEWAL DUE: %s — %s license (#%s) expires in %d day(s)\n", $1, $2, $4, days_left;
24
+ }
25
+ }
26
+ ' "{{rental_licenses_csv}}"
27
+ variables:
28
+ rental_licenses_csv:
29
+ default: "./rental-licenses.csv"
30
+ description: "CSV with header row, columns: property_name,license_type,expiration_date(YYYY-MM-DD),license_number."
31
+ warn_days:
32
+ default: 45
33
+ description: Days before expiration to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Distinct from property-maintenance-inspection-reminder (routine walkthroughs) and construction/permit-expiry-check (building permits during construction) — this tracks the ongoing municipal license/registration a unit needs to be legally rented, not a build-phase permit.
@@ -0,0 +1,38 @@
1
+ id: security-deposit-return-deadline-check
2
+ version: 1
3
+ name: Security Deposit Return Deadline Check
4
+ description: >
5
+ Flags move-outs where the statutory deadline to return the security
6
+ deposit (or an itemized deduction statement) is approaching or has
7
+ passed. Use this if a deposit has ever gone back late and triggered a
8
+ penalty claim or small-claims dispute because nobody was tracking the
9
+ move-out date against the legal return window.
10
+ category: realestate
11
+ tags: [realestate, security-deposit, move-out, compliance]
12
+ schedule: "0 8 * * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ today=$(date +%s);
17
+ awk -F',' -v today="$today" -v deadline_days="{{return_deadline_days}}" '
18
+ NR==1 {next}
19
+ {
20
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
21
+ cmd | getline moveout_ts; close(cmd);
22
+ days_since = int((today - moveout_ts) / 86400);
23
+ days_left = deadline_days - days_since;
24
+ if ($3 == "not_returned") {
25
+ if (days_left < 0) printf "OVERDUE: %s deposit is %d day(s) past the %d-day return deadline (moved out %s)\n", $1, -days_left, deadline_days, $2;
26
+ else if (days_left <= 5) printf "DUE SOON: %s deposit return/itemization due within %d day(s) (moved out %s)\n", $1, days_left, $2;
27
+ }
28
+ }
29
+ ' "{{moveouts_csv}}"
30
+ variables:
31
+ moveouts_csv:
32
+ default: "./security-deposit-tracker.csv"
33
+ description: "CSV with header row, columns: tenant_name,moveout_date(YYYY-MM-DD),status(returned/not_returned)."
34
+ return_deadline_days:
35
+ default: 21
36
+ description: Statutory number of days to return the deposit or send an itemized deduction statement (varies by state, commonly 14-30).
37
+ compatible_agents: [generic, claude, codex]
38
+ notes: Update status to "returned" the moment a deposit is sent back or an itemized statement is mailed — the statutory deadline and whether interest is owed vary by jurisdiction, so confirm your local rule.
@@ -0,0 +1,35 @@
1
+ id: tenant-application-review-backlog-check
2
+ version: 1
3
+ name: Tenant Application Review Backlog Check
4
+ description: >
5
+ Flags rental applications that have been sitting in review too long
6
+ without a decision. Use this if a good applicant has ever gone with a
7
+ different landlord because your screening process sat on their
8
+ application for a week before anyone looked at it.
9
+ category: realestate
10
+ tags: [realestate, tenant-screening, applications, backlog]
11
+ schedule: "0 9 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ today=$(date +%s);
16
+ awk -F',' -v today="$today" -v max_days="{{max_review_days}}" '
17
+ NR==1 {next}
18
+ $3 == "pending" {
19
+ cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
20
+ cmd | getline sub_ts; close(cmd);
21
+ days_pending = int((today - sub_ts) / 86400);
22
+ if (days_pending >= max_days) {
23
+ printf "STALE APPLICATION: %s applied for unit %s %d day(s) ago, still pending review\n", $1, $4, days_pending;
24
+ }
25
+ }
26
+ ' "{{applications_csv}}"
27
+ variables:
28
+ applications_csv:
29
+ default: "./tenant-applications.csv"
30
+ description: "CSV with header row, columns: applicant_name,submitted_date(YYYY-MM-DD),status(pending/approved/denied),unit."
31
+ max_review_days:
32
+ default: 3
33
+ description: Days an application can sit pending before it's flagged as backlogged.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Keep status updated to approved/denied as decisions are made so this only ever flags genuinely stalled applications, not ones already actioned.
@@ -0,0 +1,35 @@
1
+ id: tenant-renters-insurance-compliance-check
2
+ version: 1
3
+ name: Tenant Renters Insurance Compliance Check
4
+ description: >
5
+ Checks tenants required by their lease to carry renters insurance
6
+ against their certificate's expiration date and flags anyone lapsed or
7
+ about to lapse. Use this if a tenant's coverage has ever quietly
8
+ expired mid-lease, leaving the landlord exposed on a liability claim
9
+ the lease was supposed to cover.
10
+ category: realestate
11
+ tags: [realestate, renters-insurance, compliance, tenant]
12
+ schedule: "0 8 * * 1"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ today=$(date +%s);
17
+ awk -F',' -v today="$today" -v warn="{{warn_days}}" '
18
+ NR==1 {next}
19
+ {
20
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
21
+ cmd | getline exp_ts; close(cmd);
22
+ days_left = int((exp_ts - today) / 86400);
23
+ if (days_left < 0) printf "LAPSED: %s (unit %s) renters insurance expired %d day(s) ago\n", $1, $2, -days_left;
24
+ else if (days_left <= warn) printf "EXPIRING SOON: %s (unit %s) renters insurance expires in %d day(s)\n", $1, $2, days_left;
25
+ }
26
+ ' "{{renters_coi_csv}}"
27
+ variables:
28
+ renters_coi_csv:
29
+ default: "./tenant-renters-insurance.csv"
30
+ description: "CSV with header row, columns: tenant_name,unit,coverage_expiration_date(YYYY-MM-DD)."
31
+ warn_days:
32
+ default: 14
33
+ description: Days before expiration to start warning.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: Distinct from subcontractor-insurance-expiry-check in jobs/construction (which tracks contractor COIs on a job site) — this tracks tenant renters-insurance compliance required by the lease, only useful where the lease actually mandates coverage.
@@ -0,0 +1,41 @@
1
+ id: utility-billback-reconciliation-check
2
+ version: 1
3
+ name: Utility Bill-Back Reconciliation Check
4
+ description: >
5
+ Compares submetered tenant utility charges against the property's
6
+ master utility bill and flags a mismatch beyond a set tolerance. Use
7
+ this if tenant bill-backs have ever quietly drifted from the actual
8
+ master bill, either undercharging the owner or overcharging tenants.
9
+ category: realestate
10
+ tags: [realestate, utilities, billing, reconciliation]
11
+ schedule: "0 8 3 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ awk -F',' -v tol="{{tolerance_pct}}" '
16
+ NR==1 {next}
17
+ {
18
+ billed_total += $3;
19
+ master = $2;
20
+ property = $1;
21
+ }
22
+ END {
23
+ diff = billed_total - master;
24
+ pct = (master > 0) ? (diff / master * 100) : 0;
25
+ if (pct < 0) pct = -pct;
26
+ if (pct >= tol) {
27
+ printf "RECONCILIATION MISMATCH: %s — tenant bill-backs total $%.2f vs master bill $%.2f (%.1f%% variance)\n", property, billed_total, master, pct;
28
+ } else {
29
+ printf "OK: %s bill-backs reconcile within tolerance ($%.2f vs $%.2f)\n", property, billed_total, master;
30
+ }
31
+ }
32
+ ' "{{billback_csv}}"
33
+ variables:
34
+ billback_csv:
35
+ default: "./utility-billback-ledger.csv"
36
+ description: "CSV with header row, columns: property_name,master_bill_amount,tenant_billed_amount — one row per submetered unit for the current billing period, master_bill_amount repeated per row for the property."
37
+ tolerance_pct:
38
+ default: 5
39
+ description: Allowed percentage variance between total tenant bill-backs and the master bill before it's flagged.
40
+ compatible_agents: [generic, claude, codex]
41
+ notes: Assumes a per-period export of submeter charges alongside the master bill amount — adjust the CSV shape to match your submetering vendor or utility management software's export.
@@ -0,0 +1,44 @@
1
+ id: champion-departure-watch
2
+ version: 1
3
+ name: Champion Departure Watch
4
+ description: >
5
+ Checks whether your champion or economic-buyer contact at open or
6
+ recently-closed accounts has left the company, using bounce signals or
7
+ a job-change lookup, and drafts a plan to find the new point of contact.
8
+ Use this if a deal has ever gone quiet for weeks before you found out
9
+ your one internal advocate had already left the company.
10
+ category: sales
11
+ tags: [sales, champion, contact-departure, account-risk]
12
+ schedule: "0 8 * * 1"
13
+ timezone: "UTC"
14
+ runner: agent-prompt
15
+ prompt: |
16
+ Review the champion/decision-maker contacts listed in {{contacts_source}}
17
+ for accounts with an open deal or a contract within
18
+ {{renewal_lookback_days}} days of renewal.
19
+ 1. For each contact, check for signs they've left the company: a bounced
20
+ email address, an outdated title, or a job-change signal on
21
+ {{signal_source}} (e.g. LinkedIn).
22
+ 2. List any contact flagged as likely departed, with the account name,
23
+ deal/contract at risk, and what signal triggered the flag.
24
+ 3. For each flagged account, suggest the most likely replacement contact
25
+ if one is visible in the account (another named stakeholder, or a
26
+ generic role like "VP of [department]"), and draft a short
27
+ re-introduction email to that person or a warm-intro request to
28
+ another contact at the account.
29
+ 4. If no departures are found, say so in one line.
30
+ variables:
31
+ contacts_source:
32
+ default: "your CRM's contact list, or a champions.csv with columns: account,contact_name,contact_email,title,deal_or_contract"
33
+ description: Where champion/decision-maker contacts and the account/deal they're tied to are recorded.
34
+ signal_source:
35
+ default: "LinkedIn, or email bounce logs from your email platform"
36
+ description: Where to check for a job-change or departure signal.
37
+ renewal_lookback_days:
38
+ default: 90
39
+ description: How far ahead to include upcoming renewals when scoping which accounts' champions to check.
40
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
41
+ notes: >
42
+ Draft-only — review the suggested replacement contact and re-intro email
43
+ before sending. Respect LinkedIn's terms of use; a manual check or a
44
+ licensed data provider is safer than scraping.
@@ -0,0 +1,42 @@
1
+ id: closed-lost-reason-audit
2
+ version: 1
3
+ name: Closed-Lost Reason Audit
4
+ description: >
5
+ Finds recently closed-lost deals with no loss reason recorded, and
6
+ summarizes the reasons that were captured into a short pattern report.
7
+ Use this if closed-lost deals have ever piled up with a blank reason
8
+ field, making it impossible to tell whether you're losing to a
9
+ competitor, on price, or on missing features.
10
+ category: sales
11
+ tags: [sales, closed-lost, win-loss, reporting]
12
+ schedule: "0 8 * * 1"
13
+ timezone: "UTC"
14
+ runner: hybrid
15
+ command: >
16
+ psql "{{database_url}}" -t -c "select name, owner, amount, loss_reason from deals where stage = 'closed_lost' and closed_at > now() - interval '{{lookback_days}} days' order by closed_at desc;"
17
+ prompt: |
18
+ Review closed-lost deals from the last {{lookback_days}} days (from the
19
+ script output above, or by querying {{database_url}} directly).
20
+ 1. List every deal with a blank/missing loss_reason — these need a rep
21
+ follow-up to fill in before the data is usable.
22
+ 2. For deals that do have a loss_reason, group them into a short summary
23
+ of the top 3-5 recurring themes (e.g. "price", "lost to [competitor]",
24
+ "missing feature X", "no budget/timing").
25
+ 3. Note if one theme is trending upward compared to what you'd normally
26
+ expect, so it can be raised with product/pricing.
27
+ script_note: >
28
+ `command` lists closed-lost deals and their recorded (or missing) loss
29
+ reason with zero tokens. `prompt` adds the missing-reason follow-up list
30
+ and the qualitative theme summary across free-text reasons.
31
+ variables:
32
+ database_url:
33
+ default: "postgres://user:pass@host:5432/db"
34
+ description: Connection string for the CRM/deals database.
35
+ lookback_days:
36
+ default: 30
37
+ description: How many days of closed-lost deals to review.
38
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
39
+ notes: >
40
+ Assumes a `deals` table with `stage`, `closed_at`, and a free-text
41
+ `loss_reason` column — adjust to your CRM's schema and loss-reason
42
+ taxonomy if it uses a fixed picklist instead of free text.
@@ -0,0 +1,32 @@
1
+ id: commission-payout-tracker
2
+ version: 1
3
+ name: Commission Payout Tracker
4
+ description: >
5
+ Finds closed-won deals whose sales commission hasn't been marked as paid
6
+ even though the payout grace period has passed, and totals what's owed
7
+ per rep. Use this if a rep has ever had to chase finance to find out why
8
+ a commission from weeks ago never showed up in their paycheck.
9
+ category: sales
10
+ tags: [sales, commission, payroll-adjacent, compensation]
11
+ schedule: "0 8 1,15 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ psql "{{database_url}}" -t -c "select owner, count(*) as unpaid_deals, sum(amount) as unpaid_revenue, round(sum(amount) * {{commission_rate_pct}} / 100.0, 2) as commission_owed from deals where stage = 'closed_won' and commission_paid = false and closed_at < now() - interval '{{grace_days}} days' group by owner order by commission_owed desc;"
16
+ variables:
17
+ database_url:
18
+ default: "postgres://user:pass@host:5432/db"
19
+ description: Connection string for the CRM/deals database.
20
+ commission_rate_pct:
21
+ default: 10
22
+ description: Flat commission rate percent applied to closed-won revenue, for the estimate.
23
+ grace_days:
24
+ default: 15
25
+ description: Days after close before an unpaid commission counts as overdue for payout.
26
+ compatible_agents: [generic, claude, codex]
27
+ notes: >
28
+ Assumes a `deals` table with a `commission_paid` boolean column and a
29
+ flat commission rate — replace the flat-rate math with your real
30
+ commission plan (tiers, accelerators, clawbacks) if it's more complex.
31
+ This is separate from any HR payroll job — it only flags CRM-side deal
32
+ data, it does not run payroll.