@wonsukchoi/crondex 0.20.1 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -30
- package/catalog.json +3052 -81
- 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/fieldservice/maintenance-contract-renewal-check.yaml +36 -0
- package/jobs/fieldservice/parts-low-stock-reorder-check.yaml +29 -0
- package/jobs/fieldservice/tech-eta-no-show-check.yaml +32 -0
- package/jobs/fieldservice/tech-license-renewal-check.yaml +36 -0
- package/jobs/fieldservice/unpaid-invoice-aging-check.yaml +35 -0
- package/jobs/fieldservice/unresolved-callback-tracker.yaml +35 -0
- package/jobs/fieldservice/warranty-claim-expiry-check.yaml +35 -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/publishing/arc-review-copy-followup.yaml +35 -0
- package/jobs/publishing/isbn-registration-tracker.yaml +35 -0
- package/jobs/publishing/manuscript-deadline-tracker.yaml +34 -0
- package/jobs/publishing/permissions-clearance-tracker.yaml +36 -0
- package/jobs/publishing/print-run-reorder-threshold-check.yaml +32 -0
- package/jobs/publishing/rights-license-expiry-check.yaml +35 -0
- package/jobs/publishing/royalty-statement-due-check.yaml +33 -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/jobs/spa/appointment-no-show-tracker.yaml +46 -0
- package/jobs/spa/gift-card-expiry-check.yaml +35 -0
- package/jobs/spa/license-renewal-tracker.yaml +35 -0
- package/jobs/spa/membership-unused-session-expiry-check.yaml +35 -0
- package/jobs/spa/product-chemical-expiry-check.yaml +35 -0
- package/jobs/spa/retail-product-low-stock-check.yaml +26 -0
- package/jobs/spa/safety-inspection-due-reminder.yaml +33 -0
- package/jobs/telecom/circuit-outage-detection.yaml +38 -0
- package/jobs/telecom/circuit-provisioning-order-aging.yaml +36 -0
- package/jobs/telecom/cpe-firmware-update-tracker.yaml +45 -0
- package/jobs/telecom/link-capacity-threshold-alert.yaml +37 -0
- package/jobs/telecom/peering-transit-contract-renewal-check.yaml +36 -0
- package/jobs/telecom/service-ticket-churn-risk-review.yaml +56 -0
- package/jobs/telecom/sla-uptime-breach-tracker.yaml +36 -0
- package/lib/category-descriptions.js +4 -0
- package/lib/duplicates-allowlist.js +10 -0
- package/package.json +2 -2
|
@@ -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.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: non-compete-expiry-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Non-Compete / Non-Solicit Expiry Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Tracks the restricted-period end date of non-compete and non-solicit
|
|
6
|
+
agreements for departed employees and warns as each one is about to
|
|
7
|
+
expire. Use this if you've ever needed to know exactly when a former
|
|
8
|
+
employee's restrictive covenant runs out — before deciding whether to
|
|
9
|
+
act on a suspected violation, or before it's too late to.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, non-compete, non-solicit, restrictive-covenants, employment]
|
|
12
|
+
schedule: "0 9 1 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
18
|
+
NR>1 {
|
|
19
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
20
|
+
cmd | getline exp_ts; close(cmd);
|
|
21
|
+
days_left = int((exp_ts - today) / 86400);
|
|
22
|
+
if (days_left <= warn) print "WARNING: " $2 " covenant for " $1 " expires in " days_left " days (" $3 ")";
|
|
23
|
+
}
|
|
24
|
+
' {{covenants_csv}}
|
|
25
|
+
variables:
|
|
26
|
+
covenants_csv:
|
|
27
|
+
default: "non-compete-covenants.csv"
|
|
28
|
+
description: "CSV with header row, columns: former_employee_name,covenant_type (non-compete/non-solicit),restricted_period_end_date(YYYY-MM-DD)."
|
|
29
|
+
warn_days:
|
|
30
|
+
default: 30
|
|
31
|
+
description: Days before the restricted period ends to start warning.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Enforceability of these covenants varies a lot by state/country and has
|
|
35
|
+
been narrowing in many jurisdictions — confirm with counsel before
|
|
36
|
+
relying on any covenant as still enforceable. Update the CSV whenever
|
|
37
|
+
an employee with a covenant departs.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: outside-counsel-invoice-budget-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Outside Counsel Invoice Budget Check
|
|
4
|
+
description: >
|
|
5
|
+
Compares outside counsel invoices billed to date against each matter's
|
|
6
|
+
approved budget and flags matters approaching or over budget. Use this
|
|
7
|
+
if a matter budget has ever been blown through silently because
|
|
8
|
+
invoices got approved one at a time without anyone tracking the
|
|
9
|
+
running total against the budget set at intake.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, outside-counsel, billing, budget]
|
|
12
|
+
schedule: "0 9 1,15 * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v warn_pct="{{warn_at_percent}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
budget = $3 + 0;
|
|
20
|
+
billed = $4 + 0;
|
|
21
|
+
if (budget > 0) {
|
|
22
|
+
pct = (billed / budget) * 100;
|
|
23
|
+
if (pct >= warn_pct) {
|
|
24
|
+
printf "BUDGET ALERT: %s (firm: %s) — billed $%.2f of $%.2f budget (%.0f%%)\n", $1, $2, billed, budget, pct;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
' "{{matter_budgets_csv_path}}"
|
|
29
|
+
variables:
|
|
30
|
+
matter_budgets_csv_path:
|
|
31
|
+
default: "./outside-counsel-matter-budgets.csv"
|
|
32
|
+
description: "Path to a CSV with columns: matter_name,firm_name,approved_budget,billed_to_date. One row per matter with active outside counsel."
|
|
33
|
+
warn_at_percent:
|
|
34
|
+
default: 80
|
|
35
|
+
description: Percent of approved budget billed at which a matter gets flagged.
|
|
36
|
+
compatible_agents: [generic, claude, codex]
|
|
37
|
+
notes: Update billed_to_date from approved invoices (e.g. e-billing/LEDES exports) before each run — this only compares numbers you supply, it doesn't parse invoices itself.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: settlement-payment-schedule-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Settlement Payment Schedule Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks scheduled settlement agreement installment payments — both
|
|
6
|
+
owed and owed to you — and flags anything due soon or missed. Use this
|
|
7
|
+
if a settlement installment has ever been paid late (risking default
|
|
8
|
+
terms kicking back in) or received late without anyone noticing until
|
|
9
|
+
the next reconciliation.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, settlement, payment-schedule, litigation]
|
|
12
|
+
schedule: "0 8 * * *"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
18
|
+
NR>1 && $5 == "unpaid" {
|
|
19
|
+
cmd="date -d \"" $4 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $4 "\" +%s";
|
|
20
|
+
cmd | getline due_ts; close(cmd);
|
|
21
|
+
days_left = int((due_ts - today) / 86400);
|
|
22
|
+
if (days_left < 0) print "MISSED: " $1 " installment #" $2 " ($" $3 ") was due " $4 " (" (days_left*-1) " days overdue)";
|
|
23
|
+
else if (days_left <= warn) print "DUE SOON: " $1 " installment #" $2 " ($" $3 ") due " $4 " (" days_left " days)";
|
|
24
|
+
}
|
|
25
|
+
' {{settlements_csv}}
|
|
26
|
+
variables:
|
|
27
|
+
settlements_csv:
|
|
28
|
+
default: "settlement-payment-schedule.csv"
|
|
29
|
+
description: "CSV with header row, columns: matter_or_counterparty,installment_number,amount,due_date(YYYY-MM-DD),status(paid/unpaid)."
|
|
30
|
+
warn_days:
|
|
31
|
+
default: 7
|
|
32
|
+
description: Days before an installment's due date to start warning.
|
|
33
|
+
compatible_agents: [generic, claude, codex]
|
|
34
|
+
notes: Update the status column as each installment clears — this only reads dates and status you supply, it doesn't confirm receipt/disbursement of funds itself.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
id: timekeeper-billable-hours-compliance-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Timekeeper Billable Hours Compliance Check
|
|
4
|
+
description: >
|
|
5
|
+
Checks attorneys and paralegals against their weekly timesheet
|
|
6
|
+
submission and minimum billable-hour targets, and flags anyone missing
|
|
7
|
+
or short. Use this if unbilled time has ever quietly leaked out of a
|
|
8
|
+
matter because a timekeeper fell behind on entering hours and nobody
|
|
9
|
+
caught it before the billing cycle closed.
|
|
10
|
+
category: legal
|
|
11
|
+
tags: [legal, timekeeping, billable-hours, compliance]
|
|
12
|
+
schedule: "0 8 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
awk -F',' -v target="{{min_weekly_hours}}" '
|
|
17
|
+
NR==1 {next}
|
|
18
|
+
{
|
|
19
|
+
hours = $3 + 0;
|
|
20
|
+
if ($3 == "" ) {
|
|
21
|
+
printf "MISSING TIMESHEET: %s — week of %s not submitted\n", $1, $2;
|
|
22
|
+
} else if (hours < target) {
|
|
23
|
+
printf "SHORT OF TARGET: %s — week of %s logged %.1f hrs (target %s)\n", $1, $2, hours, target;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
' "{{timesheets_csv_path}}"
|
|
27
|
+
variables:
|
|
28
|
+
timesheets_csv_path:
|
|
29
|
+
default: "./timekeeper-hours.csv"
|
|
30
|
+
description: "Path to a CSV with columns: timekeeper_name,week_start_date (YYYY-MM-DD),billable_hours_logged (blank if not yet submitted). One row per timekeeper per week."
|
|
31
|
+
min_weekly_hours:
|
|
32
|
+
default: 30
|
|
33
|
+
description: Minimum billable hours expected per timekeeper per week before flagging a shortfall.
|
|
34
|
+
compatible_agents: [generic, claude, codex]
|
|
35
|
+
notes: >
|
|
36
|
+
Distinct from any HR timesheet/payroll job — this checks billable-hour
|
|
37
|
+
compliance for legal timekeepers against matter-billing targets, not
|
|
38
|
+
hourly payroll attendance. Export the CSV from your time & billing
|
|
39
|
+
system before each run.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
id: trademark-infringement-watch
|
|
2
|
+
version: 1
|
|
3
|
+
name: Trademark Infringement Watch
|
|
4
|
+
description: >
|
|
5
|
+
Searches for new trademark applications, domain registrations, and
|
|
6
|
+
marketplace listings that look like they could infringe on your
|
|
7
|
+
registered marks, and summarizes anything worth a closer look. Use
|
|
8
|
+
this if you've ever found out about a confusingly similar competitor
|
|
9
|
+
mark or copycat domain months after it started causing customer
|
|
10
|
+
confusion, instead of when it first appeared.
|
|
11
|
+
category: legal
|
|
12
|
+
tags: [legal, trademark, ip, infringement-watch]
|
|
13
|
+
schedule: "0 9 * * 1"
|
|
14
|
+
timezone: "UTC"
|
|
15
|
+
runner: agent-prompt
|
|
16
|
+
prompt: |
|
|
17
|
+
Check for potential infringement of these registered marks:
|
|
18
|
+
{{marks_to_watch}} (owned in classes/goods: {{goods_or_classes}}).
|
|
19
|
+
1. Search recent trademark application filings (e.g. via the relevant
|
|
20
|
+
trademark office's public search/TESS-style database) for new marks
|
|
21
|
+
confusingly similar in name or logo, filed in overlapping
|
|
22
|
+
goods/services classes.
|
|
23
|
+
2. Search for newly registered domain names that are close
|
|
24
|
+
misspellings or lookalikes of {{marks_to_watch}}.
|
|
25
|
+
3. Spot-check major marketplaces/app stores for listings using the mark
|
|
26
|
+
or a confusing variant without authorization.
|
|
27
|
+
4. For each hit, summarize: what was found, how similar it is, and
|
|
28
|
+
whether it looks like routine noise or worth flagging to counsel.
|
|
29
|
+
5. This is a monitoring aid, not legal advice on whether infringement
|
|
30
|
+
exists — say so, and recommend counsel review anything flagged.
|
|
31
|
+
variables:
|
|
32
|
+
marks_to_watch:
|
|
33
|
+
default: "list your registered trademark(s) here"
|
|
34
|
+
description: The registered mark(s)/brand name(s) to watch for lookalikes.
|
|
35
|
+
goods_or_classes:
|
|
36
|
+
default: "your registered goods/services classes"
|
|
37
|
+
description: The goods/services or trademark classes your registration covers, to judge overlap.
|
|
38
|
+
compatible_agents: [claude, codex, hermes, openclaw, generic]
|
|
39
|
+
notes: >
|
|
40
|
+
Distinct from `trademark-renewal-reminder`, which tracks renewing your
|
|
41
|
+
own registration — this watches for others potentially infringing it.
|
|
42
|
+
Search coverage depends on what databases/tools the agent can actually
|
|
43
|
+
reach; a paid watch service will catch more than open search alone.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
id: vendor-coi-expiry-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Vendor Certificate of Insurance Expiry Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Checks certificates of insurance you've collected from vendors and
|
|
6
|
+
contractors and warns before any expire, so a lapsed COI doesn't sit
|
|
7
|
+
unnoticed in the file. Use this if a vendor's insurance has ever lapsed
|
|
8
|
+
mid-contract and nobody found out until a claim needed it.
|
|
9
|
+
category: legal
|
|
10
|
+
tags: [legal, vendor-management, coi, contractor-compliance]
|
|
11
|
+
schedule: "0 9 1 * *"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F, -v today="$today" -v warn={{warn_days}} '
|
|
17
|
+
NR>1 {
|
|
18
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
19
|
+
cmd | getline exp_ts; close(cmd);
|
|
20
|
+
days_left = int((exp_ts - today) / 86400);
|
|
21
|
+
if (days_left <= warn) print "WARNING: COI for \"" $1 "\" (" $2 ") expires in " days_left " days (" $3 ")";
|
|
22
|
+
}
|
|
23
|
+
' {{vendor_cois_csv}}
|
|
24
|
+
variables:
|
|
25
|
+
vendor_cois_csv:
|
|
26
|
+
default: "vendor-certificates-of-insurance.csv"
|
|
27
|
+
description: "CSV with header row, columns: vendor_name,coverage_type (e.g. general-liability, workers-comp),expiry_date(YYYY-MM-DD)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 30
|
|
30
|
+
description: Days before a vendor's COI expires to start warning.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Opposite direction from insurance's `certificate-of-insurance-request-check`
|
|
34
|
+
(which tracks fulfilling requests for your own COI) — this tracks
|
|
35
|
+
certificates other parties gave you, as a contract-compliance/vendor-risk
|
|
36
|
+
check rather than an insurance-desk workflow. Update the CSV whenever a
|
|
37
|
+
vendor sends a new or renewed COI.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: arc-review-copy-followup
|
|
2
|
+
version: 1
|
|
3
|
+
name: ARC Review Copy Followup
|
|
4
|
+
description: >
|
|
5
|
+
Flags reviewers, bloggers, or media contacts who received an advance
|
|
6
|
+
review copy (ARC) but haven't posted or filed a review within a set
|
|
7
|
+
window, so a nudge can go out before the publication date. Use this if
|
|
8
|
+
ARCs have ever been sent out and quietly forgotten with no review to show
|
|
9
|
+
for them.
|
|
10
|
+
category: publishing
|
|
11
|
+
tags: [publishing, arc, review-copies, marketing]
|
|
12
|
+
schedule: "0 9 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v follow={{followup_days}} '
|
|
18
|
+
NR>1 && $4 == "no" {
|
|
19
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
20
|
+
cmd | getline sent_ts; close(cmd);
|
|
21
|
+
days_since = int((today - sent_ts) / 86400);
|
|
22
|
+
if (days_since >= follow) print "FOLLOW UP: " $2 " received ARC for \"" $1 "\" " days_since " days ago, no review posted";
|
|
23
|
+
}
|
|
24
|
+
' "{{arc_recipients_csv}}"
|
|
25
|
+
variables:
|
|
26
|
+
arc_recipients_csv:
|
|
27
|
+
default: "./arc-recipients.csv"
|
|
28
|
+
description: "CSV with header row, columns: title,recipient,sent_date(YYYY-MM-DD),review_posted(yes|no)."
|
|
29
|
+
followup_days:
|
|
30
|
+
default: 21
|
|
31
|
+
description: Days after sending an ARC to wait before flagging a followup nudge.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Mark review_posted=yes in arc-recipients.csv as reviews come in so they
|
|
35
|
+
stop being flagged. Pair with your publicist's contact list export.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: isbn-registration-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: ISBN Registration Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags upcoming titles that don't yet have an ISBN assigned and registered
|
|
6
|
+
with the relevant agency, checked against their planned publication date.
|
|
7
|
+
Use this if a title has ever hit its pub date without an ISBN because
|
|
8
|
+
registration wasn't started early enough.
|
|
9
|
+
category: publishing
|
|
10
|
+
tags: [publishing, isbn, metadata, pre-press]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v lead={{lead_days}} '
|
|
17
|
+
NR>1 {
|
|
18
|
+
cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
|
|
19
|
+
cmd | getline pub_ts; close(cmd);
|
|
20
|
+
days_left = int((pub_ts - today) / 86400);
|
|
21
|
+
if ($3 == "" && days_left <= lead) print "MISSING ISBN: \"" $1 "\" publishes in " days_left " days (" $2 ") — no ISBN registered";
|
|
22
|
+
}
|
|
23
|
+
' "{{titles_csv}}"
|
|
24
|
+
variables:
|
|
25
|
+
titles_csv:
|
|
26
|
+
default: "./upcoming-titles.csv"
|
|
27
|
+
description: "CSV with header row, columns: title,pub_date(YYYY-MM-DD),isbn(blank if not yet assigned)."
|
|
28
|
+
lead_days:
|
|
29
|
+
default: 60
|
|
30
|
+
description: Days before publication to start warning if an ISBN is still missing.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Update upcoming-titles.csv as soon as an ISBN is assigned so the title
|
|
34
|
+
drops off the warning list. Registration lead time varies by agency, so
|
|
35
|
+
set lead_days to comfortably exceed your agency's typical turnaround.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: manuscript-deadline-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Manuscript Deadline Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags manuscript milestones (first draft, revisions, final delivery) coming
|
|
6
|
+
due from authors or editors. Use this if a book has ever slipped its
|
|
7
|
+
production schedule because a manuscript deadline only lived in an email
|
|
8
|
+
thread nobody rechecked.
|
|
9
|
+
category: publishing
|
|
10
|
+
tags: [publishing, manuscripts, authors, deadlines]
|
|
11
|
+
schedule: "0 9 * * 1-5"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
17
|
+
NR>1 {
|
|
18
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
19
|
+
cmd | getline due_ts; close(cmd);
|
|
20
|
+
days_left = int((due_ts - today) / 86400);
|
|
21
|
+
if (days_left <= warn) print "DUE SOON: \"" $1 "\" (" $2 ") milestone due in " days_left " days (" $3 ")";
|
|
22
|
+
}
|
|
23
|
+
' "{{manuscripts_csv}}"
|
|
24
|
+
variables:
|
|
25
|
+
manuscripts_csv:
|
|
26
|
+
default: "./manuscripts.csv"
|
|
27
|
+
description: "CSV with header row, columns: title,milestone(draft|revision|final),due_date(YYYY-MM-DD)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 7
|
|
30
|
+
description: Days before a milestone due date to start warning.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Keep manuscripts.csv updated with each title's next milestone as it's
|
|
34
|
+
scheduled or renegotiated with the author/editor.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: permissions-clearance-tracker
|
|
2
|
+
version: 1
|
|
3
|
+
name: Permissions Clearance Tracker
|
|
4
|
+
description: >
|
|
5
|
+
Flags quoted material, images, lyrics, or other third-party content in a
|
|
6
|
+
forthcoming title that still needs permissions clearance before the book
|
|
7
|
+
goes to press. Use this if a title has ever gone to print with an
|
|
8
|
+
uncleared quote or image because clearance status wasn't tracked
|
|
9
|
+
centrally.
|
|
10
|
+
category: publishing
|
|
11
|
+
tags: [publishing, permissions, rights-clearance, pre-press]
|
|
12
|
+
schedule: "0 9 * * 1"
|
|
13
|
+
timezone: "UTC"
|
|
14
|
+
runner: shell
|
|
15
|
+
command: >
|
|
16
|
+
today=$(date +%s);
|
|
17
|
+
awk -F',' -v today="$today" -v lead={{lead_days}} '
|
|
18
|
+
NR>1 && $4 != "cleared" {
|
|
19
|
+
cmd="date -d \"" $2 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $2 "\" +%s";
|
|
20
|
+
cmd | getline pub_ts; close(cmd);
|
|
21
|
+
days_left = int((pub_ts - today) / 86400);
|
|
22
|
+
if (days_left <= lead) print "UNCLEARED: \"" $1 "\" — item \"" $3 "\" status=" $4 ", publishes in " days_left " days";
|
|
23
|
+
}
|
|
24
|
+
' "{{permissions_csv}}"
|
|
25
|
+
variables:
|
|
26
|
+
permissions_csv:
|
|
27
|
+
default: "./permissions-clearances.csv"
|
|
28
|
+
description: "CSV with header row, columns: title,pub_date(YYYY-MM-DD),item_description,status(pending|requested|denied|cleared)."
|
|
29
|
+
lead_days:
|
|
30
|
+
default: 30
|
|
31
|
+
description: Days before publication to start warning about any item not yet marked cleared.
|
|
32
|
+
compatible_agents: [generic, claude, codex]
|
|
33
|
+
notes: >
|
|
34
|
+
Update permissions-clearances.csv as each request is sent, denied, or
|
|
35
|
+
cleared. A "denied" item still shows up here deliberately — it needs
|
|
36
|
+
editorial follow-up (cut or replace) before press, not just tracking.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
id: print-run-reorder-threshold-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Print Run Reorder Threshold Check
|
|
4
|
+
description: >
|
|
5
|
+
Flags titles whose warehouse stock has dropped below the reorder
|
|
6
|
+
threshold, so a reprint can be queued before the book goes out of stock.
|
|
7
|
+
Use this if a title has ever gone unavailable for weeks because nobody
|
|
8
|
+
noticed the print run was running low until it was already sold out.
|
|
9
|
+
category: publishing
|
|
10
|
+
tags: [publishing, print-run, inventory, reprints]
|
|
11
|
+
schedule: "0 8 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
awk -F',' -v default_threshold={{default_reorder_threshold}} '
|
|
16
|
+
NR>1 {
|
|
17
|
+
threshold = ($3 != "" ? $3 : default_threshold);
|
|
18
|
+
if ($2+0 <= threshold+0) print "LOW STOCK: \"" $1 "\" at " $2 " units (reorder threshold " threshold ")";
|
|
19
|
+
}
|
|
20
|
+
' "{{stock_csv}}"
|
|
21
|
+
variables:
|
|
22
|
+
stock_csv:
|
|
23
|
+
default: "./print-run-stock.csv"
|
|
24
|
+
description: "CSV with header row, columns: title,units_in_stock,reorder_threshold(optional, blank uses default)."
|
|
25
|
+
default_reorder_threshold:
|
|
26
|
+
default: 250
|
|
27
|
+
description: Fallback reorder threshold (in units) used when a title's row doesn't set its own.
|
|
28
|
+
compatible_agents: [generic, claude, codex]
|
|
29
|
+
notes: >
|
|
30
|
+
Update print-run-stock.csv from your distributor or warehouse inventory
|
|
31
|
+
export before each run. Reorder threshold should account for reprint
|
|
32
|
+
lead time, not just current demand.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: rights-license-expiry-check
|
|
2
|
+
version: 1
|
|
3
|
+
name: Rights and License Expiry Check
|
|
4
|
+
description: >
|
|
5
|
+
Warns you before a granted or acquired rights/licensing deal (foreign
|
|
6
|
+
rights, film/TV options, audio, translation) expires or comes up for
|
|
7
|
+
renewal. Use this if a rights deal has ever lapsed silently because the
|
|
8
|
+
expiry date only lived in the signed contract's PDF.
|
|
9
|
+
category: publishing
|
|
10
|
+
tags: [publishing, rights, licensing, contracts]
|
|
11
|
+
schedule: "0 9 * * 1"
|
|
12
|
+
timezone: "UTC"
|
|
13
|
+
runner: shell
|
|
14
|
+
command: >
|
|
15
|
+
today=$(date +%s);
|
|
16
|
+
awk -F',' -v today="$today" -v warn={{warn_days}} '
|
|
17
|
+
NR>1 {
|
|
18
|
+
cmd="date -d \"" $3 "\" +%s 2>/dev/null || date -jf \"%Y-%m-%d\" \"" $3 "\" +%s";
|
|
19
|
+
cmd | getline exp_ts; close(cmd);
|
|
20
|
+
days_left = int((exp_ts - today) / 86400);
|
|
21
|
+
if (days_left <= warn) print "WARNING: " $2 " rights for \"" $1 "\" expire in " days_left " days (" $3 ")";
|
|
22
|
+
}
|
|
23
|
+
' "{{rights_csv}}"
|
|
24
|
+
variables:
|
|
25
|
+
rights_csv:
|
|
26
|
+
default: "./rights-licenses.csv"
|
|
27
|
+
description: "CSV with header row, columns: title,rights_type(foreign|film|audio|translation|other),expiry_date(YYYY-MM-DD)."
|
|
28
|
+
warn_days:
|
|
29
|
+
default: 45
|
|
30
|
+
description: Days before a rights expiry date to start warning, so renegotiation or renewal can start in time.
|
|
31
|
+
compatible_agents: [generic, claude, codex]
|
|
32
|
+
notes: >
|
|
33
|
+
Covers both rights you've acquired (e.g. translation rights into a
|
|
34
|
+
language) and rights you've granted out (e.g. a film option). Keep
|
|
35
|
+
rights-licenses.csv updated from your contracts database.
|