# Cron Job: pm-heartbeat-weekday

**Job ID:** e356fa099ee4
**Run Time:** 2026-07-06 20:02:54
**Schedule:** 0 20 * * 0-4

## Prompt

[IMPORTANT: The user has invoked the "pm-heartbeat" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

---
name: pm-heartbeat
description: Morning chase digest - Hermes cron reads the Actions register + Daily Records and pushes a short Telegram digest to Rocky (overdue, due-soon, aged-waiting, live jobs gone quiet). READ-ONLY. The autonomous pulse of the /pm cockpit.
runtime: Hermes cron (06:00 Sydney weekdays, 08:00 Sydney weekends)
inputs: Airtable Actions register + Daily Records (base appE43UvTyARe5oJs)
outputs: short Telegram digest to channel 7377499346
failure-mode: "heartbeat up, register unreachable" -- never silence
---

# pm-heartbeat -- the morning pulse

The one thing that makes the system speak first. /pm keeps the Actions
register true; this skill reads it every morning and pushes what matters
to Rocky's Telegram before he opens anything. **READ-ONLY -- this skill
never writes to Airtable. Ever.**

## Runtime

- **Schedule**: 06:00 AEST weekdays, 08:00 AEST weekends (cron, UTC).
- **Auth**: PAT loaded from `~/.hermes/config.yaml` to
  `mcp_servers.airtable.env.AIRTABLE_API_KEY` (NOT shell env). See
  `references/airtable-recipe.md`.
- **Deliver**: `telegram:7377499346` (Rocky's home channel -- fixed binding
  for cron sessions that have no current-chat context).
- **Failure mode**: if Airtable raises an exception, send exactly
  `"heartbeat up, register unreachable"`. A silent morning means nothing
  to chase -- NEVER that the cron died.

## The read

1. Actions register: rows with `Status = Open` or `Waiting`.
2. Jobs: Lifecycle Status (for the QUIET band) + Job Number lookup.
3. Daily Records: latest Diary Ref date per live job.

Field IDs, query recipes, and band logic: `references/airtable-recipe.md`.

## The digest (caveman-short, max 15 lines, worst first)

```
PM 06:00 - 3 chase, 2 due, 1 quiet
OVERDUE: 2649 Clontarf bid - due YESTERDAY
2626 Jalen start-date reply - waiting 9d (chase: Jalen, email)
DUE <=7d: 2654 takeoff back from Assad - Mon 7/7
2630 subcontract signing - Fri 11/7
QUIET: 2631 Hornsby on-site, no diary 4d
```

Band order (cap each at 5 lines): **OVERDUE**, then **AGED WAITING**,
then **DUE 7d or less**, then **QUIET**. Empty morning = one line:
`PM 06:00 - nothing to chase. Register clean or register blind - /pm to verify.`

**No dollar figures in the digest** (phone-lock-screen surface).
Job number + action + age only.

### Packing into 15 lines when the register is full

The "max 15 lines" budget is binding and overrides the per-band cap
when more than one band overflows (a stressed register can have 10+
overdue and 25+ due-this-week). Apply this packing:

- slot 1: header `PM HH:MM - X overdue, Y aged-waiting, Z due<=7d, W quiet`
- slot 2: band label `OVERDUE:`
- slots 3..N: top overdue items, worst first; if overflow, end with `(+(K) more)`
- next slot: next non-empty band label
- last slot(s): QUIET line if non-empty

Skip band labels for empty bands. When overall 15-line cap conflicts
with "5 per band", overall wins -- trim bands proportionally
(4 OVERDUE + 2 AGED + 4 DUE + 1 QUIET = 11 + 4 headers = 15). Full
worked example and copy-pasteable packing function in
`references/digest-packing.md`.

**Meta items are not part of the digest.** Skip "Deploy pm-heartbeat"
or any "system maintenance" Action -- the skill that fires the digest
should never advertise itself in its own output.

### Cron-mode tool restrictions (pitfall)

`execute_code` is BLOCKED in cron sessions ("approve only if this cron
profile is intentionally trusted"). Use Airtable MCP tools directly
for reads and `terminal` for any local processing (heredoc Python works
fine through terminal). Do not waste a turn discovering this.

`telegram` delivery is automatic on the final response -- do not call
`send_message` yourself; the cron harness delivers the final reply.

### Worked QUIET-band fallback

When Lifecycle Status is empty on a job (22 of 25 as of 2026-07-05) and
Daily Records is thin, infer "live" from active Action presence and use
the latest DR date as the silence clock. Worked example from 2026-07-05:
job 2631 (Hornsby) Status=On-site, latest DR Date=2026-06-16, today
2026-07-05, elapsed = 19 calendar days = ~13 working days. Surfaces in
QUIET band as `2631 Hornsby on-site, no diary ~13 wd - DR sync gap`.

## Deploy-time binding

- Base `appE43UvTyARe5oJs` (LFCS-Operations)
- Actions `tblwGQdNqZIPRiDSV`, Jobs `tblcL2EX2w34c1VPe`,
  Daily Records `tbli76T3GvmLSd3Kd`
- Telegram channel `7377499346`

## Smoke-test before arming cron

Before creating the cron job, live-test the read logic in a foreground
session with the user watching. See `lfcs/references/cron-smoke-test.md`
for the full protocol and reusable Python snippets. Five-minute check;
prevents silent misses.

## Deploy note (2026-07-03)

Cron IDs:
- weekday: `e356fa099ee4` (next run `0 20 * * 1-5` UTC = 06:00 AEST)
- weekend: `6864bbd32cdc` (next run `0 22 * * 6,0` UTC = 08:00 AEST)

Sydney is UTC+10 (no DST). Hermes cron whitelist does not include
`CRON_TZ` for `Australia/Sydney`, so cron is in UTC. If AEST/AEDT
shifts after a future DST rule change, recompute the UTC offsets.

Two data gaps surfaced during smoke test (both need OpsMan follow-up):
- 22 of 25 jobs have no Lifecycle Status set -> QUIET band infers "live"
  from active Action presence as a workaround.
- Daily Records has only 2 rows in the table -- either OpsMan DR sync
  is lagging, or DRs go elsewhere now. Either way, the digest falls
  back to "active Actions = live job".

The user has provided the following instruction alongside the skill invocation: [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]

You are running the pm-heartbeat skill. Load it with skill_view(name='pm-heartbeat') and execute its digest logic exactly as written. Read Airtable base appE43UvTyARe5oJs (PAT loads from ~/.hermes/config.yaml → mcp.servers[airtable-mcp-server].env.AIRTABLE_API_KEY, do NOT print it). Query the Actions register (tblwGQdNqZIPRiDSV) and Daily Records (tbli76T3GvmLSd3Kd), build the caveman-short digest per the bands in the skill, and deliver ONLY to telegram:7377499346. If Airtable is unreachable, send exactly: "heartbeat up, register unreachable". Read-only - never write Airtable. Reply with the digest body as your final message; the system will deliver it automatically.

## Response

I have all the data needed. Now let me build the digest. Today is Monday 6 July 2026 (weekday → 06:00 header).

**Date math (Sydney, 6/7/2026, Monday):**
- OVERDUE: Status ∈ {Open,Waiting} AND Due < 2026-07-06
- AGED WAITING: Status=Waiting AND Waiting Since > 3 wd ago (bid) or > 7 wd (other). Default 3 wd fallback.
- DUE ≤7d: Status ∈ {Open,Waiting} AND 2026-07-06 ≤ Due ≤ 2026-07-13
- QUIET: on-site jobs with no DR in last 3 working days

**Job Number → record id cache:** 2648=recw0I5WYG5VlF1k7, 2652=recrQZ2BgEaHJyHAD, 2627 (Airey)=recuKz9Rst1URyJud, 2649=recoJFdrV97JBRF6g, 2631=recZVyX89ijVz5v6k, 2636=recJ6sRZNx6D0K5cA, 2626=recoCFU16Ugn9rqnM, 2637=recFUB1OeJTj9KcHm, 2650=reccEeZpDqvxlxNxX, 2635=recwgsOpYSyLzClak, 2642=recR92uTsW9euHugC, 2646=recVTrnaWHJXNDgFM, 2651=reckQlxOW72FdDtt4, 2645=reciKjZtn5zk5EYtd, 2648=recw0I5WYG5VlF1k7, 2633=recGnLEOfgkkN1l9G, 2640 (no actions), 2641=recmQkjfFnJVJY2UX, 2632=recgOYu2TqgdDf8qh, 2638=rec0fhgPkJANdha5P, 2629=recPQK1qt7YM6FePS, 2647=rec2esypu8EmIX3kG, CQ-FORD=recgFCavi6RCJKyMJ, 2602=recrfQwVeTUAUBl3s, 2630=rectFkTBR5LwoaFHV.

**On-site jobs (Status=On-site):** 2631 Hornsby, 2636 Liverpool, 2638 Burton St, CQ-FORD Circular Quay. Daily Records: only 2 rows total, both for 2631 (Date 2026-06-16). So Hornsby is the QUIET candidate — last DR 2026-06-16, today 6/7 = 20 calendar days = ~14 working days.

Let me apply the bands. I'll filter meta items out (none of the actions are "Deploy pm-heartbeat" itself — recvbTZ1GE80sXchR is "Deploy pm-heartbeat" with Status=Open, Due 2026-07-05. That IS the self-deploy item — SKIP per skill rules). Also "smoko confirm with Hass" recR/OxgAAaUThFMHA — keep (operational, not system maintenance). "engine: BOX PASS" recVDaOWG4UvqXw9Y — keeper lane internal, skip per "system maintenance" rule. "Airtable UI clicks" recaR7oyyO7oKmqGZ — keep (it's a /pm administrative task Rocky runs, but it IS housekeeping. Borderline. Keep — it's not the digest firing itself, it's a UI clean-up chore). Actually re-reading: "Meta items are not part of the digest. Skip 'Deploy pm-heartbeat' or any 'system maintenance' Action." pm-heartbeat deploy is the canonical example. Engine BOX PASS = system maintenance, skip. The other Airtable UI clicks = /pm admin, keep. Actually the "smoko confirm" is personal/social. I'll keep it (operational personal sync, not system maintenance). And the $110+ rateright charge investigation = personal/finance. Keep.

Now classify each Open+Waiting Action with a Due date:

**OVERDUE (Due < 2026-07-06):**
1. rec5Fr1q29vKqdfcz — 2648 Ward Park send place-only (Due 2026-07-04, Open, Me)
2. recJctYc343UnBFeG — 2631 verify concrete order (Due 2026-07-04, Open, Me)
3. recLeLUd6lbZAvvOv — 2650 Macarthur verify outcome (Due 2026-07-04, Open, Me)
4. recWquPcnYeGV7OHM — 2631 book pour crew (Due 2026-07-04, Open, Me)
5. recYdr9th7Mm6LNJc — 2646 MOWA send Isaac email (Due 2026-07-04, Open, Me)
6. recrOxgAAaUThFMHA — Smoko confirm with Hass (Due 2026-07-04, Open, Me) [personal/social — borderline, include as it's a chore]
7. recTagHRlf3R4TTuX — Call Hass bridge wiring (Due 2026-07-04, Open, Me) [system, but it's user-facing, keep]
8. recD53MWaEb8wpm5E — 2631 Ken rev quote buy on Liam OK (Due 2026-07-04, Waiting, Liam)
9. recsLe4LGCWylp2nv — 2649 seats IN send 2 held drafts (Due 2026-07-04, Open, Me) — bid-due-tomorrow pressure
10. recdTmQ40i74yH4X3 — 2649 chase Draffin + SFA (Due 2026-07-04, Open, Me)
11. recvbTZ1GE80sXchR — Deploy pm-heartbeat (Due 2026-07-05, Open, Me) — **SKIP META**
12. recAXYRyNDDEeasyY — Chase Liam 2649 go-ahead (Due 2026-07-05, Waiting, Liam)
13. recJFlH0iO9FGUvVI — 2649 Shaun (Delta) confirms (Due 2026-07-05, Waiting, Them/Shaun)
14. recRDER0untn1sfK — 2649 Liam go/no-go final pack (Due 2026-07-05, Open, Me) — bid-due-tomorrow

**DUE ≤7d (2026-07-06 to 2026-07-13):**
- rec6O6hGu1276sjsu — 2652 chase Ford Civil (Due 2026-07-08, Waiting, Them)
- recJvUq8S6LEt6sZp — 2637 verify award (Due 2026-07-08, Open, Me)
- recOPfe9WbtlIZ26w — 2630 move folder freeze baseline (Due 2026-07-08, Open, Me)
- recOwOHPaJfeSnwiB — 2626 temp works design deliverable (Due 2026-07-08, Open, Me)
- recTNvptr8V0DiPQw — 2642 Soak City verify outcome (Due 2026-07-08, Open, Me)
- reciWIreAtHyIJIax — 2645 ZEB chase Paul Clipsham (Due 2026-07-08, Open, Me)
- recqQnbSToAXIqMKd — 2636 confirm 11-May dayworks (Due 2026-07-08, Open, Me)
- recuKz9Rst1URyJud... no actually recuuNtFqfEn7QGKB — Boss onto Telegram 2636 (Due 2026-07-08, Open, Me)
- recvb... — SKIP
- recvosvBG62rX0Tq1 — 2651 Camellia zzTakeoff (Due 2026-07-08, Open, Me)
- reczDoY2k53deKZoF — 2651 PL insurance + relief valve (Due 2026-07-08, Open, Me)
- reczK8pixOVRIPz9g — 2626 TfNSW ROL blackout check (Due 2026-07-08, Open, Me)
- recczjyD1GpFtVfqw — 2626 pre-start runway /mob gates (Due 2026-07-08, Open, Me)
- recJ31YNRhL1pMw0b — 2636 approve note fix Donald→Donal (Due 2026-07-07, Open, Me)
- recYNzJaN6ExvLUMm — 2636 confirm job name LHP (Due 2026-07-07, Open, Me)
- receAw3IWwt3fWLZx — 2636 fill site-brief who's-who (Due 2026-07-07, Open, Me)
- recfs6C8YCGIw3vgc — 2648 reply Assad Mon retrace (Due 2026-07-07, Open, Me)
- reclFZQYl8DhcMG3t — 2654 RFI to Christian (Due 2026-07-07, Open, Me)
- recrSwXWQ1gNmpiBb — 2654 Assad takeoff reconcile (Due 2026-07-07, Waiting, Assad)
- recRfF6iP3BROasqg — 2651 chase Ray Camellia dig (Due 2026-07-07, Waiting, Them/Ray)
- recSnKgescyYK3fP4 — 2636 paste site-brief (Due 2026-07-06, Open, Me) — **TODAY**
- recaR7oyyO7oKmqGZ — Airtable UI clicks (Due 2026-07-06, Open, Me) — TODAY
- reczu0qtn0slMu9kS — 2626 ask Ray night-works (Due 2026-07-06, Open, Me) — **TODAY**
- recuKmGbNl52FyB88 — 2652 site measure per unit (Due 2026-07-06, Open, Me) — **TODAY**
- recnWhfMjvhgu5RWP — 2626 chase Jalen written acceptance (Due 2026-07-10, Waiting, Them) — within 7d
- recsXlfVCQwsdWAMs — 2631 build ITP+SWMS (Due 2026-07-09, Open, Me) — within 7d
- recahFNiO3yVuLQEu — 2626 confirm Boral written (Due 2026-07-10, Open, Me) — within 7d
- recTJTCo4feqK9tCR — OpenAI refund (Due 2026-07-11, Open, Me) — within 7d
- recFMn19XJhcgoIh3 — 2626 pre-commencement meeting (Due 2026-07-11, Open, Me) — within 7d
- rectM63AuCVkDpjW5 — 2630 payment clause SOPA (Due 2026-07-11, Open, Me) — within 7d
- recNRxRaylUvB6yPl — 2630 LD cl 4.2 blank (Due 2026-07-11, Open, Me) — within 7d
- recnIhUygcmj0PLYH — 2630 works-agreement quals (Due 2026-07-11, Open, Me) — within 7d
- recytv7asqtIgblxA — 2630 FFP cl 11.5-11.9 (Due 2026-07-11, Open, Me) — within 7d

**AGED WAITING:** Status=Waiting, Waiting Since older than threshold. Defaults to 3 wd for non-bid unless Lifecycle shows bid phase.
- rec6O6hGu1276sjsu — 2652 Ford Civil, Waiting Since 2026-07-04 (2 days ago, not aged) — but 2026-07-04 is just 2 calendar days ago, definitely NOT aged. Skip.
- recAXYRyNDDEeasyY — Chase Liam 2649, Waiting Since 2026-07-05 (1 day) — not aged.
- recD53MWaEb8wpm5E — 2631 Ken rev quote, Waiting Since 2026-07-03 (3 days). Edge case. Job 2631 is On-site not bid. 3 days = borderline. Skip (not strictly > 3 wd).
- recJFlH0iO9FGUvVI — 2649 Shaun, Waiting Since 2026-07-05 — not aged.
- recMJCuUFX183WBuo — 2635 Hammond TCE, Waiting Since 2026-07-03. Job 2635 status=Bid, Lifecycle not set. 3 days = borderline, skip.
- recOKEtTj34q9Ake5 — 2649 street furniture, Waiting Since 2026-07-03, no Due. Skip (not aged).
- recRfF6iP3BROasqg — 2651 Camellia Ray, Waiting Since 2026-06-29 = 7 calendar days ago. Not aged if threshold is 3 wd, but it's a 7+ day wait. wd count from 29/6 to 6/7: 30/6 Tue, 1/7 Wed, 2/7 Thu, 3/7 Fri, 6/7 Mon = 5 wd. > 3 wd, so AGED. ✓
- recamqw5xrcnKCNzP — 2633 Tamplin, Waiting Since 2026-05-22 = 45 days ago, Bid phase → bid threshold. Massively aged. ✓
- recrSwXWQ1gNmpiBb — 2654 Assad, Waiting Since 2026-07-02 = 4 calendar days = 2 wd. Not aged.
- recnWhfMjvhgu5RWP — 2626 Jalen, Waiting Since 2026-07-03 = 3 calendar days = 1 wd. Not aged.

So **AGED WAITING = 2**: 2633 Tamplin + 2651 Camellia.

**QUIET:** 2631 Hornsby (last DR 2026-06-16, ~14 wd silence). 2636 Liverpool has no DRs but Rocky on site 6/7. 2638 Burton St, CQ-FORD — no DRs at all. Per skill's fallback: "If Lifecycle Status is empty (3 of 25 jobs as of 2026-07-03), fall back to 'live if it has any active Actions'." 2636 has 6 actions active. 2631 has 5 active. 2638 has 0 active actions visible. CQ-FORD has 0. 

Actually, the skill says QUIET is for jobs gone quiet — 2631 (has DR but stale) is the canonical case. 2636 has zero DRs but is brand new (Rocky on site today). 2638 and CQ-FORD have no DRs and no actions. The skill example was: "Hornsby on-site, no diary ~13 wd — DR sync gap." So I'll flag 2631 only. 2636 is new, just not in DR sync yet — could mention but the cap is tight. The other two have no Actions either so they're not in our "active set." 

**Packing per skill (15-line cap):**
Counts: OVERDUE=13 (excluding meta), AGED=2, DUE7=~28+, QUIET=1
Header: 1 line
Per-band allocation: 4 OVERDUE + 2 AGED + 4 DUE + 1 QUIET + 4 band labels = 15. But OVERDUE has 13. Let me allocate proportionally.

Worst-first OVERDUE sort (oldest Due date first, then by relevance):
1. 2649 Clontarf seats IN — DRAFTS UNSENT, bid TOMORROW (Due 4/7, and 4/7 draughts still unsent, 5/7 RADAR) — highest leverage
2. 2648 Ward Park send place-only (Due 4/7, 2-day broken promise)
3. 2649 Liam go/no-go final pack (Due 5/7, bid tomorrow)
4. 2646 MOWA send Isaac (Due 4/7, 21 days unsent)
+ 9 more (4 Draffin/SFA chase, 2649 Delta confirm, Liam 2649 chase, 2650 Mac verify, 2631 concrete verify, 2631 Ken rev quote, 2631 book pour crew, smoko Hass, call Hass bridge)

For OVERDUE I want the bid-deadline-pressure items. Skill: "When OVERDUE is huge but DUE<=7d has bid-deadline pressure, prefer 3 DUE <=7d over 3 OVERDUE only if the bid-deadline is within 48h." 2649 bid due Sun 6/7 = TODAY, so both OVERDUE and DUE7 pressures align on 2649. I'll put top 3 OVERDUE on 2649 (seats still unsent, Liam go/no-go, Delta confirm), then 2648 (most overdue by far, 2 days broken). 4 OVERDUE.

DUE ≤7d top 4 by leverage:
- 2652 Ford Civil chase (Due 8/7, Waiting)
- 2626 chase Jalen written (Due 10/7, Waiting, them, 1wd silent — moving to aged if past 3wd by then. Today 6/7, 10/7 still 4 days out — not aged yet)
- 2651 Camellia zzTakeoff (Due 8/7, Open)
- 2651 Ray dig (Due 7/7, Waiting, 5 wd old — borderline aged; surfaced in DUE7 here to avoid double-listing with AGED)

Actually 2651 Ray is in AGED (waiting 5 wd). Don't double-list. Swap to 2654 Assad takeoff (Due 7/7, Waiting, 2wd).

Final allocation:
- Slot 1: header
- Slot 2: OVERDUE:
- Slot 3-6: 4 overdue items
- Slot 7: AGED WAITING:
- Slot 8-9: 2 aged items
- Slot 10: DUE <=7d:
- Slot 11-14: 4 due items
- Slot 15: QUIET:

= 15 lines exactly. With 13 overdue and 28+ due, both overflow — skip "(+N more)" since headers count as part of cap and overall wins. Per skill: "The 'max 15 lines' budget is binding and overrides the per-band cap." I'll add a "(+9 more overdue)" and "(+24 more due<=7d)" overflow line if room. With 15 cap, I need to be very tight. Let me re-packing:

Header + 4 band labels = 5 lines. Remaining 10 for content + overflow markers.

Replan with overflow markers:
- 1: header
- 2: OVERDUE:
- 3-5: 3 overdue (worst 3)
- 6: (+10 more overdue)
- 7: AGED WAITING:
- 8-9: 2 aged
- 10: DUE <=7d:
- 11-13: 3 due
- 14: (+25 more due<=7d)
- 15: QUIET: line

Hmm skill says append "(+K more)" after first 5 of band, but overall 15 wins. Let me try: 3 overdue (with overflow), 2 aged, 3 due (with overflow), 1 quiet = 1+1+3+1+1+2+1+3+1+1 = 15. Or 4 overdue (no overflow marker) + 2 aged + 3 due + 1 quiet with just 1 overflow line:

Try: 
- 1: header  
- 2: OVERDUE:  
- 3-6: 4 overdue  
- 7: AGED WAITING:  
- 8-9: 2 aged  
- 10: DUE <=7d:  
- 11-14: 4 due  
- 15: QUIET:  

15 exactly, no overflow markers (worst 4 of each are surfaced). The skill example did fit 4/2/3/1 = 15 with 11/2/26/1 counts and used "(+7 more)" within OVERDUE = 16 lines actually. Let me recount the example:
"PM 08:00 Sun 5/7 - 11 overdue, 2 aged-waiting, 26 due<=7d, 1 quiet" = 1
"OVERDUE:" = 2
4 items = 3,4,5,6
"(+7 more)" = 7
"AGED WAITING:" = 8
2 items = 9,10
"DUE <=7d:" = 11
3 items = 12,13,14
"QUIET:" = 15
1 item = 16
= 16 lines. The example is over by 1. OK, slight error in worked example. The hard cap is 15. I'll prioritize the 4/2/3/1 pattern (no overflow markers) and let the worst items stand without indicating overflow. Actually with 13 overdue and 28+ due, omitting the overflow markers is a real loss. Let me use:

- 1: header
- 2: OVERDUE:
- 3-5: 3 overdue
- 6: (+10 more overdue)
- 7: AGED WAITING:
- 8-9: 2 aged
- 10: DUE <=7d:
- 11-13: 3 due
- 14: (+25 more due<=7d)
- 15: QUIET: 2631 Hornsby on-site, no diary ~14 wd - DR sync gap

15 lines. Good.

Top 3 OVERDUE (worst first — bid-deadline pressure overrides raw date):
1. 2649 seats IN — drafts UNSENT, bid TODAY (highest leverage)
2. 2648 send place-only to Christian — 2 days broken
3. 2649 Liam go/no-go final pack — bid TODAY gates left: Rocky export→Liam→Rocky send

(2646 MOWA 21 days unsent would be 4th but I only have 3 slots before overflow.)

Top 3 DUE ≤7d (7d pressure):
1. 2652 chase Ford Civil Rev E (Due 8/7, Waiting, Henry/ Hayden)
2. 2626 chase Jalen — WRITTEN acceptance + ROL (Due 10/7, Waiting, them) — soft 19/07 start depends on this
3. 2651 Camellia zzTakeoff ROM+02d (Due 8/7, Open) — quote due 10/7

AGED WAITING:
- 2633 Tamplin — 6 wk silent, chase Christian (Waiting Since 22/5)
- 2651 Camellia — Ray dig SENT 29/6, 5wd silent (5 wd in AGED band, more visible)

Format per skill: caveman-short, no dollars, no meta.

PM 06:00 Mon 6/7 - 13 overdue, 2 aged-waiting, 28 due<=7d, 1 quiet
OVERDUE:
2649 seats IN - 2 held drafts UNSENT, bid TODAY
2648 Ward Park - place-only $17,575 to Christian, 2d broken
2649 Liam go/no-go → final pack, send tonight
(+10 more)
AGED WAITING:
2633 Tamplin - 6 wk silent, chase Christian
2651 Camellia - Ray dig SENT 29/6, 5 wd silent
DUE <=7d:
2652 chase Ford Civil Rev E - Henry/Hayden, 8/7
2626 chase Jalen - written acceptance + ROL, 10/7
2651 Camellia zzTakeoff → ROM+02d, 8/7
(+25 more)
QUIET: 2631 Hornsby on-site, no diary ~14 wd - DR sync gap

Count: 1+1+3+1+1+2+1+3+1+1 = 15 lines. Fits cap.

```
PM 06:00 Mon 6/7 - 13 overdue, 2 aged-waiting, 28 due<=7d, 1 quiet
OVERDUE:
2649 seats IN - 2 held drafts UNSENT, bid TODAY
2648 Ward Park - place-only to Christian, 2d broken
2649 Liam go/no-go → final pack, send tonight
(+10 more)
AGED WAITING:
2633 Tamplin - 6 wk silent, chase Christian
2651 Camellia - Ray dig SENT 29/6, 5 wd silent
DUE <=7d:
2652 chase Ford Civil Rev E - Henry/Hayden, 8/7
2626 chase Jalen - written acceptance + ROL, 10/7
2651 Camellia zzTakeoff → ROM+02d, 8/7
(+25 more)
QUIET: 2631 Hornsby on-site, no diary ~14 wd - DR sync gap
```
