Skip to content
Back to skills

Monitor Contacts

ASecurity

Always-on contact freshness monitoring service. Periodically re-researches stale contacts via /dogpile, detects job changes and company news, and alerts via Discord when significant changes are found.

  • 6 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 11, 2026
businessgoshellbashgitapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 14 files and shows the line behind each finding

Scanned September 11, 2026

npx -y skills add grahama1970/agent-skills --skill monitor-contacts --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Monitor Contacts?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Monitor Contacts
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/grahama1970-monitor-contacts/badge)](https://www.skillsdirectory.com/skills/grahama1970-monitor-contacts)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: monitor-contacts
description: >
  Always-on contact freshness monitoring service. Periodically re-researches
  stale contacts via /dogpile, detects job changes and company news, and
  alerts via Discord when significant changes are found.
allowed-tools: ["Bash", "Read", "Write", "Task"]
triggers:
  - monitor contacts
  - contact monitoring
  - watch contacts
  - track contacts
  - contact freshness
  - are my contacts current
  - stale contacts
  - contact changes
metadata:
  short-description: "Always-on contact freshness monitoring with change detection"
  author: "Graham"
  version: "0.1.0"

provides:
  - monitor-contacts
composes:
  - task-monitor
  - agentic-evals
disciplines:
  - observability-operations
  - research-retrieval
---

# monitor-contacts

Always-on contact freshness monitoring service. Runs on a schedule (via
`/scheduler`) to keep contact profiles current, detect significant changes
(job moves, company news, acquisitions), and alert via Discord.

## Why This Exists

Contact enrichment is a point-in-time snapshot. People change jobs. Companies
get acquired. Programs end. This service ensures your contact intelligence
stays fresh without manual re-research.

## Continuous Operation (Non-Negotiable)

This skill is **always-on**. It:
- Runs on its configured schedule indefinitely — it NEVER stops unless explicitly halted by the user
- The agent MUST NOT stop and wait for the human to ask for status or remember to check
- If a cycle fails, diagnose the failure, attempt auto-repair, and continue
- Only escalate to the human if genuinely blocked after exhausting /dogpile research
- Gracefully handles restarts and maintains state across cycles
- Is designed for multi-day/week/month autonomous operation

**Anti-pattern**: Reporting status and waiting for the human to ask "what next?" is UNACCEPTABLE. The agent must proactively fix issues and continue the monitoring loop.

## Architecture

```
┌──────────────────────────────────────────────────────┐
│              monitor-contacts                         │
│  - Scheduled via /scheduler (nightly or weekly)      │
│  - Staleness-based priority queue                    │
│  - Change detection engine                           │
│  - Discord alerting                                  │
└──────────────────────────────────────────────────────┘
         │                    │                    │
    ┌────┴─────┐        ┌────┴─────┐        ┌────┴──────┐
    │ Staleness │        │ Change   │        │ Alert     │
    │ Scanner   │        │ Detector │        │ Engine    │
    ├──────────┤        ├──────────┤        ├───────────┤
    │ Age check │        │ Diff old │        │ Discord   │
    │ Priority  │        │ vs new   │        │ webhook   │
    │ queue     │        │ profile  │        │ Summary   │
    └──────────┘        └──────────┘        └───────────┘
```

## Commands

```bash
# Start monitoring (foreground)
./run.sh monitor

# Start as background service
./run.sh start

# Stop background service
./run.sh stop

# Check service status
./run.sh status

# Run one monitoring cycle manually
./run.sh cycle

# Show contact freshness report
./run.sh report

# Show recent changes
./run.sh changes --since 7d

# Export local-only reconnect relationship records for opportunity consumers
./run.sh relationship-graph --input observed-contacts.json --source-id linkedin:actively-hiring

# Configure monitoring
./run.sh config --interval weekly --budget 10 --alert-channel contacts
```

## Monitoring Cycle

Each cycle:

```
1. SCAN — Find contacts with staleness > threshold
   ├── Default threshold: 30 days
   ├── High-priority contacts: 14 days
   └── Low-priority contacts: 90 days

2. PRIORITIZE — Sort by staleness + importance
   ├── Contacts with upcoming meetings/events → top
   ├── Contacts in active deals/programs → high
   └── Cold contacts → low

3. RESEARCH — Re-enrich top N stale contacts
   ├── Uses /discover-contacts research pipeline
   ├── Budget-limited (default: 10 contacts per cycle)
   └── Rate-limited to avoid API exhaustion

4. DIFF — Compare new profile vs stored profile
   ├── Job title changed?
   ├── Company changed?
   ├── New publications?
   ├── Company news (funding, acquisition)?
   └── Email likely stale?

5. ALERT — Notify on significant changes
   ├── Discord embed with change summary
   ├── Color-coded: green (positive), yellow (neutral), red (attention)
   └── Weekly digest option
```

## Change Detection

The change detector tracks these signals:

| Signal | Severity | Example |
|--------|----------|---------|
| **Job change** | High | "John Rushby moved from SRI to DARPA" |
| **Company acquisition** | High | "Galois acquired by [company]" |
| **New DARPA program** | Medium | "Contact's company awarded new DARPA contract" |
| **New publication** | Low | "3 new papers on ArXiv" |
| **Email bounce** | Medium | "Email domain changed" |
| **Company funding** | Medium | "Series B announced" |
| **Company layoffs** | High | "Major restructuring reported" |
| **Conference appearance** | Low | "Speaking at [event]" |

## Discord Alerts

### Individual Change Alert
```
Contact Change Detected
━━━━━━━━━━━━━━━━━━━━━━

John Rushby
  Was: Senior Computer Scientist @ SRI International
  Now: Program Manager @ DARPA I2O

  Change Type: Job Change (High Priority)
  Detected: 2026-02-12
  Source: LinkedIn via Brave Search

  Action: Update contact record and reach out?
```

### Weekly Digest
```
Contact Monitor — Weekly Digest
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Contacts Checked: 15/60
Changes Found: 3

  Job Changes (1):
    • John Rushby: SRI → DARPA

  Company News (1):
    • Galois, Inc.: Awarded DARPA PROOFS Phase 2

  New Publications (1):
    • Natasha Neogi: 2 new papers on ArXiv

  Stale Contacts (5):
    • 5 contacts not refreshed in 60+ days

Next cycle: 2026-02-19
Budget used: 8/10 /dogpile calls
```

## Priority Tiers

Contacts can be tagged with priority tiers:

```yaml
priority_tiers:
  critical:    # Check every 14 days
    - contacts with active deals
    - contacts in current programs
  standard:    # Check every 30 days (default)
    - general professional network
  cold:        # Check every 90 days
    - historical contacts
    - inactive relationships
```

## Schedule Configuration

```yaml
# monitor-contacts config
schedule:
  interval: weekly          # daily, weekly, biweekly, monthly
  day: sunday               # for weekly
  time: "02:00"             # off-peak
  budget_per_cycle: 10      # max /dogpile calls
  concurrency: 2            # parallel research

alerts:
  discord_channel: contacts # channel name
  webhook_url: ${DISCORD_CONTACTS_WEBHOOK}
  digest: weekly            # individual, weekly, both

thresholds:
  critical_staleness: 14    # days
  standard_staleness: 30    # days
  cold_staleness: 90        # days
```

## Memory + Taxonomy Integration

The skill integrates with the shared memory and taxonomy systems via
`memory_integration.py` for longitudinal contact freshness tracking:

- **Pre-hook (`recall_contact_changes`)**: Before checking a contact, recalls prior
  change history to surface patterns (e.g., frequent job moves, company instability).
- **Post-hook (`learn_contact_change`)**: After detecting a change, stores the change
  event (person, type, old/new values, severity) to memory for trend tracking.
- **Bridge keywords**: Precision, Resilience, Fragility, Corruption, Loyalty, Stealth
  (tuned to contact monitoring domain).
- **Tags**: `["monitor_contacts", person_name, "drift_tracking"] + bridges`

Gracefully degrades if `common.memory_client` or `taxonomy/taxonomy.py` are unavailable.

## monitor-opportunities Composition

`monitor-opportunities` consumes this skill as the standard reconnect graph,
not as an ad hoc lookup. Contact observations, direct relationships, adjacent
ARCOS/formal-methods colleagues, company sponsors, event co-presence, role
moves, project wins, and source-backed no-profile evidence (for example SOS-VO
or LinkedIn News) become local relationship signals in the opportunity report.

Those signals are human-decision records only: reconnect, defer, attend, watch,
or skip. They do not authorize email, LinkedIn, Meetup RSVP, messaging, or ATS
effects. When published to Memory, the opportunity monitor stores recallable
graph-shaped documents through `/store` or `/upsert`; it does not write raw
ArangoDB or vector fields.

The executable boundary for that composition is:

```bash
./run.sh relationship-graph --input observed-contacts.json --source-id <bounded-source-id>
```

Input is a JSON list of observed contacts. Useful fields are `name`, `org` or
`organization`, `profile`, `source_url`, `meetup_url`, `relationship_type`,
`relationship_path`, `evidence_refs`, `preferred_human_channels`, and
`channel_guidance`. Output schema is `monitor_contacts.relationship_graph.v1`
with `relationship_signals[]` shaped for opportunity reports. Every exported
signal has `external_effects=false`, `visible_in_report=true`, and a human-only
recommended action. This command does not scan all Memory records, write raw
ArangoDB, message anyone, RSVP, or send email.

Contact-route freshness is part of the observation. Corporate email often fails
after a long gap because the contact changed employers, the company blocks
external mail, or aliases have gone stale. Relationship observations should
preserve safe human routes such as LinkedIn handoff and, when owned/approved and
non-deceptive, an authorized persona Gmail route. These routes are reachability
guidance only; the human still transmits and the monitor never automates contact.

## File Structure

```
monitor-contacts/
  SKILL.md                   # This file
  run.sh                     # Shell entry point
  sanity.sh                  # Sanity checks
  config.py                  # Paths, constants, skill references
  memory_integration.py      # Memory + Taxonomy hooks
  monitor_contacts/relationship_graph.py # Reconnect graph export
```

## Storage

```
/mnt/storage12tb/media/personas/references/
├── darpa_arcos_contacts.csv          # Source contacts
├── darpa_arcos_enriched.yaml         # Current enriched profiles
├── company_profiles/                 # Company intelligence
├── change_log/                       # Historical changes
│   ├── 2026-02/
│   │   ├── 2026-02-12_changes.json
│   │   └── 2026-02-19_changes.json
│   └── ...
├── enrichment_log.json               # Audit trail
└── monitor_config.yaml               # Service configuration
```

## Integration with /scheduler

```bash
# Register with scheduler for weekly runs
/scheduler add monitor-contacts --cron "0 2 * * 0" --budget 10

# Or via run.sh
./run.sh start --schedule weekly
```

## Leveraged Skills

| Skill | Purpose |
|-------|---------|
| `/discover-contacts` | Contact research pipeline |
| `/dogpile` | Multi-source deep research |
| `/memory` | Store/recall enriched profiles |
| `/ops-discord` | Discord webhook alerts |
| `/scheduler` | Scheduled execution |
| `/task-monitor` | Progress tracking |
| `/ops-sam-gov` | Government contract monitoring |
| `/ops-darpa` | DARPA program tracking |

## Task-Monitor Integration

The monitoring service registers with `/task-monitor`:

```json
{
  "task_id": "monitor-contacts-cycle",
  "description": "Contact freshness monitoring cycle",
  "completed": 8,
  "total": 15,
  "stats": {
    "contacts_checked": 8,
    "changes_found": 2,
    "dogpile_calls": 6,
    "budget_remaining": 4
  }
}
```

## Privacy & Ethics

- All research uses publicly available information only
- No automated outreach or email sending
- Change detection is passive (no login scraping)
- Data stored locally on 12TB drive only
- Audit trail tracks all research activity
- Respect rate limits on all sources

Files in this skill

  • SKILL.md12.3 KB
  • config.py1.2 KB
  • fixtures/agentic_eval.json494 B
  • memory_integration.py6.9 KB
  • monitor_contacts/__init__.py427 B
  • monitor_contacts/__main__.py6 KB
  • monitor_contacts/freshness.py5.2 KB
  • monitor_contacts/relationship_graph.py4.2 KB
  • monitor_contacts/store.py2.9 KB
  • pyproject.toml420 B
  • run.sh2.6 KB
  • sanity.sh1.8 KB
  • tests/test_freshness.py3.3 KB
  • uv.lock10.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.