@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.
- package/README.md +16 -30
- package/catalog.json +2294 -26
- package/jobs/ecommerce/affiliate-commission-payout-check.yaml +38 -0
- package/jobs/ecommerce/back-in-stock-notification-backlog-check.yaml +30 -0
- package/jobs/ecommerce/bundle-component-stock-mismatch-check.yaml +37 -0
- package/jobs/ecommerce/chargeback-fraud-risk-order-review.yaml +43 -0
- package/jobs/ecommerce/competitor-price-watch.yaml +60 -0
- package/jobs/ecommerce/economic-nexus-threshold-check.yaml +43 -0
- package/jobs/ecommerce/failed-payment-dunning-check.yaml +35 -0
- package/jobs/ecommerce/marketplace-listing-sync-drift-check.yaml +48 -0
- package/jobs/ecommerce/product-feed-health-check.yaml +35 -0
- package/jobs/ecommerce/purchase-order-overdue-check.yaml +32 -0
- package/jobs/ecommerce/storefront-ssl-domain-expiry-check.yaml +46 -0
- package/jobs/ecommerce/vip-tier-reclassification-check.yaml +55 -0
- package/jobs/ecommerce/wishlist-abandonment-check.yaml +37 -0
- package/jobs/finance/accounts-payable-aging-check.yaml +40 -0
- package/jobs/finance/bank-statement-reconciliation-check.yaml +40 -0
- package/jobs/finance/budget-vs-actual-variance-report.yaml +38 -0
- package/jobs/finance/contractor-1099-threshold-tracker.yaml +43 -0
- package/jobs/finance/credit-utilization-watch.yaml +40 -0
- package/jobs/finance/duplicate-payment-detection.yaml +43 -0
- package/jobs/finance/expense-report-compliance-check.yaml +46 -0
- package/jobs/finance/late-fee-interest-risk-check.yaml +43 -0
- package/jobs/finance/loan-covenant-compliance-check.yaml +37 -0
- package/jobs/finance/month-end-close-checklist-tracker.yaml +39 -0
- package/jobs/finance/multi-account-cash-position-rollup.yaml +45 -0
- package/jobs/finance/petty-cash-float-reconciliation.yaml +43 -0
- package/jobs/finance/quarterly-estimated-tax-calculator.yaml +66 -0
- package/jobs/finance/vendor-early-pay-discount-tracker.yaml +45 -0
- package/jobs/healthcare/appointment-slot-utilization-check.yaml +56 -0
- package/jobs/healthcare/claims-denial-resubmission-check.yaml +43 -0
- package/jobs/healthcare/clinical-supply-low-stock-check.yaml +30 -0
- package/jobs/healthcare/controlled-substance-inventory-reconciliation.yaml +42 -0
- package/jobs/healthcare/hipaa-access-log-audit.yaml +74 -0
- package/jobs/healthcare/patient-balance-collections-aging-check.yaml +41 -0
- package/jobs/healthcare/patient-immunization-schedule-check.yaml +41 -0
- package/jobs/healthcare/patient-portal-message-backlog-check.yaml +39 -0
- package/jobs/healthcare/patient-satisfaction-survey-tracking.yaml +59 -0
- package/jobs/healthcare/prescription-refill-request-backlog-check.yaml +38 -0
- package/jobs/healthcare/prior-authorization-expiry-check.yaml +53 -0
- package/jobs/healthcare/staff-cme-credit-tracking.yaml +41 -0
- package/jobs/healthcare/telehealth-session-issue-check.yaml +51 -0
- package/jobs/hr/aca-fte-threshold-monitor.yaml +44 -0
- package/jobs/hr/cobra-notification-deadline-tracker.yaml +47 -0
- package/jobs/hr/compliance-training-completion-check.yaml +41 -0
- package/jobs/hr/eeo1-filing-deadline-reminder.yaml +37 -0
- package/jobs/hr/handbook-acknowledgment-tracking.yaml +34 -0
- package/jobs/hr/headcount-budget-variance-check.yaml +37 -0
- package/jobs/hr/leave-of-absence-return-tracker.yaml +42 -0
- package/jobs/hr/org-chart-manager-drift-check.yaml +40 -0
- package/jobs/hr/pay-equity-band-outlier-check.yaml +58 -0
- package/jobs/hr/pto-year-end-use-it-or-lose-it-check.yaml +49 -0
- package/jobs/hr/retirement-plan-enrollment-deadline-check.yaml +40 -0
- package/jobs/hr/workers-comp-claim-status-check.yaml +42 -0
- package/jobs/legal/conflict-of-interest-check-tracker.yaml +38 -0
- package/jobs/legal/corporate-minute-book-completeness-check.yaml +31 -0
- package/jobs/legal/data-privacy-request-deadline-tracker.yaml +61 -0
- package/jobs/legal/entity-authority-document-expiry-check.yaml +37 -0
- package/jobs/legal/legal-document-retention-purge-review.yaml +39 -0
- package/jobs/legal/litigation-hold-acknowledgment-tracker.yaml +40 -0
- package/jobs/legal/non-compete-expiry-tracker.yaml +37 -0
- package/jobs/legal/outside-counsel-invoice-budget-check.yaml +37 -0
- package/jobs/legal/settlement-payment-schedule-tracker.yaml +34 -0
- package/jobs/legal/timekeeper-billable-hours-compliance-check.yaml +39 -0
- package/jobs/legal/trademark-infringement-watch.yaml +43 -0
- package/jobs/legal/vendor-coi-expiry-tracker.yaml +37 -0
- package/jobs/realestate/capital-reserve-fund-threshold-check.yaml +32 -0
- package/jobs/realestate/eviction-notice-deadline-tracker.yaml +37 -0
- package/jobs/realestate/landlord-insurance-claim-status-check.yaml +35 -0
- package/jobs/realestate/lease-renewal-offer-window-check.yaml +35 -0
- package/jobs/realestate/maintenance-request-sla-check.yaml +39 -0
- package/jobs/realestate/move-in-move-out-inspection-tracker.yaml +35 -0
- package/jobs/realestate/rent-increase-notice-deadline-check.yaml +54 -0
- package/jobs/realestate/rent-roll-vacancy-loss-report.yaml +32 -0
- package/jobs/realestate/rental-license-renewal-check.yaml +35 -0
- package/jobs/realestate/security-deposit-return-deadline-check.yaml +38 -0
- package/jobs/realestate/tenant-application-review-backlog-check.yaml +35 -0
- package/jobs/realestate/tenant-renters-insurance-compliance-check.yaml +35 -0
- package/jobs/realestate/utility-billback-reconciliation-check.yaml +41 -0
- package/jobs/sales/champion-departure-watch.yaml +44 -0
- package/jobs/sales/closed-lost-reason-audit.yaml +42 -0
- package/jobs/sales/commission-payout-tracker.yaml +32 -0
- package/jobs/sales/contract-renewal-opportunity-tracker.yaml +28 -0
- package/jobs/sales/discount-approval-pending-check.yaml +31 -0
- package/jobs/sales/forecast-submission-compliance-check.yaml +42 -0
- package/jobs/sales/multi-year-renewal-escalation-tracker.yaml +31 -0
- package/jobs/sales/pipeline-hygiene-audit.yaml +26 -0
- package/jobs/sales/poc-trial-conversion-tracker.yaml +29 -0
- package/jobs/sales/referral-followup-tracker.yaml +40 -0
- package/jobs/sales/territory-coverage-gap-check.yaml +43 -0
- package/lib/duplicates-allowlist.js +5 -0
- package/package.json +2 -2
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
id: clinical-supply-low-stock-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Clinical Supply and PPE Low-Stock Check
|
|
4
|
+
description: >
|
|
5
|
+
Scans clinical supply and PPE inventory (gloves, masks, gowns, syringes,
|
|
6
|
+
exam table paper, sanitizer) against reorder thresholds and flags what's
|
|
7
|
+
running low. Use this if a clinic has ever discovered it was out of
|
|
8
|
+
gloves or exam paper mid-morning because nobody was watching stock levels
|
|
9
|
+
between deliveries.
|
|
10
|
+
category: healthcare
|
|
11
|
+
tags: [healthcare, inventory, supplies, ppe, operations]
|
|
12
|
+
schedule: "0 7 * * 1,4"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
($3 + 0) <= ($4 + 0) {
|
|
19
|
+
printf "LOW STOCK: %s (%s) — %d on hand, reorder threshold %d\n", $1, $2, $3, $4;
|
|
20
|
+
}
|
|
21
|
+
' "{{supply_inventory_csv_path}}"
|
|
22
|
+
variables:
|
|
23
|
+
supply_inventory_csv_path:
|
|
24
|
+
default: "./clinical-supply-inventory.csv"
|
|
25
|
+
description: "Path to a CSV with columns: item_name,category,current_qty,reorder_threshold."
|
|
26
|
+
compatible_agents: [generic, claude, codex]
|
|
27
|
+
notes: >
|
|
28
|
+
Zero-token, read-only check. Assumes a maintained inventory export (manual count
|
|
29
|
+
or supply-management software) — this is the "did anyone check the shelf" backstop,
|
|
30
|
+
it doesn't place the reorder itself.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: controlled-substance-inventory-reconciliation
|
|
2
|
+
version: 1
|
|
3
|
+
name: Controlled Substance Inventory Reconciliation
|
|
4
|
+
description: >
|
|
5
|
+
Reviews the practice's controlled-substance dispensing/administration log
|
|
6
|
+
(e.g. in-office injectable opioids, ketamine, testosterone, Schedule II-V
|
|
7
|
+
medications kept on site) for gaps or unreconciled counts. Use this if a
|
|
8
|
+
discrepancy in a controlled-drug count has ever gone unnoticed for weeks
|
|
9
|
+
in a human practice instead of being caught same-day — this covers a
|
|
10
|
+
clinic's own in-office stock, the same DEA-style pattern as
|
|
11
|
+
jobs/veterinary/controlled-substance-log-audit.yaml but for a human
|
|
12
|
+
medical/dental practice rather than an animal clinic, so both are kept as
|
|
13
|
+
separate jobs.
|
|
14
|
+
category: healthcare
|
|
15
|
+
tags: [healthcare, controlled-substances, compliance, audit, dea]
|
|
16
|
+
schedule: "0 20 * * *"
|
|
17
|
+
timezone: "America/New_York"
|
|
18
|
+
runner: agent-prompt
|
|
19
|
+
prompt: |
|
|
20
|
+
Read today's controlled-substance log from {{log_source}} for
|
|
21
|
+
{{substances_tracked}}.
|
|
22
|
+
1. Check that every entry has a matching patient/encounter reference —
|
|
23
|
+
flag any entry missing one.
|
|
24
|
+
2. Compare the running balance against the last physical count on record;
|
|
25
|
+
flag any mismatch.
|
|
26
|
+
3. Flag any day with zero entries logged if the practice was open and
|
|
27
|
+
controlled substances are known to be in regular use — a suspiciously
|
|
28
|
+
quiet log is itself worth a second look.
|
|
29
|
+
4. If everything reconciles, say so in one line.
|
|
30
|
+
variables:
|
|
31
|
+
log_source:
|
|
32
|
+
default: "your controlled-substance log (paper log photographed/transcribed, or e-log system)"
|
|
33
|
+
description: Where the controlled-substance usage log is recorded.
|
|
34
|
+
substances_tracked:
|
|
35
|
+
default: "injectable opioids, ketamine, and other Schedule II-V substances kept on site"
|
|
36
|
+
description: Which substances this log covers.
|
|
37
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
38
|
+
notes: >
|
|
39
|
+
Read-only reconciliation check — does not replace your practice's actual
|
|
40
|
+
DEA-compliant logging system, and any discrepancy found should go through your
|
|
41
|
+
normal reporting/investigation process. Assumes an already-exported or
|
|
42
|
+
transcribed log rather than live PHI system access.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
id: hipaa-access-log-audit
|
|
2
|
+
version: 1
|
|
3
|
+
name: HIPAA Chart Access Log Audit
|
|
4
|
+
description: >
|
|
5
|
+
Scans the EHR's chart-access log for high-volume, off-hours, or otherwise
|
|
6
|
+
unusual access patterns and has an agent judge which are worth a closer
|
|
7
|
+
look. Use this if unauthorized or curious chart access (a coworker's
|
|
8
|
+
family member, a local celebrity, an ex-spouse) has ever gone unnoticed
|
|
9
|
+
because nobody was reviewing the access log until an audit or complaint
|
|
10
|
+
forced it.
|
|
11
|
+
category: healthcare
|
|
12
|
+
tags: [healthcare, hipaa, compliance, audit, security]
|
|
13
|
+
schedule: "0 7 * * 1"
|
|
14
|
+
timezone: "America/New_York"
|
|
15
|
+
runner: hybrid
|
|
16
|
+
command: >
|
|
17
|
+
awk -F',' -v threshold="{{daily_access_threshold}}" -v off_start="{{off_hours_start}}" -v off_end="{{off_hours_end}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
{
|
|
20
|
+
day = substr($3,1,10); hour = substr($3,12,2) + 0;
|
|
21
|
+
key = $1 SUBSEP day;
|
|
22
|
+
count[key]++;
|
|
23
|
+
staffname[key] = $1; dayval[key] = day;
|
|
24
|
+
if (hour >= off_start || hour < off_end) {
|
|
25
|
+
printf "OFF-HOURS ACCESS: %s accessed %s at %s (action: %s)\n", $1, $2, $3, $4;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
END {
|
|
29
|
+
for (k in count) {
|
|
30
|
+
if (count[k] > threshold) {
|
|
31
|
+
printf "HIGH-VOLUME ACCESS: %s accessed %d distinct log entries on %s (threshold %d)\n", staffname[k], count[k], dayval[k], threshold;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
' "{{access_log_csv_path}}"
|
|
36
|
+
prompt: |
|
|
37
|
+
Run the flagged entries from the access-log scan above (high-volume days
|
|
38
|
+
and off-hours access events) through a closer read.
|
|
39
|
+
1. For each flagged staff member/day, look at which patient records were
|
|
40
|
+
touched and whether the access pattern looks consistent with normal
|
|
41
|
+
clinical or front-desk duties for that role (e.g. a nurse pulling
|
|
42
|
+
charts for today's patient panel) versus inconsistent with it (e.g.
|
|
43
|
+
access to a patient not on that staff member's schedule, repeated
|
|
44
|
+
access to the same non-assigned patient, or a name match suggesting a
|
|
45
|
+
coworker, family member, or public figure).
|
|
46
|
+
2. Rank flags from "likely benign, no action" to "recommend compliance
|
|
47
|
+
officer review."
|
|
48
|
+
3. Do not name a possible relationship as fact — describe the pattern
|
|
49
|
+
observed and let a human confirm it.
|
|
50
|
+
4. If nothing stands out beyond routine volume, say so in one line.
|
|
51
|
+
variables:
|
|
52
|
+
access_log_csv_path:
|
|
53
|
+
default: "./chart-access-log.csv"
|
|
54
|
+
description: "Path to a CSV with columns: staff_name,patient_name,access_timestamp (YYYY-MM-DD HH:MM),action (view/edit/print)."
|
|
55
|
+
daily_access_threshold:
|
|
56
|
+
default: 40
|
|
57
|
+
description: Number of chart access events by one staff member in one day that triggers a high-volume flag.
|
|
58
|
+
off_hours_start:
|
|
59
|
+
default: 20
|
|
60
|
+
description: Hour (0-23, local clinic time) after which access counts as off-hours.
|
|
61
|
+
off_hours_end:
|
|
62
|
+
default: 6
|
|
63
|
+
description: Hour (0-23) before which access still counts as off-hours.
|
|
64
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
65
|
+
script_note: >
|
|
66
|
+
The command gives you the raw high-volume and off-hours flags for free, purely
|
|
67
|
+
from counts and timestamps. Only the prompt pass can judge whether a flagged
|
|
68
|
+
pattern looks like inappropriate snooping versus legitimate clinical coverage —
|
|
69
|
+
that judgment call is what the LLM pass adds.
|
|
70
|
+
notes: >
|
|
71
|
+
Assumes an already-exported, de-identified-where-possible access log rather than
|
|
72
|
+
live EHR/PHI system access — export staff name, patient identifier, timestamp,
|
|
73
|
+
and action only. Any confirmed concern should go through your practice's actual
|
|
74
|
+
HIPAA compliance/privacy officer process, not this job.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: patient-balance-collections-aging-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Overdue Patient Balance Aging Check
|
|
4
|
+
description: >
|
|
5
|
+
Buckets outstanding self-pay patient balances by how long they've been
|
|
6
|
+
unpaid (30/60/90+ days) and flags the oldest ones for collections
|
|
7
|
+
follow-up. Use this if patient balances have ever quietly aged past the
|
|
8
|
+
point of easy recovery because nobody was reviewing accounts receivable
|
|
9
|
+
by age, only by total dollar amount.
|
|
10
|
+
category: healthcare
|
|
11
|
+
tags: [healthcare, billing, collections, accounts-receivable, patients]
|
|
12
|
+
schedule: "0 8 1,15 * *"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v flag_days="{{flag_after_days}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline invoice_epoch; close(cmd);
|
|
22
|
+
age_days = (today - invoice_epoch) / 86400;
|
|
23
|
+
bucket = (age_days < 30) ? "current" : (age_days < 60) ? "30-59" : (age_days < 90) ? "60-89" : "90+";
|
|
24
|
+
if (age_days >= flag_days) {
|
|
25
|
+
printf "OVERDUE BALANCE: %s — $%s, invoiced %s (%d days, bucket %s)\n", $1, $2, $3, age_days, bucket;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{patient_balances_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
patient_balances_csv_path:
|
|
31
|
+
default: "./patient-balances.csv"
|
|
32
|
+
description: "Path to a CSV with columns: patient_name,balance_amount,invoice_date (YYYY-MM-DD)."
|
|
33
|
+
flag_after_days:
|
|
34
|
+
default: 60
|
|
35
|
+
description: Days since invoicing before an unpaid balance is flagged for collections follow-up.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Assumes an already-exported CSV from your billing/practice-management system
|
|
39
|
+
rather than live PHI system access. Read-only aging report — actual collections
|
|
40
|
+
outreach should follow your practice's billing/compliance policy (e.g. FDCPA-style
|
|
41
|
+
notice requirements where applicable).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: patient-immunization-schedule-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Patient Immunization Schedule Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks which patients are due or overdue for a scheduled immunization and
|
|
6
|
+
lists them for outreach. Use this if a patient (child or adult) has ever
|
|
7
|
+
fallen behind on a vaccine series because nobody was tracking due dates
|
|
8
|
+
against the immunization schedule between visits — this is for human
|
|
9
|
+
patients, distinct from jobs/veterinary/pet-vaccine-due-reminder.yaml
|
|
10
|
+
which tracks pet vaccines at an animal clinic.
|
|
11
|
+
category: healthcare
|
|
12
|
+
tags: [healthcare, immunization, vaccine, patients, preventive-care]
|
|
13
|
+
schedule: "0 8 * * *"
|
|
14
|
+
timezone: "America/New_York"
|
|
15
|
+
runner: shell
|
|
16
|
+
command: >
|
|
17
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline due_epoch; close(cmd);
|
|
22
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
23
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
24
|
+
if (diff_days <= days) {
|
|
25
|
+
printf "IMMUNIZATION DUE: %s — %s due %s (%d days)\n", $1, $4, $3, diff_days;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{patients_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
patients_csv_path:
|
|
31
|
+
default: "./patient-immunizations.csv"
|
|
32
|
+
description: "Path to a CSV with columns: patient_name,date_of_birth,due_date (YYYY-MM-DD),vaccine_name."
|
|
33
|
+
warn_days_before:
|
|
34
|
+
default: 21
|
|
35
|
+
description: How many days before (or past) the due date to start listing.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Assumes an already-exported CSV from your EHR/immunization registry rather than
|
|
39
|
+
live PHI system access. Read-only backstop check — cross-verify against your
|
|
40
|
+
state immunization registry before contacting patients, since due dates can shift
|
|
41
|
+
based on catch-up schedules.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
id: patient-portal-message-backlog-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Patient Portal Message Backlog Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks unanswered patient portal messages against a response-time SLA and
|
|
6
|
+
flags anything overdue. Use this if a patient message has ever sat
|
|
7
|
+
unanswered in the portal inbox for days because it scrolled off the top
|
|
8
|
+
of a busy staff member's queue and nobody was tracking age.
|
|
9
|
+
category: healthcare
|
|
10
|
+
tags: [healthcare, patient-portal, messaging, sla, patients]
|
|
11
|
+
schedule: "0 */2 * * 1-6"
|
|
12
|
+
timezone: "America/New_York"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
now=$(date +%s);
|
|
16
|
+
awk -F',' -v now="$now" -v sla="{{sla_hours}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 == "unanswered" {
|
|
19
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $2 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline received_epoch; close(cmd);
|
|
21
|
+
age_hours = (now - received_epoch) / 3600;
|
|
22
|
+
if (age_hours >= sla) {
|
|
23
|
+
printf "OVERDUE MESSAGE: %s — \"%s\" received %s (%d hrs ago, unanswered)\n", $1, $3, $2, age_hours;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{portal_messages_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
portal_messages_csv_path:
|
|
29
|
+
default: "./portal-messages.csv"
|
|
30
|
+
description: "Path to a CSV with columns: patient_name,received_at (YYYY-MM-DD HH:MM),subject,status (unanswered/answered)."
|
|
31
|
+
sla_hours:
|
|
32
|
+
default: 24
|
|
33
|
+
description: Hours a message can go unanswered before it's flagged overdue.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: >
|
|
36
|
+
Assumes an already-exported CSV from your patient portal/EHR messaging module
|
|
37
|
+
rather than live access to message content — export subject lines only if full
|
|
38
|
+
message bodies raise PHI-export concerns for your practice. Read-only — does not
|
|
39
|
+
reply to patients.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
id: patient-satisfaction-survey-tracking
|
|
2
|
+
version: 1
|
|
3
|
+
name: Patient Satisfaction Survey Response Tracking
|
|
4
|
+
description: >
|
|
5
|
+
Tallies patient satisfaction survey response rates and surfaces low
|
|
6
|
+
scores with comments for follow-up. Use this if low-scoring survey
|
|
7
|
+
responses have ever sat unread in an inbox, or a slipping response rate
|
|
8
|
+
went unnoticed for months — distinct from generic online reviews, this
|
|
9
|
+
tracks a practice's own post-visit survey instrument.
|
|
10
|
+
category: healthcare
|
|
11
|
+
tags: [healthcare, patient-satisfaction, survey, feedback, patients]
|
|
12
|
+
schedule: "0 9 * * 1"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: hybrid
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v low="{{low_score_threshold}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{ sent++; }
|
|
19
|
+
$3 != "" { responded++; }
|
|
20
|
+
($3 != "" && $4 != "" && ($4+0) <= low) {
|
|
21
|
+
printf "LOW SCORE: %s — score %s: \"%s\" (responded %s)\n", $1, $4, $5, $3;
|
|
22
|
+
}
|
|
23
|
+
END {
|
|
24
|
+
rate = (sent > 0) ? (responded / sent * 100) : 0;
|
|
25
|
+
printf "RESPONSE RATE: %d/%d sent (%.1f%%)\n", responded, sent, rate;
|
|
26
|
+
}
|
|
27
|
+
' "{{survey_csv_path}}"
|
|
28
|
+
prompt: |
|
|
29
|
+
Look at the low-score rows and comments flagged by the tally above (from
|
|
30
|
+
{{survey_csv_path}}).
|
|
31
|
+
1. Group the comments into common themes (e.g. wait time, billing
|
|
32
|
+
confusion, communication, front-desk experience).
|
|
33
|
+
2. For each theme, note how many respondents mentioned it and give one
|
|
34
|
+
representative quote.
|
|
35
|
+
3. For any response that names a specific, addressable problem, draft a
|
|
36
|
+
short, warm outreach note to that patient acknowledging the feedback —
|
|
37
|
+
draft-only, for staff to review before sending.
|
|
38
|
+
4. If the response rate this run is notably lower than
|
|
39
|
+
{{expected_response_rate}}%, flag that as worth investigating
|
|
40
|
+
separately from the score themes.
|
|
41
|
+
variables:
|
|
42
|
+
survey_csv_path:
|
|
43
|
+
default: "./patient-satisfaction-surveys.csv"
|
|
44
|
+
description: "Path to a CSV with columns: patient_name,visit_date,response_date (blank if no response),score (1-5, blank if no response),comment."
|
|
45
|
+
low_score_threshold:
|
|
46
|
+
default: 3
|
|
47
|
+
description: Scores at or below this value are flagged as low.
|
|
48
|
+
expected_response_rate:
|
|
49
|
+
default: 25
|
|
50
|
+
description: Expected survey response rate (%) — used only as a reference point for flagging an unusually low run.
|
|
51
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
52
|
+
script_note: >
|
|
53
|
+
The command gives you the response rate and raw low-score rows for free. Only the
|
|
54
|
+
prompt pass groups comments into themes and drafts a tactful outreach note to an
|
|
55
|
+
unhappy patient — that synthesis is what the LLM pass adds.
|
|
56
|
+
notes: >
|
|
57
|
+
Assumes an already-exported CSV from your survey tool (e.g. post-visit SMS/email
|
|
58
|
+
survey) rather than live PHI system access. Outreach drafts must be reviewed by
|
|
59
|
+
staff before sending.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: prescription-refill-request-backlog-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Prescription Refill Request Backlog Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks pending prescription refill requests against how long they've been
|
|
6
|
+
waiting and flags anything past a reasonable turnaround. Use this if a
|
|
7
|
+
refill request has ever sat in a queue long enough that a patient ran out
|
|
8
|
+
of a maintenance medication before the practice got to it.
|
|
9
|
+
category: healthcare
|
|
10
|
+
tags: [healthcare, prescriptions, refills, patients, medication]
|
|
11
|
+
schedule: "0 9,15 * * 1-5"
|
|
12
|
+
timezone: "America/New_York"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v hours="{{escalate_after_hours}}" '
|
|
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 requested_epoch; close(cmd);
|
|
21
|
+
age_hours = (today - requested_epoch) / 3600;
|
|
22
|
+
if (age_hours >= hours) {
|
|
23
|
+
printf "REFILL PENDING: %s — %s requested %s (%d hrs ago)\n", $1, $2, $3, age_hours;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{refill_requests_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
refill_requests_csv_path:
|
|
29
|
+
default: "./refill-requests.csv"
|
|
30
|
+
description: "Path to a CSV with columns: patient_name,medication,requested_date (YYYY-MM-DD),status (pending/approved/denied)."
|
|
31
|
+
escalate_after_hours:
|
|
32
|
+
default: 48
|
|
33
|
+
description: Hours a refill request can sit pending before it's flagged.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: >
|
|
36
|
+
Assumes an already-exported CSV from your e-prescribing/EHR system rather than
|
|
37
|
+
live PHI system access. Read-only triage — actual approval/denial of a refill is a
|
|
38
|
+
clinical decision made by the prescriber, not this job.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
id: prior-authorization-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Prior Authorization Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks treatment-specific prior-authorization requests for approvals about
|
|
6
|
+
to expire before the procedure happens, and for requests still stuck
|
|
7
|
+
awaiting payer response. Use this if a procedure has ever been delayed or
|
|
8
|
+
denied because the prior auth expired, or the payer never responded and
|
|
9
|
+
nobody was tracking it — distinct from insurance-eligibility-verification-check,
|
|
10
|
+
which covers general visit eligibility rather than a specific treatment's
|
|
11
|
+
authorization.
|
|
12
|
+
category: healthcare
|
|
13
|
+
tags: [healthcare, prior-authorization, billing, insurance, compliance]
|
|
14
|
+
schedule: "0 9 * * 1-5"
|
|
15
|
+
timezone: "America/New_York"
|
|
16
|
+
runner: shell
|
|
17
|
+
command: >
|
|
18
|
+
today=$(date +%s);
|
|
19
|
+
awk -F',' -v today="$today" -v warn_days="{{warn_days_before_expiry}}" -v stale_days="{{pending_stale_days}}" '
|
|
20
|
+
NR==1 {next}
|
|
21
|
+
{
|
|
22
|
+
if ($4 == "approved" && $6 != "") {
|
|
23
|
+
cmd = "date -d \"" $6 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $6 "\" +%s 2>/dev/null";
|
|
24
|
+
cmd | getline expiry_epoch; close(cmd);
|
|
25
|
+
diff_days = (expiry_epoch - today) / 86400;
|
|
26
|
+
if (diff_days <= warn_days) {
|
|
27
|
+
printf "AUTH EXPIRING: %s — %s (%s) expires %s (%d days)\n", $1, $2, $3, $6, diff_days;
|
|
28
|
+
}
|
|
29
|
+
} else if ($4 == "pending") {
|
|
30
|
+
cmd = "date -d \"" $5 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $5 "\" +%s 2>/dev/null";
|
|
31
|
+
cmd | getline submitted_epoch; close(cmd);
|
|
32
|
+
pending_days = (today - submitted_epoch) / 86400;
|
|
33
|
+
if (pending_days >= stale_days) {
|
|
34
|
+
printf "AUTH STUCK PENDING: %s — %s (%s) submitted %s (%d days, no payer decision)\n", $1, $2, $3, $5, pending_days;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
' "{{prior_auth_csv_path}}"
|
|
39
|
+
variables:
|
|
40
|
+
prior_auth_csv_path:
|
|
41
|
+
default: "./prior-authorizations.csv"
|
|
42
|
+
description: "Path to a CSV with columns: patient_name,procedure,payer,status (pending/approved/denied),submitted_date (YYYY-MM-DD),auth_expiry_date (YYYY-MM-DD, blank if still pending)."
|
|
43
|
+
warn_days_before_expiry:
|
|
44
|
+
default: 14
|
|
45
|
+
description: How many days before an approved auth expires to start warning.
|
|
46
|
+
pending_stale_days:
|
|
47
|
+
default: 10
|
|
48
|
+
description: Days a request can sit pending with no payer decision before it's flagged as stuck.
|
|
49
|
+
compatible_agents: [generic, claude, codex]
|
|
50
|
+
notes: >
|
|
51
|
+
Assumes an already-exported CSV from your billing/prior-auth tracking system rather
|
|
52
|
+
than live EHR or payer-portal access. Read-only — this flags what needs a call to
|
|
53
|
+
the payer, it doesn't submit or chase the request itself.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: staff-cme-credit-tracking
|
|
2
|
+
version: 1
|
|
3
|
+
name: Staff CME Credit Tracking
|
|
4
|
+
description: >
|
|
5
|
+
Checks each clinician's continuing medical education (CME) credit hours
|
|
6
|
+
completed against what's required by their cycle end date and warns
|
|
7
|
+
before anyone falls short. Use this if a provider has ever discovered
|
|
8
|
+
close to renewal that they were short on CME hours needed to keep their
|
|
9
|
+
license active — distinct from license-credential-expiry-check, which
|
|
10
|
+
tracks the license's own expiry date rather than the ongoing education
|
|
11
|
+
requirement to renew it.
|
|
12
|
+
category: healthcare
|
|
13
|
+
tags: [healthcare, cme, compliance, licensing, staff]
|
|
14
|
+
schedule: "0 8 1 * *"
|
|
15
|
+
timezone: "America/New_York"
|
|
16
|
+
runner: shell
|
|
17
|
+
command: >
|
|
18
|
+
today=$(date +%s);
|
|
19
|
+
awk -F',' -v today="$today" -v warn_days="{{warn_days_before_cycle_end}}" '
|
|
20
|
+
NR==1 {next}
|
|
21
|
+
{
|
|
22
|
+
cmd = "date -d \"" $5 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $5 "\" +%s 2>/dev/null";
|
|
23
|
+
cmd | getline cycle_end_epoch; close(cmd);
|
|
24
|
+
diff_days = (cycle_end_epoch - today) / 86400;
|
|
25
|
+
shortfall = ($4 + 0) - ($3 + 0);
|
|
26
|
+
if (diff_days <= warn_days && shortfall > 0) {
|
|
27
|
+
printf "CME SHORTFALL: %s — %d/%d hours completed, %d short, cycle ends %s (%d days)\n", $1, $3, $4, shortfall, $5, diff_days;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
' "{{cme_tracking_csv_path}}"
|
|
31
|
+
variables:
|
|
32
|
+
cme_tracking_csv_path:
|
|
33
|
+
default: "./staff-cme-credits.csv"
|
|
34
|
+
description: "Path to a CSV with columns: staff_name,license_type,cme_hours_completed,cme_hours_required,cycle_end_date (YYYY-MM-DD)."
|
|
35
|
+
warn_days_before_cycle_end:
|
|
36
|
+
default: 90
|
|
37
|
+
description: How many days before the CME cycle ends to start warning about a shortfall.
|
|
38
|
+
compatible_agents: [generic, claude, codex]
|
|
39
|
+
notes: >
|
|
40
|
+
Assumes a maintained CSV export from your CME tracking or HR/credentialing
|
|
41
|
+
system, updated whenever a provider logs completed CME hours.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
id: telehealth-session-issue-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Telehealth Session No-Show/Tech-Failure Check
|
|
4
|
+
description: >
|
|
5
|
+
Reviews recent telehealth appointments for no-shows and technical-failure
|
|
6
|
+
disconnects, and flags patients hitting either problem repeatedly. Use
|
|
7
|
+
this if a telehealth visit has ever quietly failed to happen — patient
|
|
8
|
+
never joined, or the call dropped and was never rebooked — with nobody
|
|
9
|
+
tracking it the way an in-person no-show would normally get tracked.
|
|
10
|
+
category: healthcare
|
|
11
|
+
tags: [healthcare, telehealth, no-show, appointments, patients]
|
|
12
|
+
schedule: "0 18 * * *"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v lookback="{{lookback_days}}" -v repeat_threshold="{{repeat_issue_threshold}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline appt_epoch; close(cmd);
|
|
22
|
+
age_days = (today - appt_epoch) / 86400;
|
|
23
|
+
if (age_days < 0 || age_days > lookback) next;
|
|
24
|
+
if ($3 == "no-show" || $3 == "tech-failure" || $3 == "disconnected") {
|
|
25
|
+
printf "SESSION ISSUE: %s — %s on %s (%s)\n", $1, $3, $2, $4;
|
|
26
|
+
count[$1]++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
END {
|
|
30
|
+
for (p in count) {
|
|
31
|
+
if (count[p] >= repeat_threshold) {
|
|
32
|
+
printf "REPEAT ISSUE: %s has had %d telehealth issues in the last %d days\n", p, count[p], lookback;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
' "{{telehealth_sessions_csv_path}}"
|
|
37
|
+
variables:
|
|
38
|
+
telehealth_sessions_csv_path:
|
|
39
|
+
default: "./telehealth-sessions.csv"
|
|
40
|
+
description: "Path to a CSV with columns: patient_name,appointment_date (YYYY-MM-DD),status (completed/no-show/tech-failure/disconnected),provider_name."
|
|
41
|
+
lookback_days:
|
|
42
|
+
default: 7
|
|
43
|
+
description: How many days back to review telehealth sessions.
|
|
44
|
+
repeat_issue_threshold:
|
|
45
|
+
default: 2
|
|
46
|
+
description: Number of session issues within the lookback window before a patient is flagged as a repeat case (may need an in-person alternative offered).
|
|
47
|
+
compatible_agents: [generic, claude, codex]
|
|
48
|
+
notes: >
|
|
49
|
+
Assumes an already-exported CSV from your telehealth platform or scheduling
|
|
50
|
+
system rather than live PHI system access. Read-only — repeat cases are worth
|
|
51
|
+
offering an in-person or phone alternative rather than retrying video indefinitely.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
id: aca-fte-threshold-monitor
|
|
2
|
+
version: 1
|
|
3
|
+
name: ACA Full-Time-Equivalent Threshold Monitor
|
|
4
|
+
description: >
|
|
5
|
+
Estimates the company's total ACA full-time-equivalent count from a
|
|
6
|
+
headcount/hours export and warns when it's approaching the Applicable
|
|
7
|
+
Large Employer threshold. Use this if the company has ever crossed 50
|
|
8
|
+
FTEs without anyone noticing until a compliance filing requirement
|
|
9
|
+
suddenly applied.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, aca, compliance, headcount]
|
|
12
|
+
schedule: "0 8 1 * *"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v threshold="{{fte_threshold}}" -v buffer="{{warn_buffer}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$2 == "full-time" {ft_count++; next}
|
|
19
|
+
{pt_hours += $3}
|
|
20
|
+
END {
|
|
21
|
+
pt_fte = pt_hours / 120;
|
|
22
|
+
total_fte = ft_count + pt_fte;
|
|
23
|
+
printf "Full-time headcount: %d, part-time/variable FTE-equivalent: %.1f, total ACA FTE estimate: %.1f\n", ft_count, pt_fte, total_fte;
|
|
24
|
+
if (total_fte >= (threshold - buffer)) {
|
|
25
|
+
printf "WARNING: total FTE estimate %.1f is within %d of the ALE threshold of %d — review ACA Applicable Large Employer status.\n", total_fte, buffer, threshold;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{aca_headcount_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
aca_headcount_csv_path:
|
|
31
|
+
default: "./aca-headcount-hours.csv"
|
|
32
|
+
description: "Path to a CSV with columns: employee_name,employment_type (full-time/part-time/variable),monthly_hours (only used for non-full-time rows)."
|
|
33
|
+
fte_threshold:
|
|
34
|
+
default: 50
|
|
35
|
+
description: The ACA Applicable Large Employer FTE threshold to watch for (50 under current federal rules; confirm against current law).
|
|
36
|
+
warn_buffer:
|
|
37
|
+
default: 5
|
|
38
|
+
description: How close to the threshold (in FTE count) triggers a warning.
|
|
39
|
+
compatible_agents: [generic, claude, codex]
|
|
40
|
+
notes: >
|
|
41
|
+
This is a rough monthly estimate using the standard 120-hours-per-month
|
|
42
|
+
divisor for part-time/variable-hour employees, not a substitute for the
|
|
43
|
+
IRS's official monthly measurement method — consult counsel/a benefits
|
|
44
|
+
advisor before relying on it for actual ALE determination.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
id: cobra-notification-deadline-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: COBRA Notification Deadline Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags terminated employees who are approaching or past the deadline for
|
|
6
|
+
their COBRA election notice with no notice sent on record. Use this if
|
|
7
|
+
a COBRA notice has ever gone out late — or not at all — because
|
|
8
|
+
offboarding paperwork got deprioritized once the employee's last day
|
|
9
|
+
had already passed.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, cobra, offboarding, compliance, benefits]
|
|
12
|
+
schedule: "0 8 * * 1-5"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v deadline_days="{{notice_deadline_days}}" -v warn="{{warn_days_before}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$3 != "" {next}
|
|
20
|
+
{
|
|
21
|
+
cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $2 "\" +%s 2>/dev/null";
|
|
22
|
+
cmd | getline term_epoch; close(cmd);
|
|
23
|
+
days_since_term = (today - term_epoch) / 86400;
|
|
24
|
+
days_left = deadline_days - days_since_term;
|
|
25
|
+
if (days_left < 0) {
|
|
26
|
+
printf "COBRA NOTICE OVERDUE: %s — terminated %s, %d day(s) past the %d-day notice deadline, no notice sent\n", $1, $2, -days_left, deadline_days;
|
|
27
|
+
} else if (days_left <= warn) {
|
|
28
|
+
printf "COBRA NOTICE DUE: %s — terminated %s, %d day(s) left of the %d-day notice deadline, no notice sent\n", $1, $2, days_left, deadline_days;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
' "{{cobra_tracking_csv_path}}"
|
|
32
|
+
variables:
|
|
33
|
+
cobra_tracking_csv_path:
|
|
34
|
+
default: "./cobra-tracking.csv"
|
|
35
|
+
description: "Path to a CSV with columns: employee_name,termination_date (YYYY-MM-DD),notice_sent_date (blank if not yet sent)."
|
|
36
|
+
notice_deadline_days:
|
|
37
|
+
default: 44
|
|
38
|
+
description: Days from the qualifying event (termination) to get the COBRA election notice out, per your plan's timeline (federal rules generally allow up to 44 days combined; confirm against your plan administrator's actual deadline).
|
|
39
|
+
warn_days_before:
|
|
40
|
+
default: 10
|
|
41
|
+
description: How many days before the deadline to start flagging as due.
|
|
42
|
+
compatible_agents: [generic, claude, codex]
|
|
43
|
+
notes: >
|
|
44
|
+
Federal COBRA timelines and state mini-COBRA rules vary — confirm the
|
|
45
|
+
actual notice_deadline_days with your plan administrator or counsel
|
|
46
|
+
rather than relying on the default. Assumes an already-exported
|
|
47
|
+
termination/notice CSV rather than live benefits-system access.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: compliance-training-completion-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Compliance Training Completion Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags employees with a required compliance training (harassment
|
|
6
|
+
prevention, safety cert, data-privacy, etc.) approaching or past its due
|
|
7
|
+
date with no completion on record. Use this if a training deadline has
|
|
8
|
+
ever been missed and only surfaced when a regulator or auditor asked for
|
|
9
|
+
proof of completion.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, compliance, training, deadline]
|
|
12
|
+
schedule: "0 8 * * 1"
|
|
13
|
+
timezone: "America/New_York"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$4 != "" {next}
|
|
19
|
+
{
|
|
20
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
21
|
+
cmd | getline due_epoch; close(cmd);
|
|
22
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
23
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
24
|
+
if (diff_days <= days) {
|
|
25
|
+
printf "TRAINING DUE: %s — \"%s\" due %s (%d days), not completed\n", $1, $2, $3, diff_days;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{training_tracking_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
training_tracking_csv_path:
|
|
31
|
+
default: "./compliance-training-tracking.csv"
|
|
32
|
+
description: "Path to a CSV with columns: employee_name,training_name,due_date (YYYY-MM-DD),completed_date (blank if not yet done). One row per required training per employee."
|
|
33
|
+
warn_days_before:
|
|
34
|
+
default: 14
|
|
35
|
+
description: How many days before a training's due date to start warning.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Assumes a maintained export from your LMS/HRIS listing one row per
|
|
39
|
+
employee per required training. Distinct from new-hire-paperwork-check,
|
|
40
|
+
which covers one-time onboarding documents rather than recurring/annual
|
|
41
|
+
compliance training.
|