eh, I think you misunderstood me about the filters. I see this: ` batch-update Apply one payload to a filtered contact batch.` Unless I'm misunderstanding how to use that. it sounds like it's not what I wanted/ I was hoping to be able to do this: 1. In batches of perhaps 10-20, pull a list of contacts that have not been updated for a while, and who either: - also have specific tags - also lack specific tags 2. For each of those contacts, do the following: - check if there's anything about the contact itself that informs me I shouldn't need to look at anything else about it, and I can quickly tag them as something like "spam". I expect most of the time, I _won't_ be able to do that. - Fetch the 3-5 most recent tickets from the contact, and look at them, using some framework to score any tags that should apply - Examples: - **customer**: - somebody on our side emailed back +1 - seems like they're talking about packages or items in our warehouse +1 - **promo** + **spam**: contact seems like a business sending us advertisements - from address is something like "no-reply", "noreply", "deals", or "promotions" +1 - it mentions a deal, discount, or coupon +1 - If the scores for any particular set set of tags >= a threshhold, use add_tag to add those tags to the contact - otherwise, add a tag like "ai-checked" - The last step caused the updated date of the contact to increase 3. Due to the very last step above (which bumps the updated date), if I wait and loop back through Step 1 again a few minutes or hours later, I won't retrieve the same contacts I already tagged. - In this way, a looping/repeating task will eventually cycle through all contacts. - Eventually, the ones it has already tagged will have been updated long enough ago, that they will get pulled again ## To be clear: I am describing a broad pattern of workflow here, not specifics. I am just explaining this because: a) The way you implemented the changes seems counterintuitive for how I want to use this, but I could of course be misunderstanding. b) I think the basic concept of this loop should be added to the project documentation, maybe even with a diagram ## Further down the road: - [ ] I will want to develop tags that indicates a specific kind of evaluation needs performed with a contact, just as summarizing their most recent communications with us. - [ ] When looping through contacts, I can add that tag to contacts whose comms need to be summarized - [ ] Then, another agent or script can fetch only contacts tagged to indicate they need summarized - [ ] That script/agent fetches their recent communications, does it's job, and removes the tag, indicating that job is finished - [ ] Other likely tags I will eventually implement: - [ ] basic info needs corrected: - Typical auto-import problems exist in the contact data, such as: - company field contains their email address - username portion of email address is in first_name, but their actual name is in the footer of the email or in the "from" part - basic contact info is actually in the ticket, but not in the correct contact fields: - first name, last name - additional email addresses - phone number(s) - job title - name of their business - We know the name of the company they work for, but no contact.is_company=true exists with that name - Create it - Tag it as needing enrichment - Update the contact(s) who work for that company, setting company = that company - [ ] **NMI mapping**: - [ ] Contact seems to be a customer, but their "Account Number" field is blank, so we're not sure which NMI account is their's - [ ] Try to figure it out by comparing stuff like: - [ ] email address - [ ] name of company - [ ] tracking numbers or order ids mentioned - [ ] ^^ above, but for other contacts who work at the same company - [ ] Update linkages all around: - [ ] Update that company (and it's employees) contacts in redmine so "Account Number" matches `user_account.user_account_id` in NMI - [ ] Set the redmine.contact_id's into a mapping table in NMI that link which contacts are for which account - [ ] Update obsidian profile about the contact/person to include both pieces of info - [ ] **entity extraction and enrichment**: - members of our team responded to somebody, but we don't have (much) info about them in either redmine contacts or in obsidian - This tells us the person is probably an active employee, so we: - search for 5-10 other tickets they worked on lately, and use that to infer a profile of what their job is or fill in context about what they've worked on lately - **phone number linkage to accounts**: - [ ] transcribe/ingest tickets that are call transcripts, adding summary to contact file automatically - [ ] add "note/call" to contact automatically - [ ] identify if follow-up action is needed; if it is, create ticket, assigned to relevant person - [ ] **bobcat caller id**: recognized contact calls us... - [ ] **route call based on context, not just the number**: - [ ] we're super busy, short staffed, and person likes to talk alot: "sorry, we're not available" - [ ] Bob usually talks to this person, but Bob is marked "do not disturb": "voice mail / not available" - [ ] **show on-screen bobcat overlay caller-id** - [ ] **Needing enrichment** (likely more than one tag to represent the kind of enrichment): - [ ] **social media**: - [ ] try to identify their social media profiles (linkedin, facebook, twitter, etc) using name, email, etc. - [ ] possible search known social media groups for people with same/similar name - [ ] identify product website(s)= - [ ] **potential suppliers**: - [ ] search places like alibaba for products we've seen them sell, and try to narrow down who their suppliers are - [ ] pull checkin pictures of shipping labels from them, and cross-reference with other info to locate possible suppliers - [ ] **special handling**: - [ ] **SLA/VIP**: this contact needs very fast or special responses for some reason - [ ] possibly tied to dedicated agent who does something special with their emails, like: - [ ] **trace package**: pull data we'd need to trace the workflows about it: - [ ] if it looks like it has a tracking number, kick off the workflow to pull that up in NMI, get pictures, check who worked on it, tracking status, etc. - [ ] Possibly fetch surveillance from synology autmatically: - [ ] For each major timestamp involved ( box.checkin_date, box.presort_date, individual_product.checkin_date ) pull 2-3 minutes of footage before/after from cameras known to overlook the 2-3 nearest locations in the warehouse - [ ] split the video feed into a series of still images 30-seconds apart - [ ] have a VLM explain what it sees in the images, even checking for specific things: - [ ] presence of truck at loading dock - [ ] person seen walking away from area carrying similar locking box/item - [ ] **import order**: email is an invoice, PO, or similar listing what a person is sending to us, perhaps the reason, and when it should arrive. - [ ] _they're a vendor_: log that supplies were being delivered and what we spent on them - [ ] _prep customer_: make a prep inbound order if it doesn't exist already - [ ] **vendor receipt or invoice**: - [ ] automatically log/input that into the expense tracker if it's not there already - [ ] check if there is a purchase order for it. - [ ] if there is, do something like mark it en-route, received, etc. - [ ] create ticket, assigning somebody to put it away - [ ] assign an AI-INFO-BLOCK to the manager, asking them to find out who ordered it, what for, and why they didn't make a PO - [ ] **employee and it's about scheduling** - [ ] check the attendance-schedule project to see if they already reported it in there - [ ] if not, add it - [ ] assign an AI-INFO-BLOCK asking them to explain why they could not do that themselves - [ ] **check for time-off blockers**: - [ ] somebody else already has time off within 1-2 days - [ ] customer has complained about delays in the past week - [ ] same person asked off on the same weekday/pattern in the past 3-4 weeks, and no good reason - [ ] overall billings/productivity have been low for over a week - [ ] **if blocked**: warn them they can't have the day off unless they can prove it's manditory/unavoidable - [ ] if they say it is, AI-INFO-BLOCK until they provide proof or admit they don't have it - [ ] **very simple question** - [ ] **sales 20-questions**: they sent an email that amounts to playing 20-questions about capacity (wanting to start project) - [ ] **AI-agent uses obsidian and other data**: - [ ] generate really slick looking brochure quickly, using obsidian-backed data - [ ] loop human in to approve it - [ ] update/expand based on human input, then send it over to client - [ ] save it for later, so next time, it can just be sent right away - [ ] **spammer-be-gone**: - [ ] Identify habitual or serious spammers, time wasters, and promoters emailing us - [ ] use gmail MCP to add filters to contact@ldrprep.com so that person's mail doesn't get imported into redmine anymore - [ ] **high-risk contact**: - [ ] there is some special risk or liability related to talking to that contact. For examples: - [ ] litigious person or debt collector - [ ] disgruntled former employee - [ ] stalker spouse of current employee - [ ] handle ticket(s) in a manner people who shouldn't talk to them can't see it or can't respond to it - [ ] phone calls from them do not ring to the general line anyone can answer - [ ] **lead follow-up**: - [ ] contacts marked as wanting to potentially buy something from us or start services, but we've heard crickets for 7+ days - [ ] encourage somebody to call/email them, maybe even suggest what to say/send ## Please ensure this info is saved with the project and easy to locate For right now, much of this will not be immediately practical to implement, but I think storing it here is both important context and saves time.