prospects\2026-08-04.md — mark SENT in the log after
2
📌 GBP appeal pending (submitted 2026-08-02)
standing reminder — check it off in chief-of-staff-agent.md when done
3
📌 Gemini API key rotation
standing reminder — check it off in chief-of-staff-agent.md when done
Bottom line
$5,940
potential pipeline — 12 active prospects × $495 if each closes as a Quick Win (drafted 10 · sent 2 · follow-up 0)
2Sent, awaiting reply
2Posts produced
0Opt-outs
The team — 8 agents, draft-first, $0/mo
EmailON DUTY2h · 8–6
ContentFRESH7:01a
ProspectsFRESHwkdy 7:33a
HealthON DUTY6:37a
ChiefFRESHMon 8:37a
MarketFRESHWed 7:07a
NewsFRESHThu 8:19a
ManagerON DUTY7:01p
Manager proposals — approve via directives.md
**Monitor the inbound lead paths, not just the pages.** `site-check.js` proves 13 pages return 200 and that Cal.com/Formspree/Base44 are *reachable*, but nothing verifies a lead actually arrives: the site publishes `info@` and `support@tech-d-enterprises.com` while both mailboxes live on the **singular** domain behind Cloudflare Email Routing, and no check sends a probe through that route or through the Formspree form. Benefit: today a silent routing failure would delete every inbound web lead and the dashboard would stay green — this is the largest unmonitored single point of failure on the web side. (Takes the slot of the Google-review responder proposal, **parked** 2026-08-04 — not retired, and the reason has been corrected: I first wrote that the GBP appeal "was denied", which came from the content agent's phrasing "*looks* unavailable". I then searched all three mailboxes over 14 days and found **no decision email at all**, so the appeal's status is genuinely unknown and only Steve can settle it. Parked because it is blocked either way; if the profile turns out to be live, it comes straight back.)
Invoice-chaser agent wired to the paypal-invoicer app — needs a design chat with Steve first. Benefit: unpaid invoices never slip.
Add `reply` + `ring` columns to contacted-log.csv and score sourcing channels by reply rate instead of rubric points. Benefit: the prospect agent is at 94% on its own rubric and has zero outcome data — it is currently optimizing against its own judgment, not against what earns replies.
1. §1 still describes the old hardcoded 5–6 page list; `site-check.js` now
2. §3 still describes a two-outcome deploy audit. There are three —
3. §5 says "if Gmail is available, draft the alert." The Gmail tool is
4. The JD does not mention the peer-liveness duty (no deploy entry *and* no
1. ~~**Add a YouTube option** to the question.~~ **DONE 2026-08-03** — Steve
2. ~~**Name one owner** for a shared attribution ledger.~~ **DONE 2026-08-03**
Recent manager changes
2026-08-03 (late) — **GUARDRAIL: LINK RULE now enforced at the connector** (by Claude, at Steve's direction; follow-on to the CAN-SPAM bypass entry above). This closes the second defect found in the two emails sent 2026-08-03 23:11 UTC: both linked `https://www.tech-d-enterprises.com/appointments/` — plural domain, with `www.` — while being sent from the singular `@tech-d-enterprise.com`. A near-miss domain mismatch is the most reliable phishing tell a careful recipient has, and the reputation it costs belongs to the domain Steve's client mail runs on. The rule was already written in `prospect-agent.md` LINK RULE and a LINK CHECK step was added to the brain after the fact — but an instruction violated in all three drafts of one batch needs an enforcement point, not another paragraph. New hard stop `assertOutreachLinkRule()` blocks two things on `role: outreach` only: (1) any occurrence of the plural domain, with or without `www.`; (2) a query string on a singular-domain link, because the forwarding rule preserves the path but silently drops everything after `?`, so a UTM is lost and the recipient can land somewhere unintended. Runs on the FINAL body, after the signature is appended, so a regression in `signature.json` is caught rather than trusted. Scoped to outreach: client-service replies, the newsletter and the website all use the plural domain correctly and are untouched. Verified five ways — the exact plural link that shipped this morning blocks; a `?utm_source=` link blocks; a clean singular link passes; a plural link on a client-service account passes; and the live `coldEmail` block in `signature.json` passes its own gate. Gate order in both `cmdCompose` and `cmdDraft` is now: hand-written-signature (raw body) → signature append → placeholder (final body) → link rule (final body), all before any IMAP connection, so every rejection has zero side effects. `prospect-agent.md` LINK CHECK updated from advice to enforced, naming the error string, while still asking the agent to self-check — the gate fires at compose time, which is much later than catching it while writing, and a blocked compose still costs the run. Regression: `node --check` clean, both accounts still connect, clean-body compose still falls through to the placeholder gate as expected.
2026-08-03 (late) — **GUARDRAIL: closed a CAN-SPAM bypass in `email-connector.js`** (by Claude, at Steve's direction). Found by reading the Sent folder, not by reasoning about the code. Two cold emails sent 2026-08-03 23:11 UTC (Lotus Psychotherapy, Rhode River Marina) shipped with **no CAN-SPAM block at all**, while a compose attempted hours later was correctly blocked for containing `PO BOX PLACEHOLDER`. That asymmetry was the bug. Mechanism: the agent hand-wrote its own footer → `bodyIsAlreadySigned()` matched → `withSignature()` appended nothing → `assertNoPlaceholder()` then scanned a body that had never received the real footer, found no placeholder, and passed. **The guard protected exactly the drafts that did not need protecting and waved through the ones that did.** What actually shipped was "TechD Enterprises · Edgewater, MD 21037" — no street, no box number, which `signature.json`'s own TODO states does not satisfy CAN-SPAM. The opt-out line was present and functional, so the exposure is a defective address, not a missing opt-out. Fix, three parts: (1) new hard stop `assertNoHandWrittenSignature()` runs on the RAW body before any signature is appended and before any network call — on `role: outreach` only, so client-service replies may still sign however they like; (2) `withSignature()` now ALWAYS appends on outreach, since hand-signed outreach bodies no longer reach it; (3) both `cmdCompose` and `cmdDraft` wired to call it. Rejects rather than auto-strips: silently rewriting the body of an email a human is about to send under their own name is worse than a refusal, and "end at your last sentence" was already the documented rule. Verified with three cases — the exact hand-signed body that shipped this morning now blocks; a clean body passes the new gate and correctly falls through to the placeholder gate (which proves the coldEmail block is genuinely being appended again); the same hand-signed body on a client-service account is allowed through. `prospect-agent.md` DRAFT RULES updated from advice to enforced, naming the error string. **Note the second, separate defect in those two sent emails, NOT fixed here because it cannot be fixed retroactively:** both link `https://www.tech-d-enterprises.com/appointments/` — plural domain with `www.` — while sent from the singular domain, the exact near-miss the LINK RULE exists to prevent. The LINK CHECK was added to the brain after these were drafted. The connector does not yet enforce it; that gate is proposed but unbuilt, and is the obvious next guardrail.
2026-08-03 (late) — **PROSPECT CAP RESOLVED: 25–60 RESEARCHED/WEEK, 15/day max** (by Claude, at Steve's direction). Supersedes the 30/day cap Steve set earlier the same day (change above), which was itself a raise from 8/day. The conflict was surfaced by a JD cross-reference: `ROLE-sales-development-rep.md` targets 25–60 researched **per week** while the brain capped 30 **per day** — 150/week, a 3× disagreement between two documents describing one role. Steve ruled the weekly figure correct. Why it matters beyond tidiness: Ring 1 holds an estimated 1,200–1,800 qualified businesses, so 150/week consumes the entire home territory in a few months rather than the ~year the TARGET AREA depletion maths assumes, and Ring 1 is where the "I'm a few minutes up the road" hook — Steve's single best differentiator — is true. Updated in four places, all of which asserted the number independently: (1) `prospect-agent.md` HARD LIMITS — week is now the governing unit, 60 is a ceiling that redirects Thu/Fri to the sequence and call list once hit, 25 is a floor whose breach is reported as a *sourcing* failure by channel name and never as a reason to lower the gates; (2) `prospect-agent-reviewer.md` — its standing rule to "restore" an overruled cap would have reverted this on the next tuning round, exactly as it once tried to restore 8; it now names all three historical values so no future round re-litigates a settled number; (3) `agent-manager.md` COMPLIANCE SWEEP — now checks the week-to-date total, since a run that looks compliant daily can still blow the week; (4) `agent-manager.md` safety invariants. Not touched: this log and `reviews\FLEET-REVIEW-LOG.md` record the earlier rulings as history and are append-only — the entries above stating "30 researched/day" were true when written and stay. Sends unchanged at 5–10/day by Steve's hand; this remains a research cap, not a send cap.
2026-08-03 (late) — HEARTBEAT COMPLETED (follow-on to change 124, by Claude with Steve). The manager's evening tweak added the heartbeat write but left it half-wired; three gaps closed: (a) site-health-agent.md's closing rule still said "never edit files," contradicting the new instruction to write the heartbeat and the DEPLOY AUDIT instruction to set `Status:` — rewritten as a narrow, explicit two-file allowance (heartbeat line, DEPLOYS.md status line), append-only, everything else still forbidden; (b) added the SKIPPED convention so an unperformable check is never silently counted as passed; (c) chief-of-staff-agent.md gained gather step 5b — it now reads `health\` for the last 7 days, treats a MISSING DAY as "the monitor did not run" (never as "site was fine"), quotes FAILED/SKIPPED lines verbatim, and escalates an empty window into TOP 3. Without 5b the heartbeat was being written and never read, which is the whole reason it exists. Guardrails strengthened, none weakened.
rebuild: node build-dashboard.js · task the team: directives.md · retrain an agent: edit its brain .md