@wonsukchoi/crondex 0.21.0 → 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 (92) hide show
  1. package/README.md +16 -30
  2. package/catalog.json +2294 -26
  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/finance/accounts-payable-aging-check.yaml +40 -0
  17. package/jobs/finance/bank-statement-reconciliation-check.yaml +40 -0
  18. package/jobs/finance/budget-vs-actual-variance-report.yaml +38 -0
  19. package/jobs/finance/contractor-1099-threshold-tracker.yaml +43 -0
  20. package/jobs/finance/credit-utilization-watch.yaml +40 -0
  21. package/jobs/finance/duplicate-payment-detection.yaml +43 -0
  22. package/jobs/finance/expense-report-compliance-check.yaml +46 -0
  23. package/jobs/finance/late-fee-interest-risk-check.yaml +43 -0
  24. package/jobs/finance/loan-covenant-compliance-check.yaml +37 -0
  25. package/jobs/finance/month-end-close-checklist-tracker.yaml +39 -0
  26. package/jobs/finance/multi-account-cash-position-rollup.yaml +45 -0
  27. package/jobs/finance/petty-cash-float-reconciliation.yaml +43 -0
  28. package/jobs/finance/quarterly-estimated-tax-calculator.yaml +66 -0
  29. package/jobs/finance/vendor-early-pay-discount-tracker.yaml +45 -0
  30. package/jobs/healthcare/appointment-slot-utilization-check.yaml +56 -0
  31. package/jobs/healthcare/claims-denial-resubmission-check.yaml +43 -0
  32. package/jobs/healthcare/clinical-supply-low-stock-check.yaml +30 -0
  33. package/jobs/healthcare/controlled-substance-inventory-reconciliation.yaml +42 -0
  34. package/jobs/healthcare/hipaa-access-log-audit.yaml +74 -0
  35. package/jobs/healthcare/patient-balance-collections-aging-check.yaml +41 -0
  36. package/jobs/healthcare/patient-immunization-schedule-check.yaml +41 -0
  37. package/jobs/healthcare/patient-portal-message-backlog-check.yaml +39 -0
  38. package/jobs/healthcare/patient-satisfaction-survey-tracking.yaml +59 -0
  39. package/jobs/healthcare/prescription-refill-request-backlog-check.yaml +38 -0
  40. package/jobs/healthcare/prior-authorization-expiry-check.yaml +53 -0
  41. package/jobs/healthcare/staff-cme-credit-tracking.yaml +41 -0
  42. package/jobs/healthcare/telehealth-session-issue-check.yaml +51 -0
  43. package/jobs/hr/aca-fte-threshold-monitor.yaml +44 -0
  44. package/jobs/hr/cobra-notification-deadline-tracker.yaml +47 -0
  45. package/jobs/hr/compliance-training-completion-check.yaml +41 -0
  46. package/jobs/hr/eeo1-filing-deadline-reminder.yaml +37 -0
  47. package/jobs/hr/handbook-acknowledgment-tracking.yaml +34 -0
  48. package/jobs/hr/headcount-budget-variance-check.yaml +37 -0
  49. package/jobs/hr/leave-of-absence-return-tracker.yaml +42 -0
  50. package/jobs/hr/org-chart-manager-drift-check.yaml +40 -0
  51. package/jobs/hr/pay-equity-band-outlier-check.yaml +58 -0
  52. package/jobs/hr/pto-year-end-use-it-or-lose-it-check.yaml +49 -0
  53. package/jobs/hr/retirement-plan-enrollment-deadline-check.yaml +40 -0
  54. package/jobs/hr/workers-comp-claim-status-check.yaml +42 -0
  55. package/jobs/legal/conflict-of-interest-check-tracker.yaml +38 -0
  56. package/jobs/legal/corporate-minute-book-completeness-check.yaml +31 -0
  57. package/jobs/legal/data-privacy-request-deadline-tracker.yaml +61 -0
  58. package/jobs/legal/entity-authority-document-expiry-check.yaml +37 -0
  59. package/jobs/legal/legal-document-retention-purge-review.yaml +39 -0
  60. package/jobs/legal/litigation-hold-acknowledgment-tracker.yaml +40 -0
  61. package/jobs/legal/non-compete-expiry-tracker.yaml +37 -0
  62. package/jobs/legal/outside-counsel-invoice-budget-check.yaml +37 -0
  63. package/jobs/legal/settlement-payment-schedule-tracker.yaml +34 -0
  64. package/jobs/legal/timekeeper-billable-hours-compliance-check.yaml +39 -0
  65. package/jobs/legal/trademark-infringement-watch.yaml +43 -0
  66. package/jobs/legal/vendor-coi-expiry-tracker.yaml +37 -0
  67. package/jobs/realestate/capital-reserve-fund-threshold-check.yaml +32 -0
  68. package/jobs/realestate/eviction-notice-deadline-tracker.yaml +37 -0
  69. package/jobs/realestate/landlord-insurance-claim-status-check.yaml +35 -0
  70. package/jobs/realestate/lease-renewal-offer-window-check.yaml +35 -0
  71. package/jobs/realestate/maintenance-request-sla-check.yaml +39 -0
  72. package/jobs/realestate/move-in-move-out-inspection-tracker.yaml +35 -0
  73. package/jobs/realestate/rent-increase-notice-deadline-check.yaml +54 -0
  74. package/jobs/realestate/rent-roll-vacancy-loss-report.yaml +32 -0
  75. package/jobs/realestate/rental-license-renewal-check.yaml +35 -0
  76. package/jobs/realestate/security-deposit-return-deadline-check.yaml +38 -0
  77. package/jobs/realestate/tenant-application-review-backlog-check.yaml +35 -0
  78. package/jobs/realestate/tenant-renters-insurance-compliance-check.yaml +35 -0
  79. package/jobs/realestate/utility-billback-reconciliation-check.yaml +41 -0
  80. package/jobs/sales/champion-departure-watch.yaml +44 -0
  81. package/jobs/sales/closed-lost-reason-audit.yaml +42 -0
  82. package/jobs/sales/commission-payout-tracker.yaml +32 -0
  83. package/jobs/sales/contract-renewal-opportunity-tracker.yaml +28 -0
  84. package/jobs/sales/discount-approval-pending-check.yaml +31 -0
  85. package/jobs/sales/forecast-submission-compliance-check.yaml +42 -0
  86. package/jobs/sales/multi-year-renewal-escalation-tracker.yaml +31 -0
  87. package/jobs/sales/pipeline-hygiene-audit.yaml +26 -0
  88. package/jobs/sales/poc-trial-conversion-tracker.yaml +29 -0
  89. package/jobs/sales/referral-followup-tracker.yaml +40 -0
  90. package/jobs/sales/territory-coverage-gap-check.yaml +43 -0
  91. package/lib/duplicates-allowlist.js +5 -0
  92. package/package.json +2 -2
@@ -0,0 +1,37 @@
1
+ id: non-compete-expiry-tracker
2
+ version: 1
3
+ name: Non-Compete / Non-Solicit Expiry Tracker
4
+ description: >
5
+ Tracks the restricted-period end date of non-compete and non-solicit
6
+ agreements for departed employees and warns as each one is about to
7
+ expire. Use this if you've ever needed to know exactly when a former
8
+ employee's restrictive covenant runs out — before deciding whether to
9
+ act on a suspected violation, or before it's too late to.
10
+ category: legal
11
+ tags: [legal, non-compete, non-solicit, restrictive-covenants, employment]
12
+ schedule: "0 9 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 {
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) print "WARNING: " $2 " covenant for " $1 " expires in " days_left " days (" $3 ")";
23
+ }
24
+ ' {{covenants_csv}}
25
+ variables:
26
+ covenants_csv:
27
+ default: "non-compete-covenants.csv"
28
+ description: "CSV with header row, columns: former_employee_name,covenant_type (non-compete/non-solicit),restricted_period_end_date(YYYY-MM-DD)."
29
+ warn_days:
30
+ default: 30
31
+ description: Days before the restricted period ends to start warning.
32
+ compatible_agents: [generic, claude, codex]
33
+ notes: >
34
+ Enforceability of these covenants varies a lot by state/country and has
35
+ been narrowing in many jurisdictions — confirm with counsel before
36
+ relying on any covenant as still enforceable. Update the CSV whenever
37
+ an employee with a covenant departs.
@@ -0,0 +1,37 @@
1
+ id: outside-counsel-invoice-budget-check
2
+ version: 1
3
+ name: Outside Counsel Invoice Budget Check
4
+ description: >
5
+ Compares outside counsel invoices billed to date against each matter's
6
+ approved budget and flags matters approaching or over budget. Use this
7
+ if a matter budget has ever been blown through silently because
8
+ invoices got approved one at a time without anyone tracking the
9
+ running total against the budget set at intake.
10
+ category: legal
11
+ tags: [legal, outside-counsel, billing, budget]
12
+ schedule: "0 9 1,15 * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v warn_pct="{{warn_at_percent}}" '
17
+ NR==1 {next}
18
+ {
19
+ budget = $3 + 0;
20
+ billed = $4 + 0;
21
+ if (budget > 0) {
22
+ pct = (billed / budget) * 100;
23
+ if (pct >= warn_pct) {
24
+ printf "BUDGET ALERT: %s (firm: %s) — billed $%.2f of $%.2f budget (%.0f%%)\n", $1, $2, billed, budget, pct;
25
+ }
26
+ }
27
+ }
28
+ ' "{{matter_budgets_csv_path}}"
29
+ variables:
30
+ matter_budgets_csv_path:
31
+ default: "./outside-counsel-matter-budgets.csv"
32
+ description: "Path to a CSV with columns: matter_name,firm_name,approved_budget,billed_to_date. One row per matter with active outside counsel."
33
+ warn_at_percent:
34
+ default: 80
35
+ description: Percent of approved budget billed at which a matter gets flagged.
36
+ compatible_agents: [generic, claude, codex]
37
+ notes: Update billed_to_date from approved invoices (e.g. e-billing/LEDES exports) before each run — this only compares numbers you supply, it doesn't parse invoices itself.
@@ -0,0 +1,34 @@
1
+ id: settlement-payment-schedule-tracker
2
+ version: 1
3
+ name: Settlement Payment Schedule Tracker
4
+ description: >
5
+ Checks scheduled settlement agreement installment payments — both
6
+ owed and owed to you — and flags anything due soon or missed. Use this
7
+ if a settlement installment has ever been paid late (risking default
8
+ terms kicking back in) or received late without anyone noticing until
9
+ the next reconciliation.
10
+ category: legal
11
+ tags: [legal, settlement, payment-schedule, litigation]
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 && $5 == "unpaid" {
19
+ cmd="date -d \"" $4 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $4 "\" +%s";
20
+ cmd | getline due_ts; close(cmd);
21
+ days_left = int((due_ts - today) / 86400);
22
+ if (days_left < 0) print "MISSED: " $1 " installment #" $2 " ($" $3 ") was due " $4 " (" (days_left*-1) " days overdue)";
23
+ else if (days_left <= warn) print "DUE SOON: " $1 " installment #" $2 " ($" $3 ") due " $4 " (" days_left " days)";
24
+ }
25
+ ' {{settlements_csv}}
26
+ variables:
27
+ settlements_csv:
28
+ default: "settlement-payment-schedule.csv"
29
+ description: "CSV with header row, columns: matter_or_counterparty,installment_number,amount,due_date(YYYY-MM-DD),status(paid/unpaid)."
30
+ warn_days:
31
+ default: 7
32
+ description: Days before an installment's due date to start warning.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: Update the status column as each installment clears — this only reads dates and status you supply, it doesn't confirm receipt/disbursement of funds itself.
@@ -0,0 +1,39 @@
1
+ id: timekeeper-billable-hours-compliance-check
2
+ version: 1
3
+ name: Timekeeper Billable Hours Compliance Check
4
+ description: >
5
+ Checks attorneys and paralegals against their weekly timesheet
6
+ submission and minimum billable-hour targets, and flags anyone missing
7
+ or short. Use this if unbilled time has ever quietly leaked out of a
8
+ matter because a timekeeper fell behind on entering hours and nobody
9
+ caught it before the billing cycle closed.
10
+ category: legal
11
+ tags: [legal, timekeeping, billable-hours, compliance]
12
+ schedule: "0 8 * * 1"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v target="{{min_weekly_hours}}" '
17
+ NR==1 {next}
18
+ {
19
+ hours = $3 + 0;
20
+ if ($3 == "" ) {
21
+ printf "MISSING TIMESHEET: %s — week of %s not submitted\n", $1, $2;
22
+ } else if (hours < target) {
23
+ printf "SHORT OF TARGET: %s — week of %s logged %.1f hrs (target %s)\n", $1, $2, hours, target;
24
+ }
25
+ }
26
+ ' "{{timesheets_csv_path}}"
27
+ variables:
28
+ timesheets_csv_path:
29
+ default: "./timekeeper-hours.csv"
30
+ description: "Path to a CSV with columns: timekeeper_name,week_start_date (YYYY-MM-DD),billable_hours_logged (blank if not yet submitted). One row per timekeeper per week."
31
+ min_weekly_hours:
32
+ default: 30
33
+ description: Minimum billable hours expected per timekeeper per week before flagging a shortfall.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: >
36
+ Distinct from any HR timesheet/payroll job — this checks billable-hour
37
+ compliance for legal timekeepers against matter-billing targets, not
38
+ hourly payroll attendance. Export the CSV from your time & billing
39
+ system before each run.
@@ -0,0 +1,43 @@
1
+ id: trademark-infringement-watch
2
+ version: 1
3
+ name: Trademark Infringement Watch
4
+ description: >
5
+ Searches for new trademark applications, domain registrations, and
6
+ marketplace listings that look like they could infringe on your
7
+ registered marks, and summarizes anything worth a closer look. Use
8
+ this if you've ever found out about a confusingly similar competitor
9
+ mark or copycat domain months after it started causing customer
10
+ confusion, instead of when it first appeared.
11
+ category: legal
12
+ tags: [legal, trademark, ip, infringement-watch]
13
+ schedule: "0 9 * * 1"
14
+ timezone: "UTC"
15
+ runner: agent-prompt
16
+ prompt: |
17
+ Check for potential infringement of these registered marks:
18
+ {{marks_to_watch}} (owned in classes/goods: {{goods_or_classes}}).
19
+ 1. Search recent trademark application filings (e.g. via the relevant
20
+ trademark office's public search/TESS-style database) for new marks
21
+ confusingly similar in name or logo, filed in overlapping
22
+ goods/services classes.
23
+ 2. Search for newly registered domain names that are close
24
+ misspellings or lookalikes of {{marks_to_watch}}.
25
+ 3. Spot-check major marketplaces/app stores for listings using the mark
26
+ or a confusing variant without authorization.
27
+ 4. For each hit, summarize: what was found, how similar it is, and
28
+ whether it looks like routine noise or worth flagging to counsel.
29
+ 5. This is a monitoring aid, not legal advice on whether infringement
30
+ exists — say so, and recommend counsel review anything flagged.
31
+ variables:
32
+ marks_to_watch:
33
+ default: "list your registered trademark(s) here"
34
+ description: The registered mark(s)/brand name(s) to watch for lookalikes.
35
+ goods_or_classes:
36
+ default: "your registered goods/services classes"
37
+ description: The goods/services or trademark classes your registration covers, to judge overlap.
38
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
39
+ notes: >
40
+ Distinct from `trademark-renewal-reminder`, which tracks renewing your
41
+ own registration — this watches for others potentially infringing it.
42
+ Search coverage depends on what databases/tools the agent can actually
43
+ reach; a paid watch service will catch more than open search alone.
@@ -0,0 +1,37 @@
1
+ id: vendor-coi-expiry-tracker
2
+ version: 1
3
+ name: Vendor Certificate of Insurance Expiry Tracker
4
+ description: >
5
+ Checks certificates of insurance you've collected from vendors and
6
+ contractors and warns before any expire, so a lapsed COI doesn't sit
7
+ unnoticed in the file. Use this if a vendor's insurance has ever lapsed
8
+ mid-contract and nobody found out until a claim needed it.
9
+ category: legal
10
+ tags: [legal, vendor-management, coi, contractor-compliance]
11
+ schedule: "0 9 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 {
18
+ cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
19
+ cmd | getline exp_ts; close(cmd);
20
+ days_left = int((exp_ts - today) / 86400);
21
+ if (days_left <= warn) print "WARNING: COI for \"" $1 "\" (" $2 ") expires in " days_left " days (" $3 ")";
22
+ }
23
+ ' {{vendor_cois_csv}}
24
+ variables:
25
+ vendor_cois_csv:
26
+ default: "vendor-certificates-of-insurance.csv"
27
+ description: "CSV with header row, columns: vendor_name,coverage_type (e.g. general-liability, workers-comp),expiry_date(YYYY-MM-DD)."
28
+ warn_days:
29
+ default: 30
30
+ description: Days before a vendor's COI expires to start warning.
31
+ compatible_agents: [generic, claude, codex]
32
+ notes: >
33
+ Opposite direction from insurance's `certificate-of-insurance-request-check`
34
+ (which tracks fulfilling requests for your own COI) — this tracks
35
+ certificates other parties gave you, as a contract-compliance/vendor-risk
36
+ check rather than an insurance-desk workflow. Update the CSV whenever a
37
+ vendor sends a new or renewed COI.
@@ -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.