@wonsukchoi/crondex 0.22.0 → 0.23.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 -15
- package/catalog.json +4839 -118
- package/jobs/automotive/ase-certification-expiry-check.yaml +36 -0
- package/jobs/automotive/csi-score-monitor.yaml +33 -0
- package/jobs/automotive/customer-pay-warranty-pay-mix-tracker.yaml +47 -0
- package/jobs/automotive/fi-product-attachment-rate-tracker.yaml +39 -0
- package/jobs/automotive/loaner-fleet-availability-check.yaml +40 -0
- package/jobs/automotive/manufacturer-recall-notice-check.yaml +39 -0
- package/jobs/automotive/parts-reorder-point-check.yaml +36 -0
- package/jobs/automotive/repair-cycle-time-trend-monitor.yaml +42 -0
- package/jobs/automotive/service-appointment-no-show-tracker.yaml +38 -0
- package/jobs/automotive/service-bay-utilization-check.yaml +38 -0
- package/jobs/automotive/shop-supply-reorder-check.yaml +31 -0
- package/jobs/automotive/trade-in-appraisal-variance-check.yaml +39 -0
- package/jobs/automotive/used-vehicle-inventory-aging-check.yaml +35 -0
- package/jobs/construction/critical-path-material-lead-time-review.yaml +43 -0
- package/jobs/construction/daily-jobsite-log-compliance-check.yaml +34 -0
- package/jobs/construction/equipment-utilization-cost-check.yaml +35 -0
- package/jobs/construction/heavy-equipment-inspection-compliance-check.yaml +34 -0
- package/jobs/construction/jobsite-safety-incident-near-miss-tracker.yaml +35 -0
- package/jobs/construction/lien-waiver-collection-tracker.yaml +27 -0
- package/jobs/construction/permit-application-approval-backlog-check.yaml +33 -0
- package/jobs/construction/project-budget-variance-check.yaml +34 -0
- package/jobs/construction/punch-list-completion-tracker.yaml +36 -0
- package/jobs/construction/retainage-holdback-release-tracker.yaml +33 -0
- package/jobs/construction/rfi-response-time-tracker.yaml +33 -0
- package/jobs/construction/subcontractor-pay-application-approval-tracker.yaml +35 -0
- package/jobs/construction/submittal-shop-drawing-review-check.yaml +45 -0
- package/jobs/construction/weather-delay-impact-log.yaml +44 -0
- package/jobs/education/chronic-absenteeism-tracker.yaml +34 -0
- package/jobs/education/department-budget-variance-check.yaml +37 -0
- package/jobs/education/enrollment-withdrawal-trend-tracker.yaml +39 -0
- package/jobs/education/facility-work-order-backlog-check.yaml +34 -0
- package/jobs/education/free-reduced-lunch-eligibility-renewal-check.yaml +36 -0
- package/jobs/education/iep-504-review-deadline-tracker.yaml +35 -0
- package/jobs/education/parent-teacher-conference-noshow-tracker.yaml +29 -0
- package/jobs/education/school-bus-route-ontime-check.yaml +40 -0
- package/jobs/education/standardized-test-registration-deadline-check.yaml +35 -0
- package/jobs/education/substitute-teacher-fill-rate-tracker.yaml +35 -0
- package/jobs/education/teacher-certification-expiry-tracker.yaml +35 -0
- package/jobs/education/textbook-inventory-shortage-check.yaml +32 -0
- package/jobs/fleet/accident-incident-report-tracker.yaml +34 -0
- package/jobs/fleet/driver-mvr-review-tracker.yaml +34 -0
- package/jobs/fleet/driver-safety-score-monitor.yaml +39 -0
- package/jobs/fleet/ev-battery-health-check.yaml +36 -0
- package/jobs/fleet/fuel-efficiency-trend-monitor.yaml +33 -0
- package/jobs/fleet/geofence-violation-check.yaml +37 -0
- package/jobs/fleet/lease-return-condition-check.yaml +33 -0
- package/jobs/fleet/tire-wear-replacement-check.yaml +30 -0
- package/jobs/fleet/toll-violation-tracker.yaml +34 -0
- package/jobs/fleet/vehicle-pool-scheduling-conflict-check.yaml +37 -0
- package/jobs/fleet/vehicle-tco-tracker.yaml +41 -0
- package/jobs/fleet/vehicle-utilization-rate-check.yaml +37 -0
- package/jobs/growth/cohort-retention-curve-monitor.yaml +39 -0
- package/jobs/growth/customer-health-score-monitor.yaml +37 -0
- package/jobs/growth/dau-mau-engagement-ratio-check.yaml +39 -0
- package/jobs/growth/dormant-account-reactivation-check.yaml +39 -0
- package/jobs/growth/expansion-revenue-opportunity-tracker.yaml +44 -0
- package/jobs/growth/feature-adoption-rate-tracker.yaml +44 -0
- package/jobs/growth/nps-trend-tracker.yaml +40 -0
- package/jobs/growth/onboarding-funnel-dropoff-check.yaml +39 -0
- package/jobs/growth/paywall-upgrade-prompt-conversion-check.yaml +40 -0
- package/jobs/growth/product-qualified-lead-tracker.yaml +42 -0
- package/jobs/growth/referral-program-performance-tracker.yaml +35 -0
- package/jobs/growth/trial-to-paid-conversion-rate-tracker.yaml +48 -0
- package/jobs/growth/winback-reactivation-campaign-tracker.yaml +46 -0
- package/jobs/hospitality/adr-revpar-tracker.yaml +43 -0
- package/jobs/hospitality/cancellation-rate-spike-check.yaml +21 -0
- package/jobs/hospitality/group-booking-space-utilization-check.yaml +40 -0
- package/jobs/hospitality/guest-complaint-sla-tracker.yaml +34 -0
- package/jobs/hospitality/guest-satisfaction-score-monitor.yaml +41 -0
- package/jobs/hospitality/linen-inventory-turnover-check.yaml +35 -0
- package/jobs/hospitality/loyalty-points-reconciliation-check.yaml +33 -0
- package/jobs/hospitality/minibar-charge-reconciliation-check.yaml +38 -0
- package/jobs/hospitality/occupancy-forecast-variance-check.yaml +33 -0
- package/jobs/hospitality/ota-rate-parity-check.yaml +36 -0
- package/jobs/hospitality/overbooking-risk-alert.yaml +38 -0
- package/jobs/hospitality/room-maintenance-work-order-tracker.yaml +31 -0
- package/jobs/hospitality/upsell-upgrade-conversion-tracker.yaml +37 -0
- package/jobs/insurance/adjuster-caseload-balance-check.yaml +45 -0
- package/jobs/insurance/agent-broker-license-expiry-tracker.yaml +40 -0
- package/jobs/insurance/cat-event-exposure-monitor.yaml +37 -0
- package/jobs/insurance/claims-aging-backlog-tracker.yaml +48 -0
- package/jobs/insurance/doi-filing-deadline-tracker.yaml +42 -0
- package/jobs/insurance/loss-ratio-by-line-monitor.yaml +43 -0
- package/jobs/insurance/policy-lapse-rate-monitor.yaml +41 -0
- package/jobs/insurance/premium-payment-delinquency-tracker.yaml +42 -0
- package/jobs/insurance/quote-to-bind-conversion-tracker.yaml +41 -0
- package/jobs/insurance/reinsurance-treaty-renewal-tracker.yaml +38 -0
- package/jobs/insurance/siu-fraud-referral-tracker.yaml +36 -0
- package/jobs/insurance/subrogation-recovery-tracker.yaml +41 -0
- package/jobs/insurance/underwriting-queue-sla-monitor.yaml +45 -0
- package/jobs/logistics/3pl-performance-scorecard.yaml +45 -0
- package/jobs/logistics/bol-freight-class-accuracy-audit.yaml +33 -0
- package/jobs/logistics/cargo-insurance-claim-status-check.yaml +39 -0
- package/jobs/logistics/carrier-load-tender-acceptance-check.yaml +34 -0
- package/jobs/logistics/carrier-otd-performance-scorecard.yaml +41 -0
- package/jobs/logistics/carrier-rate-contract-renewal-check.yaml +35 -0
- package/jobs/logistics/cross-dock-dwell-time-watch.yaml +43 -0
- package/jobs/logistics/freight-invoice-rate-audit.yaml +38 -0
- package/jobs/logistics/fuel-surcharge-rate-monitor.yaml +40 -0
- package/jobs/logistics/international-shipment-documentation-check.yaml +36 -0
- package/jobs/logistics/linehaul-transit-time-variance-check.yaml +43 -0
- package/jobs/logistics/proof-of-delivery-reconciliation-check.yaml +38 -0
- package/jobs/logistics/route-load-optimization-check.yaml +32 -0
- package/jobs/manufacturing/changeover-time-tracker.yaml +29 -0
- package/jobs/manufacturing/critical-spare-parts-stock-check.yaml +29 -0
- package/jobs/manufacturing/first-pass-yield-report.yaml +37 -0
- package/jobs/manufacturing/lot-traceability-audit.yaml +37 -0
- package/jobs/manufacturing/non-conformance-report-backlog-check.yaml +34 -0
- package/jobs/manufacturing/oee-efficiency-check.yaml +37 -0
- package/jobs/manufacturing/osha-recordable-incident-audit.yaml +37 -0
- package/jobs/manufacturing/production-schedule-adherence-check.yaml +35 -0
- package/jobs/manufacturing/safety-certification-expiry-check.yaml +37 -0
- package/jobs/manufacturing/scrap-waste-rate-watch.yaml +33 -0
- package/jobs/manufacturing/shift-handoff-report.yaml +37 -0
- package/jobs/manufacturing/supplier-quality-ppm-watch.yaml +38 -0
- package/jobs/manufacturing/tooling-die-wear-check.yaml +31 -0
- package/jobs/manufacturing/work-order-backlog-check.yaml +37 -0
- package/jobs/marketing/ad-creative-fatigue-check.yaml +44 -0
- package/jobs/marketing/affiliate-partner-performance-check.yaml +38 -0
- package/jobs/marketing/attribution-discrepancy-check.yaml +42 -0
- package/jobs/marketing/brand-share-of-voice-check.yaml +43 -0
- package/jobs/marketing/campaign-roas-cpa-anomaly-check.yaml +41 -0
- package/jobs/marketing/competitor-ad-creative-watch.yaml +40 -0
- package/jobs/marketing/email-list-growth-rate-check.yaml +43 -0
- package/jobs/marketing/landing-page-conversion-drop-check.yaml +44 -0
- package/jobs/marketing/mql-to-sql-handoff-sla-check.yaml +29 -0
- package/jobs/marketing/mql-volume-pace-check.yaml +34 -0
- package/jobs/marketing/paid-search-negative-keyword-waste-check.yaml +37 -0
- package/jobs/marketing/press-release-pickup-tracking.yaml +32 -0
- package/jobs/marketing/webinar-registration-attendance-check.yaml +38 -0
- package/jobs/restaurant/comp-void-anomaly-tracker.yaml +39 -0
- package/jobs/restaurant/daily-sales-flash-report.yaml +36 -0
- package/jobs/restaurant/delivery-platform-commission-reconciliation.yaml +33 -0
- package/jobs/restaurant/delivery-receiving-discrepancy-check.yaml +33 -0
- package/jobs/restaurant/food-handler-permit-expiry-tracker.yaml +33 -0
- package/jobs/restaurant/gift-card-liability-check.yaml +45 -0
- package/jobs/restaurant/kitchen-ticket-time-watch.yaml +38 -0
- package/jobs/restaurant/liquor-pour-cost-variance-check.yaml +34 -0
- package/jobs/restaurant/menu-86-frequency-tracker.yaml +39 -0
- package/jobs/restaurant/menu-item-profitability-check.yaml +33 -0
- package/jobs/restaurant/pos-end-of-day-reconciliation-check.yaml +31 -0
- package/jobs/restaurant/table-turnover-rate-tracker.yaml +36 -0
- package/jobs/restaurant/waitlist-conversion-check.yaml +37 -0
- package/jobs/retail/cash-office-deposit-variance-check.yaml +34 -0
- package/jobs/retail/competitor-price-monitoring-check.yaml +42 -0
- package/jobs/retail/damaged-merchandise-writeoff-tracker.yaml +41 -0
- package/jobs/retail/employee-discount-abuse-check.yaml +39 -0
- package/jobs/retail/layaway-special-order-pickup-tracker.yaml +33 -0
- package/jobs/retail/loyalty-enrollment-redemption-rate-tracker.yaml +37 -0
- package/jobs/retail/markdown-execution-audit-check.yaml +29 -0
- package/jobs/retail/planogram-compliance-audit-check.yaml +36 -0
- package/jobs/retail/pos-void-refund-anomaly-tracker.yaml +42 -0
- package/jobs/retail/price-tag-audit-accuracy-check.yaml +37 -0
- package/jobs/retail/sales-per-square-foot-tracker.yaml +36 -0
- package/jobs/retail/seasonal-staffing-coverage-check.yaml +35 -0
- package/jobs/retail/store-closing-checklist-compliance-check.yaml +32 -0
- package/jobs/retail/visual-merchandising-compliance-check.yaml +40 -0
- package/jobs/veterinary/appointment-no-show-rate-tracker.yaml +49 -0
- package/jobs/veterinary/boarding-kennel-capacity-utilization-check.yaml +39 -0
- package/jobs/veterinary/client-payment-plan-delinquency-check.yaml +36 -0
- package/jobs/veterinary/dvm-license-dea-registration-expiry-check.yaml +41 -0
- package/jobs/veterinary/microchip-registration-verification-check.yaml +40 -0
- package/jobs/veterinary/patient-record-completeness-audit.yaml +41 -0
- package/jobs/veterinary/pet-medication-refill-backlog-check.yaml +36 -0
- package/jobs/veterinary/puppy-kitten-vaccine-series-compliance-check.yaml +39 -0
- package/jobs/veterinary/senior-pet-wellness-recall-tracker.yaml +43 -0
- package/jobs/veterinary/spay-neuter-followup-compliance-check.yaml +35 -0
- package/jobs/veterinary/specialist-referral-followup-check.yaml +38 -0
- package/jobs/veterinary/surgical-schedule-utilization-check.yaml +36 -0
- package/jobs/veterinary/vet-staff-ce-credit-tracking.yaml +36 -0
- package/jobs/warehousing/conveyor-sortation-downtime-watch.yaml +48 -0
- package/jobs/warehousing/labor-productivity-rate-check.yaml +33 -0
- package/jobs/warehousing/mhe-preventive-maintenance-check.yaml +38 -0
- package/jobs/warehousing/order-fulfillment-sla-watch.yaml +42 -0
- package/jobs/warehousing/shift-headcount-coverage-check.yaml +33 -0
- package/jobs/warehousing/slotting-velocity-review-check.yaml +44 -0
- package/jobs/warehousing/warehouse-damage-writeoff-review.yaml +41 -0
- package/jobs/warehousing/warehouse-near-miss-incident-rate-watch.yaml +47 -0
- package/jobs/warehousing/warehouse-space-utilization-check.yaml +39 -0
- package/jobs/warehousing/wave-pick-batch-efficiency-check.yaml +33 -0
- package/jobs/warehousing/wms-integration-error-check.yaml +36 -0
- package/jobs/warehousing/yard-trailer-detention-watch.yaml +41 -0
- package/lib/category-descriptions.js +12 -12
- package/lib/duplicates-allowlist.js +10 -0
- package/package.json +2 -2
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: linen-inventory-turnover-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Linen and Laundry Inventory Turnover Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks par levels for linens (sheets, towels, robes) against current
|
|
6
|
+
counted stock and flags anything below par or showing an unusually
|
|
7
|
+
high loss/shrink rate versus rooms serviced. Use this if a linen
|
|
8
|
+
shortage has ever forced housekeeping to hold rooms because nobody
|
|
9
|
+
reordered before the closet ran low.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, housekeeping, inventory, laundry]
|
|
12
|
+
schedule: "0 6 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v shrink_pct="{{max_shrink_pct}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
item=$1; par=$2; on_hand=$3; sent_to_laundry=$4; returned=$5;
|
|
20
|
+
if (on_hand < par) printf "BELOW PAR: %s — %d on hand, par %d\n", item, on_hand, par;
|
|
21
|
+
if (sent_to_laundry > 0) {
|
|
22
|
+
loss_pct = ((sent_to_laundry - returned) / sent_to_laundry) * 100;
|
|
23
|
+
if (loss_pct > shrink_pct) printf "HIGH SHRINK: %s — sent %d, returned %d (%.1f%% loss, threshold %.0f%%)\n", item, sent_to_laundry, returned, loss_pct, shrink_pct;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{linen_inventory_csv}}"
|
|
27
|
+
variables:
|
|
28
|
+
linen_inventory_csv:
|
|
29
|
+
default: "./linen-inventory.csv"
|
|
30
|
+
description: "CSV with header row, columns: item_name,par_level,on_hand_count,sent_to_laundry_count,returned_count — one row per linen category (sheets, towels, robes, etc.)."
|
|
31
|
+
max_shrink_pct:
|
|
32
|
+
default: 5
|
|
33
|
+
description: Acceptable loss percentage between linens sent to laundry and returned before it's flagged.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: Count on a consistent cycle (weekly recommended) so par-level and shrink comparisons are apples to apples; persistent high shrink on one item often points to an outside laundry vendor issue.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: loyalty-points-reconciliation-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Loyalty Program Points Reconciliation Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares points earned per stay against your program's accrual rate
|
|
6
|
+
and flags stays where the posted points don't match, plus any member
|
|
7
|
+
who crossed a tier threshold but hasn't been re-tiered yet. Use this
|
|
8
|
+
if a loyalty member has ever been shorted points from a PMS integration
|
|
9
|
+
glitch, or hit Gold status and kept getting Silver-level perks for months.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, loyalty-program, guest-experience, revenue-assurance]
|
|
12
|
+
schedule: "0 8 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v rate="{{points_per_dollar}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
expected = $3 * rate;
|
|
20
|
+
diff = $4 - expected;
|
|
21
|
+
if (diff < 0) diff = -diff;
|
|
22
|
+
if (diff > 1) printf "MISMATCH: member %s, stay %s — expected %.0f pts, posted %.0f pts\n", $1, $2, expected, $4;
|
|
23
|
+
}
|
|
24
|
+
' "{{stays_points_csv}}"
|
|
25
|
+
variables:
|
|
26
|
+
stays_points_csv:
|
|
27
|
+
default: "./loyalty-stays-points.csv"
|
|
28
|
+
description: "CSV with header row, columns: member_id,folio_id,eligible_spend_usd,points_posted."
|
|
29
|
+
points_per_dollar:
|
|
30
|
+
default: 10
|
|
31
|
+
description: Program's points-earned-per-dollar-spent accrual rate.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Tier-threshold re-classification is a separate check worth pairing with this — export current tier alongside year-to-date qualifying nights/spend and compare against your program's tier cutoffs.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: minibar-charge-reconciliation-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Minibar Charge Reconciliation Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares housekeeping's logged minibar restocks against folio charges
|
|
6
|
+
posted for the same room and flags mismatches. Use this if a restocked
|
|
7
|
+
minibar has ever gone uncharged, or a guest was charged for an item
|
|
8
|
+
housekeeping never actually replaced.
|
|
9
|
+
category: hospitality
|
|
10
|
+
tags: [hospitality, minibar, revenue-assurance, front-desk]
|
|
11
|
+
schedule: "0 9 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' '
|
|
16
|
+
FNR==NR {
|
|
17
|
+
if (FNR > 1) restocked[$1] += $3;
|
|
18
|
+
next;
|
|
19
|
+
}
|
|
20
|
+
FNR==1 {next}
|
|
21
|
+
{ charged[$1] += $3 }
|
|
22
|
+
END {
|
|
23
|
+
for (room in restocked) {
|
|
24
|
+
r = restocked[room] + 0; c = charged[room] + 0;
|
|
25
|
+
if (r != c) printf "MISMATCH: room %s — restocked $%.2f, charged $%.2f\n", room, r, c;
|
|
26
|
+
}
|
|
27
|
+
for (room in charged) if (!(room in restocked)) printf "UNMATCHED CHARGE: room %s — charged $%.2f with no restock logged\n", room, charged[room];
|
|
28
|
+
}
|
|
29
|
+
' "{{restock_log_csv}}" "{{folio_charges_csv}}"
|
|
30
|
+
variables:
|
|
31
|
+
restock_log_csv:
|
|
32
|
+
default: "./minibar-restock-log.csv"
|
|
33
|
+
description: "CSV with header row, columns: room_number,date,amount_usd — housekeeping's logged minibar restocks."
|
|
34
|
+
folio_charges_csv:
|
|
35
|
+
default: "./minibar-folio-charges.csv"
|
|
36
|
+
description: "CSV with header row, columns: room_number,date,amount_usd — minibar charges posted to guest folios."
|
|
37
|
+
compatible_agents: [generic, claude, codex]
|
|
38
|
+
notes: Assumes both CSVs cover the same date range; a mismatch doesn't always mean fraud — could be a delayed post or a comped item, so verify before adjusting a folio.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: occupancy-forecast-variance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Occupancy Forecast Variance Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares this week's forecasted occupancy against actual rooms sold and
|
|
6
|
+
flags a meaningful gap in either direction. Use this if a forecast has
|
|
7
|
+
ever been quietly wrong for weeks, leaving staffing either overbooked
|
|
8
|
+
on labor during a slow stretch or short-staffed during a rush nobody
|
|
9
|
+
planned for.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, revenue-management, forecasting, staffing]
|
|
12
|
+
schedule: "0 7 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v tol="{{tolerance_pct}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
diff = $3 - $2;
|
|
20
|
+
pct = ($2 > 0) ? (diff / $2) * 100 : 0;
|
|
21
|
+
if (pct < 0) pct = -pct;
|
|
22
|
+
if (pct > tol) printf "VARIANCE: %s forecast %d%%, actual %d%% (%.1f pts off, tolerance %.0f)\n", $1, $2, $3, diff, tol;
|
|
23
|
+
}
|
|
24
|
+
' "{{forecast_vs_actual_csv}}"
|
|
25
|
+
variables:
|
|
26
|
+
forecast_vs_actual_csv:
|
|
27
|
+
default: "./occupancy-forecast-vs-actual.csv"
|
|
28
|
+
description: "CSV with header row, columns: date,forecast_occupancy_pct,actual_occupancy_pct."
|
|
29
|
+
tolerance_pct:
|
|
30
|
+
default: 8
|
|
31
|
+
description: Percentage-point gap between forecast and actual occupancy before it's flagged.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: Feed this from your revenue management system's forecast export alongside actual rooms-sold data — use recurring misses to recalibrate the forecasting model, not just a one-off flag.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: ota-rate-parity-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: OTA Rate Parity Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares your listed room rates across OTAs (Booking.com, Expedia, etc.)
|
|
6
|
+
against your direct-booking rate and flags any channel undercutting you.
|
|
7
|
+
Use this if an OTA has ever quietly shown a lower rate than your own
|
|
8
|
+
website, driving bookings away from your cheapest channel.
|
|
9
|
+
category: hospitality
|
|
10
|
+
tags: [hospitality, revenue-management, ota, rate-parity]
|
|
11
|
+
schedule: "0 6 * * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: agent-prompt
|
|
14
|
+
prompt: |
|
|
15
|
+
Check today's rate for {{room_type}} on {{ota_platforms}} and compare
|
|
16
|
+
each against the direct rate of {{direct_rate_usd}} on your own booking
|
|
17
|
+
site.
|
|
18
|
+
1. List each platform's displayed rate side by side with the direct rate.
|
|
19
|
+
2. Flag any OTA showing a rate at or below the direct rate — that's a
|
|
20
|
+
parity violation worth chasing with the channel manager or OTA.
|
|
21
|
+
3. Note any OTA showing an unusually high rate too, since that can also
|
|
22
|
+
hurt bookings if it's a stale/unsynced price.
|
|
23
|
+
4. Suggest whether the direct rate, the channel manager mapping, or a
|
|
24
|
+
stale OTA cache is the likely cause for any mismatch found.
|
|
25
|
+
variables:
|
|
26
|
+
room_type:
|
|
27
|
+
default: "Standard Queen"
|
|
28
|
+
description: Room type/rate plan to compare across channels.
|
|
29
|
+
ota_platforms:
|
|
30
|
+
default: "Booking.com, Expedia, Hotels.com"
|
|
31
|
+
description: Comma-separated list of OTA platforms to check.
|
|
32
|
+
direct_rate_usd:
|
|
33
|
+
default: 189
|
|
34
|
+
description: Your current direct-booking rate in USD for the room type/date checked.
|
|
35
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
36
|
+
notes: Read-only comparison — fixing a parity violation usually means updating your channel manager or contacting the OTA's rate-parity team.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: overbooking-risk-alert
|
|
2
|
+
version: 1
|
|
3
|
+
name: Overbooking Risk Alert
|
|
4
|
+
description: >
|
|
5
|
+
Compares confirmed reservations for each upcoming night against total
|
|
6
|
+
available rooms and flags nights where bookings exceed inventory. Use
|
|
7
|
+
this if an intentional overbooking cushion has ever tipped into an
|
|
8
|
+
actual walked guest because nobody was watching the running total as
|
|
9
|
+
last-minute bookings came in.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, front-desk, overbooking, reservations]
|
|
12
|
+
schedule: "0 */6 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v rooms="{{total_rooms}}" -v cushion="{{overbook_cushion}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{ booked[$1] += 1 }
|
|
19
|
+
END {
|
|
20
|
+
for (date in booked) {
|
|
21
|
+
limit = rooms + cushion;
|
|
22
|
+
if (booked[date] > limit) printf "OVERBOOKED: %s — %d bookings vs %d rooms (+%d cushion)\n", date, booked[date], rooms, cushion;
|
|
23
|
+
else if (booked[date] > rooms) printf "WITHIN CUSHION: %s — %d bookings vs %d rooms (using overbook cushion)\n", date, booked[date], rooms;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{reservations_by_night_csv}}"
|
|
27
|
+
variables:
|
|
28
|
+
reservations_by_night_csv:
|
|
29
|
+
default: "./reservations-by-night.csv"
|
|
30
|
+
description: "CSV with header row, columns: stay_date,reservation_id — one row per room-night reserved (confirmed status only)."
|
|
31
|
+
total_rooms:
|
|
32
|
+
default: 100
|
|
33
|
+
description: Total available rooms in the property.
|
|
34
|
+
overbook_cushion:
|
|
35
|
+
default: 3
|
|
36
|
+
description: Intentional overbooking cushion above total rooms before a night counts as at-risk of a walk.
|
|
37
|
+
compatible_agents: [generic, claude, codex]
|
|
38
|
+
notes: A count over total_rooms but within the cushion is expected/intentional; only counts exceeding rooms + cushion need a walk plan (relocation agreement with a nearby property) lined up.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: room-maintenance-work-order-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Preventive Maintenance Work Order Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks scheduled preventive maintenance work orders (HVAC service,
|
|
6
|
+
fire safety checks, deep cleans) against their due dates and flags any
|
|
7
|
+
overdue or rooms that have gone too long without a PM cycle. Use this
|
|
8
|
+
if a room has ever gone a full year without its scheduled HVAC or
|
|
9
|
+
safety check because it only got attention when something broke.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, maintenance, preventive, compliance]
|
|
12
|
+
schedule: "0 7 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" '
|
|
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
|
+
days_over = (today - due_epoch) / 86400;
|
|
23
|
+
if (days_over > 0) printf "OVERDUE: room/area %s — %s work order due %s (%d days overdue)\n", $1, $2, $3, days_over;
|
|
24
|
+
}
|
|
25
|
+
' "{{pm_schedule_csv}}"
|
|
26
|
+
variables:
|
|
27
|
+
pm_schedule_csv:
|
|
28
|
+
default: "./pm-work-orders.csv"
|
|
29
|
+
description: "CSV with header row, columns: room_or_area,work_order_type,due_date (YYYY-MM-DD) — one row per open preventive maintenance work order."
|
|
30
|
+
compatible_agents: [generic, claude, codex]
|
|
31
|
+
notes: Distinct from guest-maintenance-request-backlog-check, which tracks guest-reported issues — this tracks scheduled/preventive work orders (PM cycles) that exist whether or not a guest complains.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: upsell-upgrade-conversion-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Room Upsell and Upgrade Conversion Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Analyzes offered room upgrades and add-on upsells (early check-in, view
|
|
6
|
+
upgrade, breakfast package) against how many guests accepted, broken
|
|
7
|
+
down by channel and shift. Use this if front desk upsell offers have
|
|
8
|
+
ever quietly tapered off because nobody was tracking whether the team
|
|
9
|
+
was actually still asking.
|
|
10
|
+
category: hospitality
|
|
11
|
+
tags: [hospitality, revenue-management, upsell, front-desk]
|
|
12
|
+
schedule: "0 8 1 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: agent-prompt
|
|
15
|
+
prompt: |
|
|
16
|
+
Pull upsell/upgrade offer logs from {{pms_or_upsell_platform}} for the
|
|
17
|
+
past {{lookback_days}} days.
|
|
18
|
+
1. Calculate overall conversion rate (accepted / offered) for each
|
|
19
|
+
upsell type (room upgrade, early check-in, late checkout, breakfast
|
|
20
|
+
package, etc.).
|
|
21
|
+
2. Break the conversion rate down by shift or agent group if that data
|
|
22
|
+
exists, and flag any shift with a rate meaningfully below the
|
|
23
|
+
property average.
|
|
24
|
+
3. Flag any upsell type with an offer count that's dropped sharply
|
|
25
|
+
versus the prior period — that usually means staff stopped asking,
|
|
26
|
+
not that demand dried up.
|
|
27
|
+
4. Estimate incremental revenue if the lowest-converting shift matched
|
|
28
|
+
the property average.
|
|
29
|
+
variables:
|
|
30
|
+
pms_or_upsell_platform:
|
|
31
|
+
default: "your PMS or upsell platform"
|
|
32
|
+
description: System logging upsell offers and outcomes (e.g. "Oracle OPERA", "Zingle", "Duetto").
|
|
33
|
+
lookback_days:
|
|
34
|
+
default: 30
|
|
35
|
+
description: Window of upsell data to analyze.
|
|
36
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
37
|
+
notes: Useful as a coaching input for front desk shift leads, not a scorecard for individual write-ups.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
id: adjuster-caseload-balance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Adjuster Caseload Balance Check
|
|
4
|
+
description: >
|
|
5
|
+
Counts open claims assigned per adjuster and flags anyone carrying a
|
|
6
|
+
caseload well above the team average, so work can be redistributed
|
|
7
|
+
before it hurts claim cycle time. Use this if one adjuster has ever
|
|
8
|
+
quietly ended up with double the caseload of everyone else on the team.
|
|
9
|
+
category: insurance
|
|
10
|
+
tags: [insurance, claims, adjuster, caseload, operations]
|
|
11
|
+
schedule: "0 7 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v overload="{{overload_multiplier}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
count[$2]++;
|
|
19
|
+
total++;
|
|
20
|
+
n_adjusters[$2]=1;
|
|
21
|
+
}
|
|
22
|
+
END {
|
|
23
|
+
n=0;
|
|
24
|
+
for (a in n_adjusters) n++;
|
|
25
|
+
avg = (n > 0) ? total / n : 0;
|
|
26
|
+
printf "CASELOAD SUMMARY: %d open claims across %d adjusters (avg %.1f)\n", total, n, avg;
|
|
27
|
+
for (a in count) {
|
|
28
|
+
if (avg > 0 && count[a] > avg * overload) {
|
|
29
|
+
printf "OVERLOADED: %s — %d open claims (avg %.1f)\n", a, count[a], avg;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
' "{{open_claims_by_adjuster_csv}}"
|
|
34
|
+
variables:
|
|
35
|
+
open_claims_by_adjuster_csv:
|
|
36
|
+
default: "./open-claims-by-adjuster.csv"
|
|
37
|
+
description: "Path to a CSV with columns: claim_number,adjuster_name — one row per open claim."
|
|
38
|
+
overload_multiplier:
|
|
39
|
+
default: 1.5
|
|
40
|
+
description: How many times the team average caseload counts as overloaded (e.g. 1.5 = 50% above average).
|
|
41
|
+
compatible_agents: [generic, claude, codex]
|
|
42
|
+
notes: >
|
|
43
|
+
Staffing-balance check across a claims team, distinct from
|
|
44
|
+
claims-aging-backlog-tracker which looks at claim age rather than
|
|
45
|
+
who's handling how many claims.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: agent-broker-license-expiry-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Agent/Broker License Expiry Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks producer (agent/broker) license and appointment expiration dates
|
|
6
|
+
across every state they're licensed in and flags anything expiring
|
|
7
|
+
soon. Use this if an agent has ever kept writing business in a state
|
|
8
|
+
after their license quietly lapsed.
|
|
9
|
+
category: insurance
|
|
10
|
+
tags: [insurance, agent, broker, license, compliance]
|
|
11
|
+
schedule: "0 8 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline expiry_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
diff_days = (expiry_epoch - now_epoch) / 86400;
|
|
22
|
+
if (diff_days <= days) {
|
|
23
|
+
status = (diff_days < 0) ? "EXPIRED" : "EXPIRING";
|
|
24
|
+
printf "%s: %s — %s license/appointment in %s expires %s (%d days)\n", status, $1, $2, $2, $3, diff_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{producer_licenses_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
producer_licenses_csv_path:
|
|
30
|
+
default: "./producer-licenses.csv"
|
|
31
|
+
description: "Path to a CSV with columns: producer_name,state,expiry_date (YYYY-MM-DD) — one row per state license/appointment."
|
|
32
|
+
warn_days_before:
|
|
33
|
+
default: 45
|
|
34
|
+
description: How many days before a license or appointment expiry to start warning.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: >
|
|
37
|
+
Tracks producer (selling agent/broker) licensing compliance across an
|
|
38
|
+
agency or MGA's distribution force — distinct from
|
|
39
|
+
certificate-of-insurance-request-check, which tracks COI requests, not
|
|
40
|
+
producer licensure.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: cat-event-exposure-monitor
|
|
2
|
+
version: 1
|
|
3
|
+
name: Catastrophe Event Exposure Monitor
|
|
4
|
+
description: >
|
|
5
|
+
Cross-references active policies against a catastrophe (hurricane,
|
|
6
|
+
wildfire, earthquake, flood) event footprint and estimates
|
|
7
|
+
policy-count and total insured value exposure inside the impact zone.
|
|
8
|
+
Use this if a CAT event has ever hit before anyone had a fast answer to
|
|
9
|
+
"how many policies do we have in that area, and what's our exposure."
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, catastrophe, cat, exposure, risk]
|
|
12
|
+
schedule: "0 */6 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: agent-prompt
|
|
15
|
+
prompt: |
|
|
16
|
+
Given the active/forecast catastrophe event: {{cat_event_description}},
|
|
17
|
+
and the policy exposure summary: {{policy_exposure_summary}}.
|
|
18
|
+
1. Estimate how many policies and how much total insured value fall
|
|
19
|
+
within or near the event's impact footprint.
|
|
20
|
+
2. Break this down by line of business (property, auto, etc.) if the
|
|
21
|
+
exposure data allows it.
|
|
22
|
+
3. Flag any single large-limit policy that falls inside the footprint
|
|
23
|
+
for individual review.
|
|
24
|
+
4. Note this is a rough triage estimate for readiness/response
|
|
25
|
+
planning, not a final claims or reserve figure.
|
|
26
|
+
variables:
|
|
27
|
+
cat_event_description:
|
|
28
|
+
default: "describe the catastrophe event and its current/forecast footprint here"
|
|
29
|
+
description: Name, type, and geographic footprint of the catastrophe event being tracked.
|
|
30
|
+
policy_exposure_summary:
|
|
31
|
+
default: "paste or summarize policy counts and insured values by geography here"
|
|
32
|
+
description: Summary of active policy counts and total insured value by geography/line of business.
|
|
33
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
34
|
+
notes: >
|
|
35
|
+
Pre/during-event exposure estimation for claims and reinsurance
|
|
36
|
+
readiness planning — distinct from claims-aging-backlog-tracker, which
|
|
37
|
+
tracks already-filed claims rather than pre-loss exposure.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
id: claims-aging-backlog-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Claims Aging & Backlog Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Buckets open claims by how long they've been open (0-30, 31-60, 61-90,
|
|
6
|
+
90+ days) and flags any bucket that's grown past target so a claims
|
|
7
|
+
manager can rebalance the queue. Use this if a backlog of aging claims
|
|
8
|
+
has ever crept up gradually until a regulator or auditor asked why so
|
|
9
|
+
many were still open past 90 days.
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, claims, aging, backlog, operations]
|
|
12
|
+
schedule: "0 7 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v cap90="{{max_90plus_pct}}" '
|
|
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 opened_epoch; close(cmd);
|
|
22
|
+
age_days = (today - opened_epoch) / 86400;
|
|
23
|
+
total++;
|
|
24
|
+
if (age_days <= 30) b30++;
|
|
25
|
+
else if (age_days <= 60) b60++;
|
|
26
|
+
else if (age_days <= 90) b90++;
|
|
27
|
+
else b90plus++;
|
|
28
|
+
}
|
|
29
|
+
END {
|
|
30
|
+
printf "AGING SUMMARY: 0-30d=%d 31-60d=%d 61-90d=%d 90d+=%d (total=%d)\n", b30, b60, b90, b90plus, total;
|
|
31
|
+
pct90plus = (total > 0) ? (b90plus / total) * 100 : 0;
|
|
32
|
+
if (pct90plus > cap90) {
|
|
33
|
+
printf "OVER TARGET: %.1f%% of open claims are 90+ days old (cap %d%%)\n", pct90plus, cap90;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
' "{{open_claims_csv_path}}"
|
|
37
|
+
variables:
|
|
38
|
+
open_claims_csv_path:
|
|
39
|
+
default: "./open-claims.csv"
|
|
40
|
+
description: "Path to a CSV with columns: claim_number,date_opened (YYYY-MM-DD)."
|
|
41
|
+
max_90plus_pct:
|
|
42
|
+
default: 10
|
|
43
|
+
description: Maximum acceptable percentage of open claims sitting at 90+ days before this counts as over target.
|
|
44
|
+
compatible_agents: [generic, claude, codex]
|
|
45
|
+
notes: >
|
|
46
|
+
Portfolio-level aging distribution for a claims team, distinct from
|
|
47
|
+
claim-status-check which follows up on individual stale claims for a
|
|
48
|
+
single policyholder.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: doi-filing-deadline-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: State DOI Regulatory Filing Deadline Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Warns before a state Department of Insurance filing deadline (rate
|
|
6
|
+
filings, annual statements, market conduct reports) so nothing gets
|
|
7
|
+
submitted late. Use this if a regulatory filing has ever gone out late
|
|
8
|
+
because the deadline lived only in one compliance person's memory.
|
|
9
|
+
category: insurance
|
|
10
|
+
tags: [insurance, compliance, regulatory, doi, filing]
|
|
11
|
+
schedule: "0 8 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$4 != "" {next}
|
|
18
|
+
{
|
|
19
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline due_epoch; close(cmd);
|
|
21
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
22
|
+
diff_days = (due_epoch - now_epoch) / 86400;
|
|
23
|
+
if (diff_days <= days) {
|
|
24
|
+
status = (diff_days < 0) ? "OVERDUE" : "DUE SOON";
|
|
25
|
+
printf "%s: %s — %s filing due %s (%d days)\n", status, $1, $2, $3, diff_days;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{doi_filings_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
doi_filings_csv_path:
|
|
31
|
+
default: "./doi-filings.csv"
|
|
32
|
+
description: "Path to a CSV with columns: state,filing_type,due_date (YYYY-MM-DD),filed_date (blank if not yet filed)."
|
|
33
|
+
warn_days_before:
|
|
34
|
+
default: 21
|
|
35
|
+
description: How many days before a filing deadline to start warning.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Regulatory filing deadlines owed to state insurance regulators —
|
|
39
|
+
distinct from legal's compliance-filing-deadline-reminder, which is a
|
|
40
|
+
generic cross-industry filing tracker; this one is scoped specifically
|
|
41
|
+
to insurance-department filings (rate filings, annual statements,
|
|
42
|
+
market conduct reports).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
id: loss-ratio-by-line-monitor
|
|
2
|
+
version: 1
|
|
3
|
+
name: Loss Ratio by Line of Business Monitor
|
|
4
|
+
description: >
|
|
5
|
+
Calculates the incurred loss ratio for each line of business and flags
|
|
6
|
+
any line running hotter than target, so underwriting or pricing can
|
|
7
|
+
react before a bad quarter turns into a bad year. Use this if a line's
|
|
8
|
+
loss ratio has ever drifted well past target for months before anyone
|
|
9
|
+
noticed in the numbers.
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, loss-ratio, underwriting, finance]
|
|
12
|
+
schedule: "0 7 1 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v target="{{target_loss_ratio_pct}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
earned[$1] += $2;
|
|
20
|
+
incurred[$1] += $3;
|
|
21
|
+
}
|
|
22
|
+
END {
|
|
23
|
+
for (line in earned) {
|
|
24
|
+
if (earned[line] > 0) {
|
|
25
|
+
ratio = (incurred[line] / earned[line]) * 100;
|
|
26
|
+
flag = (ratio > target) ? " OVER TARGET" : "";
|
|
27
|
+
printf "%s: loss ratio %.1f%%%s (earned %.2f, incurred %.2f)\n", line, ratio, flag, earned[line], incurred[line];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
' "{{loss_ratio_csv_path}}"
|
|
32
|
+
variables:
|
|
33
|
+
loss_ratio_csv_path:
|
|
34
|
+
default: "./loss-ratio-by-line.csv"
|
|
35
|
+
description: "Path to a CSV with columns: line_of_business,earned_premium,incurred_losses — one row per period/line entry, aggregated across the current reporting period."
|
|
36
|
+
target_loss_ratio_pct:
|
|
37
|
+
default: 65
|
|
38
|
+
description: Target maximum loss ratio percentage per line of business before it's flagged.
|
|
39
|
+
compatible_agents: [generic, claude, codex]
|
|
40
|
+
notes: >
|
|
41
|
+
Financial performance monitoring by line of business for underwriting
|
|
42
|
+
and actuarial review — distinct from claims-aging-backlog-tracker,
|
|
43
|
+
which tracks claim handling speed rather than loss cost.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: policy-lapse-rate-monitor
|
|
2
|
+
version: 1
|
|
3
|
+
name: Policy Cancellation & Lapse Rate Monitor
|
|
4
|
+
description: >
|
|
5
|
+
Calculates the weekly policy cancellation/lapse rate and flags it when
|
|
6
|
+
it climbs past a healthy baseline, so retention teams can react before
|
|
7
|
+
a leaky book turns into a shrinking one. Use this if a rising lapse
|
|
8
|
+
rate has ever gone unnoticed until a quarterly report showed the book
|
|
9
|
+
had quietly shrunk.
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, retention, lapse, cancellation, operations]
|
|
12
|
+
schedule: "0 7 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v baseline="{{baseline_lapse_pct}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
total++;
|
|
20
|
+
if ($2 == "cancelled" || $2 == "lapsed") lapsed++;
|
|
21
|
+
}
|
|
22
|
+
END {
|
|
23
|
+
pct = (total > 0) ? (lapsed / total) * 100 : 0;
|
|
24
|
+
printf "LAPSE RATE: %.1f%% (%d of %d policies) — baseline %d%%\n", pct, lapsed, total, baseline;
|
|
25
|
+
if (pct > baseline) {
|
|
26
|
+
printf "ABOVE BASELINE: lapse rate exceeds the %d%% target\n", baseline;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
' "{{policy_status_csv_path}}"
|
|
30
|
+
variables:
|
|
31
|
+
policy_status_csv_path:
|
|
32
|
+
default: "./policy-status-weekly.csv"
|
|
33
|
+
description: "Path to a CSV with columns: policy_number,status (active/cancelled/lapsed) for the current reporting period's book."
|
|
34
|
+
baseline_lapse_pct:
|
|
35
|
+
default: 8
|
|
36
|
+
description: Baseline acceptable cancellation/lapse rate percentage before it's flagged as elevated.
|
|
37
|
+
compatible_agents: [generic, claude, codex]
|
|
38
|
+
notes: >
|
|
39
|
+
Book-wide retention health metric, distinct from
|
|
40
|
+
premium-payment-delinquency-tracker, which flags individual accounts
|
|
41
|
+
rather than the aggregate lapse trend.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: premium-payment-delinquency-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Premium Payment Delinquency Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Scans the book of business for policyholders past due on premium
|
|
6
|
+
payments and flags accounts approaching cancellation-for-nonpayment, so
|
|
7
|
+
collections or retention outreach can happen before a policy lapses.
|
|
8
|
+
Use this if delinquent accounts have ever piled up unnoticed until a
|
|
9
|
+
batch of policies cancelled all at once.
|
|
10
|
+
category: insurance
|
|
11
|
+
tags: [insurance, premium, delinquency, collections, retention]
|
|
12
|
+
schedule: "0 7 * * 1-5"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v cancel_days="{{cancellation_grace_days}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$3 != "unpaid" {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 due_epoch; close(cmd);
|
|
23
|
+
past_due_days = (today - due_epoch) / 86400;
|
|
24
|
+
if (past_due_days > 0) {
|
|
25
|
+
remaining = cancel_days - past_due_days;
|
|
26
|
+
status = (remaining <= 0) ? "CANCELLATION ELIGIBLE" : sprintf("%d days until cancellation-eligible", remaining);
|
|
27
|
+
printf "DELINQUENT: %s — due %s, %d days past due — %s\n", $1, $2, past_due_days, status;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
' "{{book_of_business_csv_path}}"
|
|
31
|
+
variables:
|
|
32
|
+
book_of_business_csv_path:
|
|
33
|
+
default: "./premium-payment-status.csv"
|
|
34
|
+
description: "Path to a CSV with columns: policy_number,payment_due_date (YYYY-MM-DD),status (paid/unpaid)."
|
|
35
|
+
cancellation_grace_days:
|
|
36
|
+
default: 30
|
|
37
|
+
description: Days past due before a policy becomes eligible for cancellation-for-nonpayment.
|
|
38
|
+
compatible_agents: [generic, claude, codex]
|
|
39
|
+
notes: >
|
|
40
|
+
Book-wide delinquency and collections view across many policyholders,
|
|
41
|
+
distinct from premium-payment-due-reminder, which reminds a single
|
|
42
|
+
policyholder about their own upcoming payment before it's even late.
|