@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,37 @@
|
|
|
1
|
+
id: eeo1-filing-deadline-reminder
|
|
2
|
+
version: 1
|
|
3
|
+
name: EEO-1 Filing Deadline Reminder
|
|
4
|
+
description: >
|
|
5
|
+
Counts down to the annual EEO-1 component filing deadline so data
|
|
6
|
+
collection and submission don't get rushed at the last minute. Use this
|
|
7
|
+
if the EEO-1 window has ever snuck up because it only comes around once
|
|
8
|
+
a year and nobody put it on a recurring calendar.
|
|
9
|
+
category: hr
|
|
10
|
+
tags: [hr, eeo1, compliance, filing, deadline]
|
|
11
|
+
schedule: "0 9 * * *"
|
|
12
|
+
timezone: "America/New_York"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today_epoch=$(date +%s);
|
|
16
|
+
deadline_epoch=$(date -d "{{filing_deadline}}" +%s 2>/dev/null || date -j -f %Y-%m-%d "{{filing_deadline}}" +%s);
|
|
17
|
+
days_left=$(( (deadline_epoch - today_epoch) / 86400 ));
|
|
18
|
+
if [ "$days_left" -lt 0 ]; then
|
|
19
|
+
echo "note: this cycle's EEO-1 deadline ({{filing_deadline}}) has passed — update filing_deadline for next year's cycle.";
|
|
20
|
+
elif [ "$days_left" -le {{warn_days_before}} ]; then
|
|
21
|
+
echo "EEO-1 FILING DUE: $days_left day(s) until deadline ({{filing_deadline}}). Confirm workforce snapshot data and file via the EEOC portal.";
|
|
22
|
+
else
|
|
23
|
+
echo "OK: $days_left day(s) until EEO-1 filing deadline ({{filing_deadline}}).";
|
|
24
|
+
fi
|
|
25
|
+
variables:
|
|
26
|
+
filing_deadline:
|
|
27
|
+
default: "YYYY-MM-DD"
|
|
28
|
+
description: This cycle's EEO-1 Component 1 filing deadline, published annually by the EEOC — update each cycle.
|
|
29
|
+
warn_days_before:
|
|
30
|
+
default: 30
|
|
31
|
+
description: How many days before the deadline to start reminding.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Only applies to employers required to file (generally 100+ employees, or
|
|
35
|
+
federal contractors meeting lower thresholds) — confirm your filing
|
|
36
|
+
obligation and the current cycle's exact deadline on the EEOC's site
|
|
37
|
+
rather than assuming last year's date still applies.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: handbook-acknowledgment-tracking
|
|
2
|
+
version: 1
|
|
3
|
+
name: Employee Handbook Acknowledgment Tracking
|
|
4
|
+
description: >
|
|
5
|
+
Checks the full roster against the current handbook version and flags
|
|
6
|
+
anyone who hasn't signed off on it yet — including existing employees
|
|
7
|
+
after a handbook update, not just new hires. Use this if a handbook
|
|
8
|
+
revision has ever gone out and only a fraction of the company actually
|
|
9
|
+
acknowledged it, which nobody discovered until it mattered in a dispute.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, handbook, compliance, policy]
|
|
12
|
+
schedule: "0 8 1 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v current="{{current_handbook_version}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$2 != current {
|
|
19
|
+
printf "NOT ACKNOWLEDGED: %s — on file for v%s, current is v%s\n", $1, ($2 == "" ? "none" : $2), current;
|
|
20
|
+
}
|
|
21
|
+
' "{{handbook_ack_csv_path}}"
|
|
22
|
+
variables:
|
|
23
|
+
handbook_ack_csv_path:
|
|
24
|
+
default: "./handbook-acknowledgments.csv"
|
|
25
|
+
description: "Path to a CSV with columns: employee_name,acknowledged_version (blank if never acknowledged any version)."
|
|
26
|
+
current_handbook_version:
|
|
27
|
+
default: "2026.1"
|
|
28
|
+
description: Version label of the currently effective handbook, updated whenever a new revision goes out.
|
|
29
|
+
compatible_agents: [generic, claude, codex]
|
|
30
|
+
notes: >
|
|
31
|
+
Assumes a maintained acknowledgment export covering the whole roster.
|
|
32
|
+
Distinct from new-hire-paperwork-check, which bundles the initial
|
|
33
|
+
handbook sign-off into a new hire's first-30-days checklist rather than
|
|
34
|
+
tracking re-acknowledgment across the whole company after updates.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: headcount-budget-variance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Headcount vs. Budget Variance Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares actual headcount per department against the planned/budgeted
|
|
6
|
+
headcount and flags departments that are over or under plan. Use this
|
|
7
|
+
if a department has ever quietly overhired (or sat understaffed) for a
|
|
8
|
+
quarter before finance and HR compared notes and noticed.
|
|
9
|
+
category: hr
|
|
10
|
+
tags: [hr, headcount, budget, finance, planning]
|
|
11
|
+
schedule: "0 9 1 * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v threshold="{{variance_threshold}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
{
|
|
18
|
+
variance = $3 - $2;
|
|
19
|
+
abs_variance = (variance < 0 ? -variance : variance);
|
|
20
|
+
if (abs_variance >= threshold) {
|
|
21
|
+
direction = (variance > 0 ? "OVER PLAN" : "UNDER PLAN");
|
|
22
|
+
printf "%s: %s — budgeted %d, actual %d (variance %+d)\n", direction, $1, $2, $3, variance;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
' "{{headcount_budget_csv_path}}"
|
|
26
|
+
variables:
|
|
27
|
+
headcount_budget_csv_path:
|
|
28
|
+
default: "./headcount-budget.csv"
|
|
29
|
+
description: "Path to a CSV with columns: department,budgeted_headcount,actual_headcount."
|
|
30
|
+
variance_threshold:
|
|
31
|
+
default: 2
|
|
32
|
+
description: Minimum absolute headcount variance (in people) before a department is flagged.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: >
|
|
35
|
+
Assumes a maintained monthly export reconciling the HRIS actual
|
|
36
|
+
headcount against finance's approved plan by department. Zero-token —
|
|
37
|
+
no synthesis or interpretation beyond the raw variance.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: leave-of-absence-return-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Leave of Absence Return Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Tracks employees on FMLA, parental, medical, or other formal leave and
|
|
6
|
+
flags upcoming or overdue return dates. Use this if a return-to-work
|
|
7
|
+
date has ever been missed — either the team wasn't ready for someone
|
|
8
|
+
coming back, or nobody noticed an expected return date came and went
|
|
9
|
+
with no check-in.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, leave-of-absence, fmla, parental-leave, compliance]
|
|
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 warn="{{warn_days_before}}" '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$4 != "active" {next}
|
|
20
|
+
{
|
|
21
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
22
|
+
cmd | getline return_epoch; close(cmd);
|
|
23
|
+
diff_days = (return_epoch - today) / 86400;
|
|
24
|
+
if (diff_days < 0) {
|
|
25
|
+
printf "OVERDUE RETURN: %s — %s leave, expected back %s (%d day(s) past, still marked active)\n", $1, $2, $3, -diff_days;
|
|
26
|
+
} else if (diff_days <= warn) {
|
|
27
|
+
printf "RETURN UPCOMING: %s — %s leave, expected back %s (%d day(s))\n", $1, $2, $3, diff_days;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
' "{{leave_tracking_csv_path}}"
|
|
31
|
+
variables:
|
|
32
|
+
leave_tracking_csv_path:
|
|
33
|
+
default: "./leave-of-absence-tracking.csv"
|
|
34
|
+
description: "Path to a CSV with columns: employee_name,leave_type,expected_return_date (YYYY-MM-DD),status (active/returned)."
|
|
35
|
+
warn_days_before:
|
|
36
|
+
default: 10
|
|
37
|
+
description: How many days before the expected return date to start flagging as upcoming.
|
|
38
|
+
compatible_agents: [generic, claude, codex]
|
|
39
|
+
notes: >
|
|
40
|
+
Assumes a maintained export from HR/leave-administration tracking active
|
|
41
|
+
leaves; this is the backstop that flags dates, not a substitute for
|
|
42
|
+
legally required FMLA/state-leave notices or interactive-process steps.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: org-chart-manager-drift-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Org Chart Manager Drift Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares the manager field in the HRIS against a separately maintained
|
|
6
|
+
org-chart source of truth and flags mismatches. Use this if the
|
|
7
|
+
"reports to" field has ever gone stale after a reorg, leaving reviews,
|
|
8
|
+
approvals, or reminders routed to someone's old manager for months.
|
|
9
|
+
category: hr
|
|
10
|
+
tags: [hr, org-chart, data-quality, hris]
|
|
11
|
+
schedule: "0 8 1 * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' '
|
|
16
|
+
NR==FNR {
|
|
17
|
+
if (FNR>1) hris_mgr[$1]=$2;
|
|
18
|
+
next;
|
|
19
|
+
}
|
|
20
|
+
FNR==1 {next}
|
|
21
|
+
{
|
|
22
|
+
if (($1 in hris_mgr) && hris_mgr[$1] != $2) {
|
|
23
|
+
printf "MANAGER DRIFT: %s — HRIS says \"%s\", org chart says \"%s\"\n", $1, hris_mgr[$1], $2;
|
|
24
|
+
} else if (!($1 in hris_mgr)) {
|
|
25
|
+
printf "MISSING FROM HRIS: %s — in org chart reporting to \"%s\" but not found in HRIS export\n", $1, $2;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{hris_manager_csv_path}}" "{{org_chart_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
hris_manager_csv_path:
|
|
31
|
+
default: "./hris-manager-export.csv"
|
|
32
|
+
description: "Path to a CSV export from the HRIS with columns: employee_name,manager_name."
|
|
33
|
+
org_chart_csv_path:
|
|
34
|
+
default: "./org-chart-source.csv"
|
|
35
|
+
description: "Path to a CSV from your org-chart source of truth (e.g. an org-design tool or a maintained spreadsheet) with columns: employee_name,manager_name."
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Matches purely on employee_name strings — dedupe/normalize names (or
|
|
39
|
+
swap in employee IDs) before relying on this for a large or
|
|
40
|
+
name-collision-prone roster.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
id: pay-equity-band-outlier-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Pay Equity Band Outlier Check
|
|
4
|
+
description: >
|
|
5
|
+
Scans a salary-band export for employees paid outside their role's band
|
|
6
|
+
or unusually far from the band midpoint, and summarizes any patterns
|
|
7
|
+
worth a closer look. Use this if pay outliers have ever gone unnoticed
|
|
8
|
+
for a review cycle simply because nobody cross-checked salaries against
|
|
9
|
+
bands until an audit or a pay-equity complaint forced the issue.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, pay-equity, compensation, compliance]
|
|
12
|
+
schedule: "0 9 1 1,4,7,10 *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: hybrid
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v tol="{{tolerance_pct}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
band_min=$3; band_max=$4; salary=$5;
|
|
20
|
+
low_bound = band_min * (1 - tol/100);
|
|
21
|
+
high_bound = band_max * (1 + tol/100);
|
|
22
|
+
if (salary < low_bound) {
|
|
23
|
+
printf "BELOW BAND: %s (%s) — $%d vs band $%d-$%d\n", $1, $2, salary, band_min, band_max;
|
|
24
|
+
} else if (salary > high_bound) {
|
|
25
|
+
printf "ABOVE BAND: %s (%s) — $%d vs band $%d-$%d\n", $1, $2, salary, band_min, band_max;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{salary_band_csv_path}}"
|
|
29
|
+
prompt: |
|
|
30
|
+
Run the outlier check above against {{salary_band_csv_path}} (columns:
|
|
31
|
+
employee_name, role, band_min, band_max, current_salary). Using the
|
|
32
|
+
BELOW BAND / ABOVE BAND lines it produces:
|
|
33
|
+
1. Group outliers by role/level and note any pattern (e.g. one role
|
|
34
|
+
consistently under band, one department skewing above).
|
|
35
|
+
2. Do not draw conclusions about protected-class pay gaps — this export
|
|
36
|
+
has no demographic data. Just flag the raw outliers and patterns for
|
|
37
|
+
HR/legal to review with proper pay-equity analysis tooling.
|
|
38
|
+
3. Summarize as a short list HR can triage, ranked by how far outside
|
|
39
|
+
the band each person is.
|
|
40
|
+
script_note: >
|
|
41
|
+
The command gives you the raw list of employees outside their band for
|
|
42
|
+
free. The prompt adds pattern-level grouping (by role/department) to
|
|
43
|
+
help HR prioritize triage — it does not perform statistical pay-equity
|
|
44
|
+
analysis or draw demographic conclusions.
|
|
45
|
+
variables:
|
|
46
|
+
salary_band_csv_path:
|
|
47
|
+
default: "./salary-bands.csv"
|
|
48
|
+
description: "Path to an anonymized/exported CSV with columns: employee_name,role,band_min,band_max,current_salary. No demographic fields."
|
|
49
|
+
tolerance_pct:
|
|
50
|
+
default: 0
|
|
51
|
+
description: Percent tolerance outside the band before flagging (0 = flag anything strictly outside min/max).
|
|
52
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
53
|
+
notes: >
|
|
54
|
+
This is a band-boundary check, not a statistical pay-equity or
|
|
55
|
+
disparate-impact analysis — it deliberately excludes demographic data.
|
|
56
|
+
Route real pay-equity audits through legal counsel and proper
|
|
57
|
+
statistical tooling. Assumes an already-exported salary-band CSV rather
|
|
58
|
+
than live comp-system access.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
id: pto-year-end-use-it-or-lose-it-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Company-Wide PTO Use-It-or-Lose-It Check
|
|
4
|
+
description: >
|
|
5
|
+
Scans the full employee roster for anyone whose unused PTO balance is
|
|
6
|
+
above the policy cap or won't be usable before the year-end reset, so
|
|
7
|
+
HR/payroll can send a bulk nudge. Use this if payout or forfeiture
|
|
8
|
+
disputes have ever come up in December because nobody flagged high
|
|
9
|
+
balances company-wide until it was too late to schedule time off. This
|
|
10
|
+
is the HR-wide roster check — for tracking just your own balance, use
|
|
11
|
+
team/pto-balance-check instead.
|
|
12
|
+
category: hr
|
|
13
|
+
tags: [hr, pto, vacation, compliance, payroll]
|
|
14
|
+
schedule: "0 9 1 10,11,12 *"
|
|
15
|
+
timezone: "America/New_York"
|
|
16
|
+
runner: shell
|
|
17
|
+
command: >
|
|
18
|
+
today_epoch=$(date +%s);
|
|
19
|
+
cutoff_epoch=$(date -d "{{year_end_date}}" +%s 2>/dev/null || date -j -f %Y-%m-%d "{{year_end_date}}" +%s);
|
|
20
|
+
days_left=$(( (cutoff_epoch - today_epoch) / 86400 ));
|
|
21
|
+
awk -F',' -v cap="{{cap_hours}}" -v days_left="$days_left" -v warn="{{warn_days_before}}" '
|
|
22
|
+
NR==1 {next}
|
|
23
|
+
{
|
|
24
|
+
if ($2 > cap) {
|
|
25
|
+
printf "OVER CAP: %s — %s hours unused (cap %s)\n", $1, $2, cap;
|
|
26
|
+
} else if (days_left <= warn && $2 > 0) {
|
|
27
|
+
printf "USE-IT-OR-LOSE-IT: %s — %s hours unused, %d day(s) until year-end reset (%s)\n", $1, $2, days_left, "{{year_end_date}}";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
' "{{pto_roster_csv_path}}"
|
|
31
|
+
variables:
|
|
32
|
+
pto_roster_csv_path:
|
|
33
|
+
default: "./pto-balances.csv"
|
|
34
|
+
description: "Path to a CSV export with columns: employee_name,pto_balance_hours."
|
|
35
|
+
cap_hours:
|
|
36
|
+
default: 80
|
|
37
|
+
description: Company policy cap on unused PTO hours, above which balances are flagged regardless of date.
|
|
38
|
+
year_end_date:
|
|
39
|
+
default: "2026-12-31"
|
|
40
|
+
description: Date (YYYY-MM-DD) unused PTO resets or is forfeited under company policy.
|
|
41
|
+
warn_days_before:
|
|
42
|
+
default: 45
|
|
43
|
+
description: How many days before year_end_date to start flagging nonzero balances.
|
|
44
|
+
compatible_agents: [generic, claude, codex]
|
|
45
|
+
notes: >
|
|
46
|
+
Assumes a maintained roster export from payroll/HRIS with current PTO
|
|
47
|
+
balances for every employee. Distinct from team/pto-balance-check,
|
|
48
|
+
which is a single self-maintained personal reminder, not a company-wide
|
|
49
|
+
audit.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: retirement-plan-enrollment-deadline-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Retirement Plan Enrollment Deadline Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags employees who are eligible for the 401(k)/retirement plan but
|
|
6
|
+
haven't enrolled or waived as their enrollment deadline approaches. Use
|
|
7
|
+
this if someone has ever missed the window to make an active election
|
|
8
|
+
and got dropped into a default auto-enrollment deferral rate they didn't
|
|
9
|
+
actually want.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, retirement, 401k, benefits, 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 "ENROLLMENT DEADLINE: %s — eligible since %s, deadline %s (%d days), no election on file\n", $1, $2, $3, diff_days;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{retirement_tracking_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
retirement_tracking_csv_path:
|
|
31
|
+
default: "./retirement-plan-tracking.csv"
|
|
32
|
+
description: "Path to a CSV with columns: employee_name,eligibility_date (YYYY-MM-DD),enrollment_deadline (YYYY-MM-DD),election_status (enrolled/waived, blank if no election yet)."
|
|
33
|
+
warn_days_before:
|
|
34
|
+
default: 14
|
|
35
|
+
description: How many days before the enrollment deadline to start warning.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: >
|
|
38
|
+
Many plans auto-enroll non-responders at a default deferral rate after
|
|
39
|
+
the deadline rather than defaulting to no contribution — confirm your
|
|
40
|
+
plan document's actual default behavior rather than assuming.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: workers-comp-claim-status-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Workers' Comp Claim Status Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks open workers' compensation claims with the carrier and flags ones
|
|
6
|
+
that have gone quiet or are approaching an expected return-to-work date
|
|
7
|
+
with no update. Use this if an injured employee's claim has ever
|
|
8
|
+
stalled with the carrier for weeks with nobody at the company noticing
|
|
9
|
+
or following up.
|
|
10
|
+
category: hr
|
|
11
|
+
tags: [hr, workers-comp, compliance, safety]
|
|
12
|
+
schedule: "0 9 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: agent-prompt
|
|
15
|
+
prompt: |
|
|
16
|
+
Check {{wc_carrier}} for open workers' compensation claims and
|
|
17
|
+
cross-reference against {{hris_system}} for each claimant's expected
|
|
18
|
+
return-to-work date, if any.
|
|
19
|
+
1. List each open claim: employee name, date of injury, days since last
|
|
20
|
+
status update, and expected return date (if set).
|
|
21
|
+
2. Flag any claim with no status update in the last {{stale_days}} days,
|
|
22
|
+
or with a return date within {{escalate_within_days}} days and no
|
|
23
|
+
recent update, as needing a follow-up call with the carrier.
|
|
24
|
+
3. If everything is progressing normally, say so in one line.
|
|
25
|
+
variables:
|
|
26
|
+
wc_carrier:
|
|
27
|
+
default: "your workers' compensation carrier/TPA"
|
|
28
|
+
description: Where claim status is tracked (the insurance carrier or third-party administrator portal).
|
|
29
|
+
hris_system:
|
|
30
|
+
default: "your HRIS"
|
|
31
|
+
description: Where employee return-to-work dates and leave status are recorded.
|
|
32
|
+
stale_days:
|
|
33
|
+
default: 14
|
|
34
|
+
description: Days with no status update before a claim is flagged as stalled.
|
|
35
|
+
escalate_within_days:
|
|
36
|
+
default: 7
|
|
37
|
+
description: Days before an expected return date at which a claim with no recent update becomes urgent.
|
|
38
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
39
|
+
notes: >
|
|
40
|
+
Read-only status check — actually contacting the carrier, adjusting
|
|
41
|
+
duties, or making return-to-work decisions is for HR/legal/safety to
|
|
42
|
+
handle. No generic script mode since carrier portals vary widely.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
id: conflict-of-interest-check-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Conflict-of-Interest Check Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks new matters or clients waiting on a conflict-of-interest clearance
|
|
6
|
+
and flags any that have sat unresolved past a set number of days. Use
|
|
7
|
+
this if a new engagement has ever started before the conflicts check
|
|
8
|
+
actually cleared, because the request got sent and then forgotten.
|
|
9
|
+
category: legal
|
|
10
|
+
tags: [legal, conflicts-check, intake, compliance]
|
|
11
|
+
schedule: "0 9 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v days="{{overdue_days}}" '
|
|
16
|
+
NR==1 {next}
|
|
17
|
+
$4 == "pending" {
|
|
18
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
19
|
+
cmd | getline requested_epoch; close(cmd);
|
|
20
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
21
|
+
pending_days = (now_epoch - requested_epoch) / 86400;
|
|
22
|
+
if (pending_days >= days) {
|
|
23
|
+
printf "CONFLICTS CHECK PENDING: %s (matter: %s) — requested %s (%d days ago)\n", $1, $2, $3, pending_days;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{conflicts_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
conflicts_csv_path:
|
|
29
|
+
default: "./conflict-checks.csv"
|
|
30
|
+
description: "Path to a CSV with columns: client_or_matter_name,proposed_matter,check_requested_date (YYYY-MM-DD),status (pending/cleared/conflict-identified)."
|
|
31
|
+
overdue_days:
|
|
32
|
+
default: 2
|
|
33
|
+
description: Days a conflicts check can remain pending before it's flagged.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: >
|
|
36
|
+
This tracks whether a conflicts check was run and resolved before
|
|
37
|
+
engagement start — it does not run the conflicts search itself, which
|
|
38
|
+
depends on your practice management/conflicts database.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: corporate-minute-book-completeness-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Corporate Minute Book Completeness Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks the corporate minute book against the list of resolutions and
|
|
6
|
+
actions that should be documented for the year and flags anything
|
|
7
|
+
missing. Use this if a board resolution or annual consent has ever been
|
|
8
|
+
discussed and acted on but never actually got written up and filed in
|
|
9
|
+
the minute book, which surfaces at the worst time — due diligence for
|
|
10
|
+
a financing or sale.
|
|
11
|
+
category: legal
|
|
12
|
+
tags: [legal, corporate-governance, board-resolutions, minute-book]
|
|
13
|
+
schedule: "0 9 1 1,4,7,10 *"
|
|
14
|
+
timezone: "UTC"
|
|
15
|
+
runner: shell
|
|
16
|
+
command: >
|
|
17
|
+
awk -F',' '
|
|
18
|
+
NR==1 {next}
|
|
19
|
+
$4 == "no" {
|
|
20
|
+
printf "MISSING FROM MINUTE BOOK: %s — %s (required by %s, not yet filed)\n", $1, $2, $3;
|
|
21
|
+
}
|
|
22
|
+
' "{{minute_book_checklist_csv_path}}"
|
|
23
|
+
variables:
|
|
24
|
+
minute_book_checklist_csv_path:
|
|
25
|
+
default: "./minute-book-checklist.csv"
|
|
26
|
+
description: "Path to a CSV with columns: item_id,description (e.g. 'annual board consent', 'officer appointment resolution'),required_by_date (YYYY-MM-DD or a plain label like 'Q2'),filed (yes/no)."
|
|
27
|
+
compatible_agents: [generic, claude, codex]
|
|
28
|
+
notes: >
|
|
29
|
+
Assumes someone maintains the checklist whenever a resolution, consent,
|
|
30
|
+
or corporate action is decided — this only checks whether the paper
|
|
31
|
+
trail is complete, it doesn't draft the resolutions themselves.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
id: data-privacy-request-deadline-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Data Privacy Request (GDPR/CCPA) Deadline Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags open data subject access/deletion requests approaching their
|
|
6
|
+
statutory response deadline and drafts a status summary for whoever
|
|
7
|
+
owns the response. Use this if a GDPR or CCPA-style privacy request has
|
|
8
|
+
ever come uncomfortably close to its response window because tracking
|
|
9
|
+
it lived in someone's inbox instead of a real deadline list.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, data-privacy, gdpr, ccpa, deadline]
|
|
12
|
+
schedule: "0 8 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: hybrid
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v days="{{warn_days_before}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$5 == "open" {
|
|
19
|
+
cmd = "date -d \"" $4 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $4 "\" +%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
|
+
printf "PRIVACY REQUEST DUE: %s — %s request, due %s (%d days)\n", $1, $2, $4, diff_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{privacy_requests_csv_path}}"
|
|
28
|
+
prompt: |
|
|
29
|
+
Here is the raw list of open data privacy requests approaching their
|
|
30
|
+
deadline (from the shell check): {{command_output}}. For each one:
|
|
31
|
+
1. Note the request type ({{request_types_hint}}) and which regulation's
|
|
32
|
+
clock applies (e.g. GDPR's ~30-day window, CCPA's 45-day window).
|
|
33
|
+
2. Flag anything with fewer than {{urgent_within_days}} days left as
|
|
34
|
+
urgent and needing an owner today.
|
|
35
|
+
3. Draft a short status update summarizing what's open, what's urgent,
|
|
36
|
+
and who should act next, suitable for pasting into a privacy/legal
|
|
37
|
+
ops channel.
|
|
38
|
+
variables:
|
|
39
|
+
privacy_requests_csv_path:
|
|
40
|
+
default: "./data-privacy-requests.csv"
|
|
41
|
+
description: "Path to a CSV with columns: request_id,request_type (access/deletion/correction/opt-out),regulation (gdpr/ccpa/other),response_due_date (YYYY-MM-DD),status (open/closed)."
|
|
42
|
+
warn_days_before:
|
|
43
|
+
default: 7
|
|
44
|
+
description: Days before the statutory response deadline to start flagging.
|
|
45
|
+
urgent_within_days:
|
|
46
|
+
default: 2
|
|
47
|
+
description: Days left at which an open request becomes urgent in the drafted summary.
|
|
48
|
+
request_types_hint:
|
|
49
|
+
default: "access, deletion, correction, or opt-out of sale"
|
|
50
|
+
description: Short reminder of the request categories your intake form uses.
|
|
51
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
52
|
+
script_note: >
|
|
53
|
+
The shell command gives a zero-token list of requests inside the warning
|
|
54
|
+
window from date math alone; the prompt adds regulation-specific
|
|
55
|
+
framing and a drafted, prioritized summary a non-lawyer can act on
|
|
56
|
+
without re-reading each row.
|
|
57
|
+
notes: >
|
|
58
|
+
Actual statutory deadlines, extensions, and exceptions vary by
|
|
59
|
+
regulation and request type — confirm with privacy counsel. This is a
|
|
60
|
+
tracking and drafting aid, not a substitute for legal review of any
|
|
61
|
+
individual request.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: entity-authority-document-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Entity Authority Document Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Warns before a power of attorney, corporate signing-authority
|
|
6
|
+
certificate, or other entity-authority document reaches its expiration
|
|
7
|
+
date. Use this if a bank, counterparty, or government office has ever
|
|
8
|
+
rejected a signature because the power of attorney or authority
|
|
9
|
+
certificate backing it had quietly expired.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, power-of-attorney, corporate-authority, compliance]
|
|
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: \"" $1 "\" (" $2 ") expires in " days_left " days (" $3 ")";
|
|
23
|
+
}
|
|
24
|
+
' {{authority_docs_csv}}
|
|
25
|
+
variables:
|
|
26
|
+
authority_docs_csv:
|
|
27
|
+
default: "entity-authority-documents.csv"
|
|
28
|
+
description: "CSV with header row, columns: document_name,document_type (e.g. power-of-attorney, signing-authority-certificate),expiry_date(YYYY-MM-DD)."
|
|
29
|
+
warn_days:
|
|
30
|
+
default: 45
|
|
31
|
+
description: Days before expiry to start warning.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Distinct from `business-license-renewal-check` (operating licenses/permits)
|
|
35
|
+
— this tracks documents that grant someone authority to act or sign on
|
|
36
|
+
the entity's behalf. Update the CSV whenever an authority document is
|
|
37
|
+
issued, renewed, or revoked.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
id: legal-document-retention-purge-review
|
|
2
|
+
version: 1
|
|
3
|
+
name: Legal Document Retention Purge Review
|
|
4
|
+
description: >
|
|
5
|
+
Checks contracts and legal documents against their retention schedule
|
|
6
|
+
and flags anything past its retention period as eligible for archival
|
|
7
|
+
or destruction review. Use this if signed contracts and legal files
|
|
8
|
+
have ever piled up indefinitely because nobody was checking them
|
|
9
|
+
against how long the business's own retention policy actually requires
|
|
10
|
+
keeping them.
|
|
11
|
+
category: legal
|
|
12
|
+
tags: [legal, records-retention, document-management, compliance]
|
|
13
|
+
schedule: "0 8 1 * *"
|
|
14
|
+
timezone: "UTC"
|
|
15
|
+
runner: shell
|
|
16
|
+
command: >
|
|
17
|
+
today=$(date +%s);
|
|
18
|
+
awk -F',' -v today="$today" '
|
|
19
|
+
NR==1 {next}
|
|
20
|
+
$4 == "no" {
|
|
21
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
22
|
+
cmd | getline exp_epoch; close(cmd);
|
|
23
|
+
if (today >= exp_epoch) {
|
|
24
|
+
printf "RETENTION EXPIRED: %s (%s) — retention ended %s, check for holds before purging\n", $1, $2, $3;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{records_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
records_csv_path:
|
|
30
|
+
default: "./legal-records-retention-schedule.csv"
|
|
31
|
+
description: "Path to a CSV with columns: document_id,document_type,retention_end_date (YYYY-MM-DD),reviewed (yes/no). One row per contract/legal document tracked under the retention policy."
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Business's own contract/legal-file retention schedule — distinct from
|
|
35
|
+
`public-records-retention-purge-check` in government (public-sector
|
|
36
|
+
records law) and from `litigation-hold-acknowledgment-tracker` in this
|
|
37
|
+
category. Always cross-check against any active litigation hold before
|
|
38
|
+
destroying anything this flags — a hold overrides the normal retention
|
|
39
|
+
schedule.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: litigation-hold-acknowledgment-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Litigation Hold Acknowledgment Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks active litigation hold notices against the custodian list and
|
|
6
|
+
flags anyone who hasn't acknowledged receipt yet. Use this if a
|
|
7
|
+
litigation hold has ever gone out and nobody could later prove every
|
|
8
|
+
custodian actually got and confirmed it, which is exactly what gets
|
|
9
|
+
picked apart in a spoliation motion.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, litigation, litigation-hold, ediscovery, compliance]
|
|
12
|
+
schedule: "0 8 * * 1-5"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v days="{{escalate_after_days}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
$5 == "active" && $4 == "" {
|
|
19
|
+
cmd = "date -d \"" $3 "\" +%s 2>/dev/null || date -j -f %Y-%m-%d \"" $3 "\" +%s 2>/dev/null";
|
|
20
|
+
cmd | getline sent_epoch; close(cmd);
|
|
21
|
+
"date +%s" | getline now_epoch; close("date +%s");
|
|
22
|
+
pending_days = (now_epoch - sent_epoch) / 86400;
|
|
23
|
+
if (pending_days >= days) {
|
|
24
|
+
printf "NOT ACKNOWLEDGED: %s — hold \"%s\" sent %s (%d days ago)\n", $1, $2, $3, pending_days;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
' "{{holds_csv_path}}"
|
|
28
|
+
variables:
|
|
29
|
+
holds_csv_path:
|
|
30
|
+
default: "./litigation-holds.csv"
|
|
31
|
+
description: "Path to a CSV with columns: custodian_name,matter_name,notice_sent_date (YYYY-MM-DD),acknowledged_date (blank if not yet acknowledged),hold_status (active/released)."
|
|
32
|
+
escalate_after_days:
|
|
33
|
+
default: 5
|
|
34
|
+
description: Days a sent hold notice can go unacknowledged before it's flagged for follow-up.
|
|
35
|
+
compatible_agents: [generic, claude, codex]
|
|
36
|
+
notes: >
|
|
37
|
+
Assumes counsel maintains the CSV whenever a hold is issued, released, or
|
|
38
|
+
a custodian confirms receipt. Distinct from court-deadline-reminder
|
|
39
|
+
(filing/response deadlines within a matter) — this tracks preservation
|
|
40
|
+
obligations and custodian acknowledgment instead.
|