diff --git a/.okf/log.md b/.okf/log.md index 3aaef307b..ab8e87dee 100644 --- a/.okf/log.md +++ b/.okf/log.md @@ -927,3 +927,50 @@ HTML on five posts, three of them already live (kamal-2-multi-server, ai-code-ownership-accountability, claude-code-xp-team-workflow). It is internal review metadata from the writer brief. Removed sitewide; writers should report cadence in the handback, never in the file. + +## 2026-08-08 — Passive keyword monitor purged from the sourcing machinery + +**Decision (Paul)**: remove F5Bot outright — "it's not working as you wanted." +The tool was already marked retired on 2026-08-08, but the retirement was +half-done: its doc survived as a "kept for the keyword derivation" stub, and two +separate boards still carried *"paste the v2 keywords into F5Bot"* as a +load-bearing 2-minute ask on Paul's desk (`operation-runbook.md` Sprint-3 header +and `20.09` §P0). A dead blocker parked on the CEO's desk is worse than no +blocker: it reads as the cheapest available unblock, so it displaces the real +one. + +**Durable rule — two structural tests any sourcing tool must pass.** Neither is +fixable by better keywords, and both killed this one: + +1. **Active, not passive.** A monitor only knows what arrived after it was + switched on, so it can never backfill a window. Card #29 needs rows verified + inside ≤30 days *on demand*; a passive feed cannot satisfy that by + construction. +2. **Ranked retrieval, not literal substring matching.** Founders don't type our + phrasing. The v1 composed phrases (`vibe coded broke`) matched **0 of the 25 + posts we had already found by hand**. + +Do not re-propose the class. Judge paid alternatives (RedReach, Buska, Syften, +CommunityTracker) against those two tests *before* spending. + +**Keyword derivation preserved and re-verified**, moved into +`prospects/p7-search-sweep.md` §3 with counts re-run across +`voice-of-customer.md` + `cold-prospect-list.md`: `non-technical` 20×, +`replit` 16×, `lovable` 8×, `cursor` 5×, `vibe coded` 2× (vs the gerund +`vibe coding` 10×, rejected — it floods with commentary, not distress). + +**Finding surfaced by the move**: `dev shop` has **zero** corpus occurrences +(`dev shop`/`devshop` 0, `agency` 1). It carries the Trigger-3 +ownership/hostage lane, and its only prior coverage argument *was* passive +monitoring. So our second-strongest trigger now rides an unevidenced query term +in a lane grooming already proved unfindable through open search. A zero return +on it is a **lane gap to escalate**, not a quiet zero. `bolt.new`/`base44` are +likewise unevidenced tool-name guesses — drop after two empty sweeps. + +**Correction to the board while here**: `#29` was described as agent-runnable. +It is not — the replacement sweep ran on 2026-08-08 and returned zero rows +because every thread-open hit `EGRESS_BLOCKED` and Reddit rejected the tool's +user agent. Qualification requires a timestamp read from the *opened* thread, so +**no sourcing method can produce a lead until thread-open access is restored** +(`chrome-devtools` + egress to indiehackers.com / reddit.com). That is now the +real P0 in both boards, in place of the keyword ask. diff --git a/.okf/workflows/outbound-sprint.md b/.okf/workflows/outbound-sprint.md index d11263067..c13a6ef1e 100644 --- a/.okf/workflows/outbound-sprint.md +++ b/.okf/workflows/outbound-sprint.md @@ -6,6 +6,7 @@ tags: [outbound, sales, browser-agent, kanban, sourcing] generated: by: process:okf-migrate at: 2026-07-26T00:00:00Z +updated: 2026-08-08T00:00:00Z resource: docs/projects/2607-vibe-code-rescue/ sources: - resource: "/workflows/review-swarm.md" @@ -21,8 +22,8 @@ sources: for Paul's per-message approval, then send, then log. Nothing sends on silence. 2. **Monitor** - each morning `rescue-sprint/reply-monitor-prompt.md` - sweeps IH notifications, LinkedIn, Reddit, and Gmail (`neetocal`, - `from:f5bot.com`), classifies replies, drafts responses from the + sweeps IH notifications, LinkedIn, Reddit (once batch 2 is live), and + Gmail (`neetocal`), classifies replies, drafts responses from the objection bank (marked DRAFT - Paul sends), and updates the ledger. 3. **Measure** - `rescue-sprint/pipeline.md` is the single ledger (one row per touch + Friday tally). The A0 kill-criteria (~20 touches / ~10 @@ -85,10 +86,16 @@ sources: # Gotchas -- **F5Bot sends nothing until the account email is verified** - the verify - email hid for 3 days (2026-07-21 to 07-24) because... -- ...mail to `pftg.sof@gmail.com` is auto-labeled + archived in that +- **Passive keyword monitors do not work for this sprint** (retired + 2026-08-08 after a 2-week trial). Two structural flaws, neither tunable: + they match literal substrings, so composed founder phrasing never fires + (0 hits against 25 posts we found by hand), and they are passive, so they + can never backfill the ≤30-day lead window on demand. Sourcing uses + date-filtered active search instead + (`rescue-sprint/prospects/p7-search-sweep.md`). Do not re-propose the + class - judge any paid alternative against those two tests first. +- **Mail to `pftg.sof@gmail.com`** is auto-labeled + archived in that mailbox and auto-forwarded to Paul's main inbox. Monitor by search query - (`from:f5bot.com`, `neetocal`), never by scanning that inbox. + (`neetocal`), never by scanning that inbox. - Statusline/parallel sessions contend on `.git/index.lock` - transient; re-check before force-removing. diff --git a/docs/business/operating-system.md b/docs/business/operating-system.md index 7d1664d91..76b1d5787 100644 --- a/docs/business/operating-system.md +++ b/docs/business/operating-system.md @@ -1,110 +1,85 @@ # JetThoughts Operating System (lean) -**Scope**: this is the **company** operating system - how JetThoughts runs across every opportunity, not just the current one. It is the durable cadence (accountability chart, quarterly OKR, rocks, weekly scorecard, issues, pipeline). The **active bet it currently drives** is the [Vibe Code Rescue validation project](../projects/2607-vibe-code-rescue/) (portfolio bet #1); when the next opportunity becomes active, the same OS runs it with a new OKR/rocks. -**Company layer**: [`index.md`](index.md) (front door) · [`vision-mission.md`](vision-mission.md) (who we are) · [`opportunity-portfolio.md`](opportunity-portfolio.md) (the bets, and how we validate/kill/scale them). -**Purpose**: the smallest cadence that reliably ships the current company objective - right now, **1 Vibe Code Rescue client by Nov 30, 2026** (the active portfolio bet). -**Owner**: Paul Keen | **Created**: 2026-07-21 | **Review**: weekly -**Model**: EOS-lite (accountability chart + quarterly OKR + weekly scorecard + rocks + issues), sized for a founder + white-label delivery + AI execution. +**Scope**: the **company** operating system - how JetThoughts runs across every opportunity, not just the current one. **Company layer**: [`index.md`](index.md) (front door) · [`vision-mission.md`](vision-mission.md) (who we are, still DRAFT) · [`opportunity-portfolio.md`](opportunity-portfolio.md) (the bets). +**Purpose**: the smallest cadence that reliably ships the current objective - **1 Vibe Code Rescue client by Nov 30, 2026**. +**Owner**: Paul Keen | **Created**: 2026-07-21 | **Review**: weekly, in §1 below - no separate ritual +**State**: this file does NOT duplicate the runbook's fresh-session state. For "what do I do right now," open [`operation-runbook.md`](../projects/2607-vibe-code-rescue/operation-runbook.md) → START HERE. This file is the numbers layer over it. --- -## 0. Current state & where to start (fresh session) +## 1. This week -**As of 2026-07-21**: foundation is set. A0 assumptions register ✓, G0 white-label partner ✓ (locked per CEO), offer/kit/booking drafts ✓, T1 trigger taxonomy ✓, T2 sourcing pipeline ✓. -**Active sprint**: Rescue Demand Sprint — populate the prospect list (agent) so Paul can send + book calls. -**Next agent work**: `T4/T5` (build the list) → `T6` dedupe → `T7` openers; `T8` discovery kit in parallel. -**To execute**: open [`operation-runbook.md`](../projects/2607-vibe-code-rescue/operation-runbook.md) → **▶ START HERE** block → take the next Ready task. That runbook is the shared state across sessions; this file is the weekly cadence over it. -**Paul's desk (human-only)**: booking page (~5 min), confirm price band (✅ done: $2,500 triage / $7,500 rescue / $10,000 foundation reset), review + send the outreach, take the calls, close. Optional: Gmail consent (warm lane), Apollo $79/mo + Hunter key (paid cold funnel). +Source of truth: [`rescue-sprint/pipeline.md`](../projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md) §Weekly tally. This table is that tally's numbers, not a second set - update the sheet first, this row second, same sitting. + +| week of | touches sent | replies | calls booked | audits sold | rescues signed | posts shipped | +|---|---|---|---|---|---|---| +| 2026-08-08 | 0 | 0 | 0 (target 8-12 by Nov 30) | 0 (target 3-5) | 0 (target 1) | 2 (Aug, target ~6/mo) | + +**Verdict: 🔴 red.** Not "zero calls" - **zero touches have ever been sent.** Batch-1 has been HOLD since 2026-07-26 (stale rows); the Sprint-3 re-source ran 2026-08-08 and is now BLOCKED-ON-TOOLING (`operation-runbook.md` §Card #29). 18 days since Sprint 3 kicked off (2026-07-26), the bottleneck hasn't moved past sourcing. +**Kill-check**: the C1 kill-criteria ("2 weeks of warm outreach yields 0 booked calls → pause, re-open A+C") has **not fired** - its precondition is 2 weeks of *actual* outreach, and none has gone out yet. Don't read that as safe: it means we don't even have the data the criteria needs. See Issue 2. +**Where sessions went this week**: mostly 2605 (course wave completion, W1-W5) and 2510 (content re-plan), plus this session's 2607 sourcing-tool diagnosis. That allocation is why a distribution failure sat unflagged for 18 days - nobody was in the pipeline sheet. --- -## 1. Accountability chart (who owns what) +## 2. Accountability chart | Seat | Owner | Owns | |---|---|---| -| **CEO / Sales / Trust layer** | Paul | Discovery calls, offer, pricing, the founder relationship, fractional-CTO oversight | -| **Delivery** | White-label partner | The rescue build (Rails), under JT brand, to JT quality bar | -| **Marketing / Content / Ops engine** | Claude Code (+ Paul review) | Content, SEO, landing, lead magnets, LinkedIn drafts, pipeline tracking, this OS | - -One person can hold several seats - but every seat has exactly one accountable owner. +| **CEO / Sales / Trust layer** | Paul | Discovery calls, offer, pricing, founder relationship | +| **Delivery** | White-label partner | The rescue build (Rails), under JT brand | +| **Marketing / Content / Ops** | Claude Code (+ Paul review) | Content, SEO, landing, pipeline tracking, this OS | -## 2. Quarterly OKR (Q3->Q4 2026) +## 3. OKR (Q3→Q4 2026) + kill-check **Objective**: Land the first Vibe Code Rescue client and prove the machine. -| Key Result | Target | Status | +| KR | Target | Status | |---|---|---| -| KR1 - Offer + white-label partner live | Rescue Audit priced, partner signed, landing CTA live | 🟢 partner signed ✓; offer priced ✓ ($2,500 / $7,500 / $10,000); landing deferred | -| KR2 - Discovery calls booked | 8-12 by Nov 15 | 🔲 | -| KR3 - Audits delivered | 3-5 free Rescue Audits (45-min call + 48h scorecard — the funnel entry; paid tiers follow) | 🔲 | -| KR4 - Rescue signed | **1 engagement by Nov 30** | 🔲 | +| KR1 - Offer + partner live | Priced, partner signed, landing CTA live | 🟢 partner ✓, priced ✓ ($2,500/$7,500/$10,000), booking link live ✓; full landing page still Blocked (card B1) | +| KR2 - Discovery calls booked | 8-12 by Nov 30 | 🔴 0. (Mid-Nov is an internal trend checkpoint, not a separate deadline - both KRs share one date now.) | +| KR3 - Audits delivered | 3-5 free Rescue Audits | 🔴 0 - blocked behind KR2 | +| KR4 - Rescue signed | 1 by Nov 30 | 🔴 0 - blocked behind KR3 | -## 3. Rocks (90-day priorities = roadmap milestones) +**Kill-criteria (from the assumptions register, evaluated here weekly - this is the "runs automatically via OS-WEEKLY" promise, made real):** C1 warm-channel test - 0 calls after 2 weeks of *actual sent* outreach → pause, re-open ICP/channel. Currently **untestable**, see §1. A0 ICP test - if ≥half of early interest is technical or pre-launch founders, re-open the ICP vote. Not yet evaluable - zero interest of any kind so far. -1. **Offer + partner locked** (Aug) - the machine can't sell without these. -2. **Landing = booking machine** (Aug) - offer, proof, one CTA. -3. **Demand-gen live on all channels** (Aug->Sep) - LinkedIn 3-4/wk, rescue SEO cluster, paid pilot. -4. **First audit -> first signing** (Oct). - -## 4. Weekly scorecard (leading metrics, review every week) - -| Metric | Owner | Target/wk | -|---|---|---| -| LinkedIn posts published | Paul/Claude | 3-4 | -| LinkedIn qualified replies/DMs | Paul | >=3 | -| New email subs from magnets | Claude | trend up | -| Blog posts shipped (rescue/ICP-E) | Claude | 2-3 | -| **Discovery calls booked** | Paul | trend to 8-12 by mid-Nov | -| Rescue Audits sold | Paul | cumulative -> 3-5 | -| Rescues signed | Paul | -> 1 | +## 4. Rocks (open only) -Green = hit target, Red = missed. Any red 2 weeks running becomes an Issue (section 6). +1. **Unblock sourcing** (now) - card #29 needs `chrome-devtools` + egress to at least one of indiehackers.com / reddit.com. Nothing else on the board matters until this moves. +2. **Landing page** (Aug) - card B1, Blocked on nothing but capacity; booking link already live standalone. +3. **First send → first call** (Aug-Sep) - batch-1/2/3, gated entirely on Rock 1. +4. **First audit → first signing** (Oct) - not started, gated on Rock 3. -## 5. Meeting cadence +*Closed*: offer + partner locked (Jul 21). *Cut* (20.09, 2026-08-07): the paid-pilot rock - budget only matters once organic proves a reply signal, and the bet currently forbids a content sprint. -> **Async-first rule**: meetings below are the exception, not the medium. All knowledge transfer defaults to written artifacts per `.agents/skills/async-first-communication/SKILL.md`; every meeting's outcome is written back into this file (scorecard/OKR/issues) same-day. - -- **Weekly ops review (~30 min)**: scorecard (5 min) -> rock progress (5 min) -> pipeline - walk (10 min) -> IDS the top issues (10 min). Update the scorecard + OKR statuses in this file. -- **Monthly strategy check (~45 min)**: is the wedge still right? adjust roadmap; refresh - market scan if signals shift. -- **Per-deal**: discovery call -> audit -> proposal, tracked in the pipeline (section 7). - -## 6. Issues list (IDS: Identify, Discuss, Solve) - -Rolling list of the top blockers. Solve the highest-leverage one each week; don't let it grow. +## 5. Issues (IDS - top 5, solve the highest-leverage one each week) | # | Issue | Owner | Status | |---|---|---|---| -| 1 | White-label delivery partner (runbook G0) | Paul | ✅ Resolved 2026-07-21 (locked per CEO). Standing validation: confirm a paid trial rescue hits the quality bar + a fallback partner is named before the first real signing. | -| 2 | Prospect list populated — 25 deduped rows merged in P8 | Claude | ✅ Resolved 2026-07-22 (P8 complete) | -| 3 | Price band confirmed — A2 set at $2,500 triage / $7,500 rescue / $10,000 foundation reset | Paul | ✅ Resolved 2026-07-22 (A2 confirmed) | +| 1 | Sourcing BLOCKED-ON-TOOLING - #29's sweep can't open any thread to verify a timestamp | Infra/Paul | 🔴 Open since 2026-08-08 - see runbook §Card #29 | +| 2 | Kill-criteria untestable, not "not fired" - 18 days, zero touches sent, so the C1 test has never actually run | Claude/Paul | 🔴 Open - ratify: is this a distribution defect (re-run once unblocked) or does it call the bet itself into question? | +| 3 | Joy Adamson override - only survivor of batch-1, 5mo old, still publicly unanswered | Paul | 🟡 Open - 1-min decision, unresolved since ~2026-07-26 | +| 4 | Pricing vs. thesis tension - JT undercuts at $7,500 against $25-55K competitors one week after publishing "cheap developers are expensive," which argues against its own thesis to a twice-shy founder | Paul | 🟡 Open - content flagged it (20.09 §10), not a content fix | +| 5 | vision-mission.md still stamped DRAFT, 18 days on, while other docs cite it as settled | Paul | 🟡 Open - 1-line decision: ship it or say what's wrong | -## 7. Pipeline (simple funnel, no CRM needed yet) +*Resolved, moved to changelog*: white-label partner (Jul 21) · prospect list populated, P8 (Jul 22) · price band (Jul 22). -Track each lead as a row: **Source -> Discovery call -> Audit sold -> Proposal -> Signed**. -Stages: `Lead` -> `Call booked` -> `Audit sold` -> `Proposal out` -> `Won` / `Lost (reason)`. -Keep it in a single sheet (or a section here) until volume justifies a real CRM. -**Leads originate from** the populated target list in [`rescue-sprint/warm-intro-referral-kit.md`](../projects/2607-vibe-code-rescue/rescue-sprint/warm-intro-referral-kit.md) (agent-built via runbook T4-T7); once Paul sends, each contacted row becomes a pipeline `Lead`. - -## 8. Tooling map +## 6. Tooling map | Function | Tool | |---|---| -| Site / blog | Hugo (`bin/hugo-build`), content in `content/blog/` | -| Content ops | Blog pipeline (`docs/workflows/blog-pipeline.md`), voice guide 90.11 | -| LinkedIn | LinkedIn pipeline (`docs/workflows/linkedin-post-pipeline.md`) + ICP validation plan | -| Discovery scheduling | NeetoCal (per outreach template) | -| Pipeline tracking | Sheet / this doc section 7 until CRM is justified | -| OKR spine | `lark-okr` skill for structuring quarterly OKRs | -| Weekly OS loop | `eos-lite` skill (`Skill(eos-lite) weekly`) — runs scorecard/OKR/rocks/issues/pipeline over this doc | -| Step-by-step execution | [`operation-runbook.md`](../projects/2607-vibe-code-rescue/operation-runbook.md) — ordered task cards + Incremental agent backlog; **▶ START HERE** for any fresh session | -| Foundational premises | [`rescue-sprint/assumptions-register.md`](../projects/2607-vibe-code-rescue/rescue-sprint/assumptions-register.md) — ICP/trigger/channel/pre-validation, voted, with kill-criteria (runbook rule 7) | -| Sprint artifacts | `rescue-sprint/` — offer, warm-intro kit, booking spec, trigger taxonomy, sourcing pipeline (see runbook START HERE artifact index) | - -## 9. Definition of "operating" (are we actually running the system?) - -- Scorecard updated weekly, with real numbers. -- Every rock has a next action and an owner. -- The Issues list is short because we solve the top one each week. -- Discovery-calls-booked moves up week over week from Sept. +| Site / blog | Hugo (`bin/hugo-build`), `content/blog/` | +| Content ops | `docs/workflows/blog-pipeline.md`, voice guide 90.11 | +| LinkedIn | `docs/workflows/linkedin-post-pipeline.md` + ICP validation plan | +| Discovery scheduling | NeetoCal | +| Pipeline tracking | [`rescue-sprint/pipeline.md`](../projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md) - the only copy of these numbers | +| OKR/weekly-loop skills | `lark-okr`, `eos-lite` (`Skill(eos-lite) weekly`) | +| Step-by-step execution | [`operation-runbook.md`](../projects/2607-vibe-code-rescue/operation-runbook.md) - START HERE for any fresh session | +| Foundational premises | [`rescue-sprint/assumptions-register.md`](../projects/2607-vibe-code-rescue/rescue-sprint/assumptions-register.md) - kill-criteria live here | + +## Changelog (resolved issues + closed rocks move here, newest first) + +| Date | Change | +|---|---| +| 2026-08-08 | Rewrote this file: 110→~90 lines, bound §1 to `pipeline.md` instead of duplicating a second scorecard, fixed the KR2 Nov-15/Nov-30 date conflict, replaced the 3 stale "all-resolved" Issues with the real ones, cut the paid-pilot rock (superseded by 20.09), deleted the stale §0 snapshot in favor of linking the runbook. | +| 2026-07-22 | Prospect list populated (P8, 25 rows) · price band confirmed ($2,500/$7,500/$10,000) | +| 2026-07-21 | White-label partner locked · offer/kit/booking drafts done | diff --git a/docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md b/docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md index 961ce1bbf..c592b0e1f 100644 --- a/docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md +++ b/docs/projects/2510-seo-content-strategy/20-29-strategy/20.09-content-plan-revision-aug-2026.md @@ -49,8 +49,8 @@ configuration the bet prohibits. | Action | Owner | Cost | Why it is P0 | |---|---|---|---| -| Paste the **v2 F5Bot keyword set** from `rescue-sprint/prospects/p7-f5bot.md` into F5Bot | Paul | ~2 min | v1 keywords were composed phrases nobody types; zero mentions returned. Cheapest lead-flow fix on the board. | -| Run card **#29** - re-source prospects against the fixed v2 rubric | Agent | 1 session | Unblocks #12 and every send after it | +| Restore **thread-open access** for sourcing (`chrome-devtools` + egress to **at least one** of indiehackers.com / reddit.com) | Paul / infra | - | Card #29's sweep ran 2026-08-08 and returned zero rows purely on tooling: every thread-open hit `EGRESS_BLOCKED`. Qualification needs a timestamp read from the opened thread, so **no sourcing method can produce a lead until this lands.** | +| Run card **#29** - re-source prospects against the fixed v2 rubric | Agent | 1 session | Unblocks #12 and every send after it. **Gated on the row above.** | | Decide the **Joy Adamson override** (5mo old, still publicly unanswered) | Paul | 1 min | Only survivor of batch 1 | If a session has capacity for exactly one thing this week, it is #29 - not a post. diff --git a/docs/projects/2607-vibe-code-rescue/backlog.md b/docs/projects/2607-vibe-code-rescue/backlog.md index b684e4a6b..440f99582 100644 --- a/docs/projects/2607-vibe-code-rescue/backlog.md +++ b/docs/projects/2607-vibe-code-rescue/backlog.md @@ -40,7 +40,7 @@ Strategy/gates/Paul's desk live in [`operation-runbook.md`](operation-runbook.md - **done**: ≥3 commenter rows + VoC; NO competitor/author logged. ### P7 · Date-filtered search sweep → `prospects/p7-search-sweep.md` -- **supersedes** the F5Bot card (RETIRED 2026-08-08 — literal-substring matching, and passive-only so it can never backfill the ≤30-day window). `prospects/p7-f5bot.md` is kept banner-marked for its keyword derivation only; do not run it. +- **supersedes** the retired passive keyword monitor (see §Card #29 status for why it was structurally unfixable). Its doc is deleted; the keyword derivation it carried now lives in `prospects/p7-search-sweep.md` §3. - **do**: run the query bank in `prospects/p7-search-sweep.md` §3 — `site:` operators across reddit/IH/HN/x/lobste.rs crossed with the corpus-derived v2 keywords and `after:{TODAY-30}` (compute the date per §2, never eyeball). Open each non-Reddit candidate ONCE, read the real timestamp + all replies, fill `verified date` + `thread health`. **Reddit is excerpt-only (wrapper rule) and P7 lead rows require an opened-thread timestamp, so Reddit hits feed the excerpt queue + VoC only - never P7 lead rows (sweep doc §3.1).** Normalize URLs, then dedupe against `cold-prospect-list.md` by normalized thread URL (§5). - **needs**: a thread-opening tool (`chrome-devtools`) + a search surface that honours `site:`/`after:` — sanity-check per §4 before trusting a sweep. - **done**: rows all carrying `verified date` ≤30 days + `thread health`; stale/saturated threads harvested for VoC before closing. Quality over quota — log what defensibly qualifies, pad nothing. @@ -96,7 +96,7 @@ Batch-1 Phase-1 pre-research (send-runner-prompt.md, run against card #12's 5 op ### Card #29 status — **BLOCKED-ON-TOOLING (2026-08-08). Method delivered, zero rows.** -- **F5Bot RETIRED 2026-08-08** (Paul called it dead). Two structural flaws, not keyword tuning: it matches **literal substrings** (v1 matched 0 of our 25 hand-found posts), and it is **passive** — it only catches mentions from setup-time forward, so it can never backfill the ≤30-day window on demand. The keyword swap is no longer a Paul unblock; drop it from Sprint 3. `prospects/p7-f5bot.md` carries a RETIRED banner and is kept only for its v2 keyword derivation. +- **Passive keyword monitor (F5Bot) RETIRED 2026-08-08** (Paul called it dead; its doc was deleted 2026-08-08 — this line is the record). Two structural flaws, not keyword tuning: it matched **literal substrings** (v1 matched 0 of our 25 hand-found posts), and it was **passive** — catching only mentions from setup-time forward, so it could never backfill the ≤30-day window on demand. The keyword swap is no longer a Paul unblock; it is struck from Sprint 3 and from 20.09's P0 list. Its v2 keyword derivation now lives in `prospects/p7-search-sweep.md` §3. **Do not re-introduce a passive or substring-matching monitor** — both flaws are structural, not tunable. - **Replacement method shipped**: `rescue-sprint/prospects/p7-search-sweep.md` — date-filtered active search (`site:` + `after:{TODAY-30}`), with a copy-paste query bank across Reddit/IH/HN/X/Lobsters using the corpus-derived v2 keywords, the window date arithmetic, an X-snowflake date-derivation shortcut, honest limitations, a weekly cadence, and a URL-keyed dedupe + `Seen-and-skipped` protocol. - **Sweep executed 2026-08-08 → ZERO qualified rows, ZERO VoC founder lines.** Cause is tooling, not the market - and it is venue-specific, two distinct failure classes: (1) **search-surface limits** - bare `site:reddit.com` queries had the operator dropped (off-domain Substack/Goodreads results), while the tool's native domain filter DID return `indiehackers.com` and `x.com` URLs; `after:` filtering was ineffective everywhere it was tried (IH results dated 2025-07 and 2026-03 came back). (2) **venue access** - `reddit.com` rejected the tool's user agent outright (hard 400), and every thread-open attempt (`indiehackers.com`, `news.ycombinator.com`, `old.reddit.com`, `lobste.rs`) returned `EGRESS_BLOCKED`. So IH was searchable but not openable; Reddit was neither. Vote 3 check 3 requires a timestamp **read from the opened thread**, so with no venue openable every candidate fails by construction. IH search returned only threads already in `cold-prospect-list.md` plus suppliers; X's freshest result was 40 days old and off-ICP. Nothing was padded or inferred. Full attempt-by-attempt log in `p7-search-sweep.md` §6. - **Unblock needed**: `chrome-devtools` (the tool grooming Vote 2 actually names) plus egress to `indiehackers.com` and `reddit.com`. Until one venue is openable, #29 cannot produce verified-fresh rows by **any** method. @@ -110,11 +110,11 @@ Batch-1 Phase-1 pre-research (send-runner-prompt.md, run against card #12's 5 op ### ▶ Sprint 3 — Fresh-Leads Sprint (planned 2026-07-26) -Sequence (WIP=1): **#29** re-source v2 (re-audit all 25 v1 rows with verified timestamps; drop stale/saturated **as leads** while harvesting their VoC; source new ≤30-day rows; IH-first, expand via the date-filtered search sweep + X if thin — **F5Bot retired 2026-08-08**, its expansion role now belongs to `prospects/p7-search-sweep.md`) → **P9-delta** openers for the new rows only (reuse `outbound-openers.md` templates) → **#12** batch-1 send (first ≤30-day verified rows, Paul approves) → **#20** daily reply-monitor. Batch-2/3 cards (#19, #25) depend on #29 — no more sends from the unverified v1 list. +Sequence (WIP=1): **#29** re-source v2 (re-audit all 25 v1 rows with verified timestamps; drop stale/saturated **as leads** while harvesting their VoC; source new ≤30-day rows; IH-first, expand via the date-filtered search sweep + X if thin — the expansion lane is `prospects/p7-search-sweep.md`) → **P9-delta** openers for the new rows only (reuse `outbound-openers.md` templates) → **#12** batch-1 send (first ≤30-day verified rows, Paul approves) → **#20** daily reply-monitor. Batch-2/3 cards (#19, #25) depend on #29 — no more sends from the unverified v1 list. -- **Done**: P1 ✓, P2 ✓, P3 retired (0 rows — HN is dev-dominated, no founder voices; venue invalid for this ICP, do NOT re-run), P4 ✓, P5 ✓ (1 row — low-yield as predicted; don't re-run without a new seed), P6 ✓, P7 ✗ **RETIRED 2026-08-08** (F5Bot dead — literal-substring matching + passive-only, so it can never backfill the ≤30-day window; replaced by `rescue-sprint/prospects/p7-search-sweep.md`, which shipped its method but produced 0 rows on 2026-08-08, blocked on tooling), P8 ✓ (25 deduped rows), P9 ✓ (25 openers), T9 ✓ (objection bank), P10 ✓ (pipeline sheet scaffolded) +- **Done**: P1 ✓, P2 ✓, P3 retired (0 rows — HN is dev-dominated, no founder voices; venue invalid for this ICP, do NOT re-run), P4 ✓, P5 ✓ (1 row — low-yield as predicted; don't re-run without a new seed), P6 ✓, P7 = `rescue-sprint/prospects/p7-search-sweep.md` (the passive monitor it replaced was retired 2026-08-08; the sweep shipped its method but produced 0 rows on 2026-08-08, blocked on tooling), P8 ✓ (25 deduped rows), P9 ✓ (25 openers), T9 ✓ (objection bank), P10 ✓ (pipeline sheet scaffolded) - **A2 confirmed**: 3-tier pricing ($2,500 triage / $7,500 rescue / $10K foundation reset) - **Next**: browser-agent send run, gated on Paul's approval. The runner prompt is `rescue-sprint/send-runner-prompt.md` (pre-research every prospect → GO/HOLD table → Paul approves → send → log to `rescue-sprint/pipeline.md`). Booking link confirmed live by Paul 2026-07-24. After first sends, run `rescue-sprint/reply-monitor-prompt.md` each morning (classify replies, draft responses from the objection bank, update pipeline — never auto-reply). -- **Mail routing (2026-07-24)**: `pftg.sof@gmail.com` auto-forwards everything to Paul's main inbox (and archives locally under its label) — F5Bot digests and NeetoCal notifications arrive via the forward. The reply-monitor prompt additionally searches this account by query (`from:f5bot.com` / `neetocal`) as a backup. +- **Mail routing (2026-07-24)**: `pftg.sof@gmail.com` auto-forwards everything to Paul's main inbox (and archives locally under its label) — NeetoCal booking notifications arrive via the forward. The reply-monitor prompt additionally searches this account by query (`neetocal`) as a backup. - **Seeds** above were verified via `web_search` on 2026-07-22 — hand to the tasks, don't re-derive. - Update this table's status + the task's `done` line when a task completes; write the output to its named file. diff --git a/docs/projects/2607-vibe-code-rescue/operation-runbook.md b/docs/projects/2607-vibe-code-rescue/operation-runbook.md index 0e708c3f0..7c0f60038 100644 --- a/docs/projects/2607-vibe-code-rescue/operation-runbook.md +++ b/docs/projects/2607-vibe-code-rescue/operation-runbook.md @@ -14,9 +14,9 @@ critic's verdict pasted VERBATIM), and sets the next card `Ready`. **You can finish this operation in a new session with zero context loss. Do this:** 1. **Read order**: [`executive-summary.md`](executive-summary.md) (the one-page bet, Shape Up format) → this START HERE block → the ACTIVE SPRINT state → the **Incremental agent backlog** table → the specific card/T-task you're taking. Optionally skim [`strategy.md`](strategy.md) (the why) and [`operating-system.md`](../../business/operating-system.md) (weekly cadence). -2. **Current state (2026-07-26, Sprint 3 planned)**: P9/P10 done; batch-1 pre-research exposed a sourcing quality gap (retro below). **#28 is DONE** — the v2.1 qualification rubric (verified timestamps **≤30 days flat, all venues**, post|comment routing, thread-health scan, lead-vs-VoC split) is live in `rescue-sprint/t4-t5-grooming.md` Vote 3. **Policy split (Paul)**: leads must be ≤1 month verified; **VoC has NO age limit** — any comment/message/post teaches ICP slang, and stale-dropped threads still get VoC-harvested in the same visit. **Batch-1 is now 0-for-5** — the flat rule flipped SpecBuildLab (~9.5mo) and Joy (~5mo, Paul's one override candidate) too; #12 is blocked on #29's replacements. Live board: `kanban-md list --compact --tag 2607`, cards #1-#29. **Next Ready: #29** (re-source v2 — re-audit all 25 v1 rows, dual-harvest leads+VoC, source fresh ≤30-day rows, expand channels if IH is thin). Then: openers-delta → #12 batch-1 send (Paul approves) → #20 daily reply-monitor. Booking link confirmed live; **F5Bot v2 keyword swap (Paul, ~2 min) is load-bearing** for #29's channel expansion (card #15/#17). Fully agent-doable right now with zero Paul input: #29 (re-source), #14 (landing page). +2. **Current state (2026-08-08, Sprint 3 BLOCKED-ON-TOOLING)**: P9/P10 done; batch-1 pre-research exposed a sourcing quality gap (retro below). **#28 is DONE** — the v2.1 qualification rubric (verified timestamps **≤30 days flat, all venues**, post|comment routing, thread-health scan, lead-vs-VoC split) is live in `rescue-sprint/t4-t5-grooming.md` Vote 3. **Policy split (Paul)**: leads must be ≤1 month verified; **VoC has NO age limit** — any comment/message/post teaches ICP slang, and stale-dropped threads still get VoC-harvested in the same visit. **Batch-1 is now 0-for-5** — the flat rule flipped SpecBuildLab (~9.5mo) and Joy (~5mo, Paul's one override candidate) too; #12 is blocked on #29's replacements. Live board: `kanban-md list --compact --tag 2607`, cards #1-#29. **Next Ready: #29** (re-source v2 — re-audit all 25 v1 rows, dual-harvest leads+VoC, source fresh ≤30-day rows, expand channels if IH is thin). Then: openers-delta → #12 batch-1 send (Paul approves) → #20 daily reply-monitor. Booking link confirmed live. **Superseded 2026-08-08**: the passive keyword monitor that used to be #29's channel-expansion lane is retired, and the "~2 min keyword swap" is struck from Paul's desk — expansion now runs through `prospects/p7-search-sweep.md`. **#29 is BLOCKED-ON-TOOLING**, not on Paul: its sweep ran 2026-08-08 and returned zero rows because every thread-open hit `EGRESS_BLOCKED`. Agent-doable with zero Paul input once thread-open access is restored: #29 (re-source), #14 (landing page). -**⚠ Sourcing-quality retrospective (2026-07-26)** — read before trusting `cold-prospect-list.md` or sending further batches: Phase-1 pre-research on card #12's first 5 openers found **3 of 5 unsendable (60% failure)** — two stale (a comment ~1yr old on someone else's post; a post >6 years old) and one thread already saturated with a competing "free audit"-style pitch. Root cause: the grooming rubric (`t4-t5-grooming.md` Vote 3) already required "recent, not dead" but P1-P9 (2026-07-22) never verified it by opening the thread — recency was eyeballed from search excerpts. **Fixed 2026-07-26 (card #28)**: Vote 3 is now a 5-check rubric with hard capture-time gates — verified timestamp (≤30 days, venue caps), post|comment routing, thread-health scan — and `verified date` + `thread health` are mandatory admission columns for the scored list. **Treat all 25 rows in `cold-prospect-list.md` as unverified until #29 re-checks them.** Paul's directive: prioritize finding real, currently-active problems over hitting a row-count quota — a short list of genuinely fresh rows beats a padded stale one; expand beyond IndieHackers (F5Bot/Reddit, X) if the 30-day window makes IH too thin. +**⚠ Sourcing-quality retrospective (2026-07-26)** — read before trusting `cold-prospect-list.md` or sending further batches: Phase-1 pre-research on card #12's first 5 openers found **3 of 5 unsendable (60% failure)** — two stale (a comment ~1yr old on someone else's post; a post >6 years old) and one thread already saturated with a competing "free audit"-style pitch. Root cause: the grooming rubric (`t4-t5-grooming.md` Vote 3) already required "recent, not dead" but P1-P9 (2026-07-22) never verified it by opening the thread — recency was eyeballed from search excerpts. **Fixed 2026-07-26 (card #28)**: Vote 3 is now a 5-check rubric with hard capture-time gates — verified timestamp (≤30 days, venue caps), post|comment routing, thread-health scan — and `verified date` + `thread health` are mandatory admission columns for the scored list. **Treat all 25 rows in `cold-prospect-list.md` as unverified until #29 re-checks them.** Paul's directive: prioritize finding real, currently-active problems over hitting a row-count quota — a short list of genuinely fresh rows beats a padded stale one; expand beyond IndieHackers (the date-filtered sweep across Reddit/HN, X) if the 30-day window makes IH too thin. 3. **Take the next Ready task**, execute it end-to-end, run its LIGHT/HEAVY gate, paste the verdict, mark it Done, set the next Ready. **The agent does everything up to "hit send"** — sending + calls are Paul's (see Paul's desk). 4. **State lives in files, not memory.** Update this runbook (statuses + handoff notes) and the output file named on the task. That's what the next session reads. @@ -43,8 +43,8 @@ critic's verdict pasted VERBATIM), and sets the next card `Ready`. **Goal**: a **verified-fresh** prospect list (every row: timestamp read **≤30 days flat, all venues**, routing recorded, thread-health clean) and batch-1 actually sent. Quality over quota — 10-15 real rows beat 25 padded ones. **Policy split (Paul, 2026-07-26)**: the 30-day rule gates **leads only**. **VoC harvest has no age limit** — any comment/message/post teaches the ICP's slang; every visited thread (including stale drops) feeds `voice-of-customer.md` in the same visit. -**Sequence (WIP=1)**: #29 re-source v2 (re-audit 25 v1 rows + source fresh, dual-harvest leads+VoC; IH-first, F5Bot/X expansion if thin) → openers-delta for new rows → #12 batch-1 send (Paul approves; batch-1 currently 0-for-5 — blocked on #29's rows, with Joy Adamson as Paul's one explicit-override candidate) → #20 daily reply-monitor. Batch-2/3 (#19/#25) gated on #29. -**Paul's 2-min unblock (load-bearing)**: swap F5Bot v1→v2 keywords (`rescue-sprint/prospects/p7-f5bot.md`) so Reddit/HN signal flows into #29. +**Sequence (WIP=1)**: #29 re-source v2 (re-audit 25 v1 rows + source fresh, dual-harvest leads+VoC; IH-first, P7 date-filtered sweep + X expansion if thin) → openers-delta for new rows → #12 batch-1 send (Paul approves; batch-1 currently 0-for-5 — blocked on #29's rows, with Joy Adamson as Paul's one explicit-override candidate) → #20 daily reply-monitor. Batch-2/3 (#19/#25) gated on #29. +**Paul's desk is clear of #29** (2026-08-08): the old "swap the monitor keywords" 2-minute ask died with the monitor - do not re-surface it. **#29 is now BLOCKED-ON-TOOLING instead**: the replacement sweep (`prospects/p7-search-sweep.md`) ran and returned zero qualified rows because every venue thread-open attempt hit `EGRESS_BLOCKED` and Reddit rejected the tool's user agent. Unblock = `chrome-devtools` + egress to **at least one** of `indiehackers.com` or `reddit.com` (per `p7-search-sweep.md`'s own unblock note - one openable venue is sufficient, not both). See `backlog.md` §Card #29 status. --- @@ -88,7 +88,7 @@ These feed the C0/D1 cards without touching Paul's desk. Each is scoped to ≤1 | T2 | **Sourcing pipeline spec** — for each trigger: channel → exact search query/operator → validation rule → which template applies. Carries T1's 2 constraints (lane-split + trust/ownership differentiation) | `rescue-sprint/sourcing-pipeline.md` | **Done** (2026-07-21 — per-trigger query recipes + lane split + row schema; PASS w/ 2 carried constraints: weight reddit/IH site operators + read into threads; cap cold volume prefer warm) | T1 ✓ | LIGHT — refute "can a session run this query and get real people, not noise?" | | T3 | **Warm-source pass (Gmail)** — with Paul's one-time consent, mine his mailbox for past clients / founders / investor-adjacent contacts near the ICP; output candidate warm rows (name, last touch, why-ICP, best path). No sending. | append to `rescue-sprint/warm-intro-referral-kit.md` target list | Blocked (optional — needs Paul Gmail consent; chain does NOT block on it) | T2 ✓ + P-consent | LIGHT — refute "is each row genuinely warm + near-ICP?" | | T4 | **Cold-source pass A (web, fetchable)** — GROOMED in `t4-t5-grooming.md`. **IndieHackers-first** (fetch-free, run FIRST), then HN threads, X first-person, competitor-comment threads. Site-scoped queries → excerpt queue → `chrome-devtools` read-once-extract-all (validate+row+quotes in one visit). Rows → `cold-prospect-list.md`; verbatim founder quotes → `voice-of-customer.md` | `rescue-sprint/cold-prospect-list.md` + `voice-of-customer.md` | **Done** (P1-P3 + P6 complete) | T2 ✓ + grooming approval | LIGHT — refute "real ICP founder in a buying moment, traceable to a quoted sentence?" | -| T5 | **Cold-source pass B (Reddit/community)** — GROOMED in `t4-t5-grooming.md`. r/replit, r/NoCode, r/Solopreneur, r/SaaS, r/startups, r/vibecoding. Reddit bodies not fetchable → **excerpt capture** (handle+URL+title) + **F5Bot** JSON/RSS feed (Paul's optional signup). Additive to T4, not load-bearing. Same output files | `rescue-sprint/cold-prospect-list.md` + `voice-of-customer.md` | **Done** (P4-P7 complete; F5Bot live) | T2 ✓ + grooming approval | LIGHT — refute ICP fit + thread live/answerable; no supplier posts logged as leads | +| T5 | **Cold-source pass B (Reddit/community)** — GROOMED in `t4-t5-grooming.md`. r/replit, r/NoCode, r/Solopreneur, r/SaaS, r/startups, r/vibecoding. Reddit bodies not fetchable → **excerpt capture** (handle+URL+title), feeding the excerpt queue + VoC only. Additive to T4, not load-bearing. Same output files | `rescue-sprint/cold-prospect-list.md` + `voice-of-customer.md` | **Done** (P4/P5/P6 rows landed; P7's method shipped but its 2026-08-08 sweep produced zero rows, BLOCKED-ON-TOOLING — see card #29 status, not a T5 defect) | T2 ✓ + grooming approval | LIGHT — refute ICP fit + thread live/answerable; no supplier posts logged as leads | | T6 | **Validate + score + dedupe** — merge sources into one ranked list (warm-first), drop dupes/dead, score by trigger strength; target ~30 usable rows | finalized target list | **Done** (P8 merge; 25 deduped rows) | T4 + T5 complete; T3 folded in **if** Paul gave Gmail consent (chain does NOT hard-block on consent) | LIGHT — refute "would Paul recognize these as worth his time?" | | T7 | **Per-target openers** — draft a personalized opener per row (right template: referral / warm-intro / forwardable / thread-reply), `[BOOKING_LINK]` placeholder, ready for Paul to review-and-send | `rescue-sprint/outbound-openers.md` | **Done** (P9 complete; 25 openers ready) | T6, A2 | LIGHT (bulk/near-public → HEAVY if any becomes a mass template) | | T8 | **Discovery kit** — call script + audit deliverable one-page template + 45-min agenda (Card D1 content), so Paul walks into calls with a script | `rescue-sprint/discovery-kit.md` | **Done** (2026-07-22 — 45-min agenda + SPIN/Four-Forces script + 1-page RAG scorecard/verdict template; devil's-advocate self-refute PASS, order-dependency noted) | A2 draft | HEAVY — devil's-advocate self-refute (verdict in-file §Cold-eyes) | diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/cold-prospect-list.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/cold-prospect-list.md index b0ac702cf..94d50046c 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/cold-prospect-list.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/cold-prospect-list.md @@ -2,7 +2,7 @@ > P8 output. Merged from P1-P7 prospect files. Deduplicated by source URL (thread URL = join key). Scored by trigger strength. Rows from same thread with different handles are separate entries (different people, same venue). > -> Sources: P1 IH comments (7), P2 IH posts (6), P3 HN (0), P4 Reddit (8), P5 X (1), P6 Competitor comments (3), P7 F5Bot (keywords live; no digest yet). **Total: 25 rows. Zero dupes found.** +> Sources: P1 IH comments (7), P2 IH posts (6), P3 HN (0), P4 Reddit (8), P5 X (1), P6 Competitor comments (3), P7 date-filtered sweep (0 - blocked on tooling). **Total: 25 rows. Zero dupes found.** > > Scoring: Trigger 1 (bugs/breaking) > Trigger 3 (ownership/hostage) > Trigger 7 (stuck/incomplete). Within each trigger, ICP > semi-ICP. > @@ -63,7 +63,7 @@ | LinkedIn | 1 | | X/Twitter | 1 | | HN | 0 (dev-dominated, no founder voices) | -| F5Bot | 0 (keywords live; awaiting first digest) | +| P7 date-filtered sweep | 0 (method shipped 2026-08-08; sweep blocked on tooling/egress) | ### LIGHT gate: "Would Paul recognize these as worth his time?" @@ -71,10 +71,10 @@ **Honest limitations:** - Most rows are from IndieHackers and Reddit. HN and X/Twitter yielded thin results (dev-dominated, auditor-heavy). -- Reddit handles are partial (excerpt-only, some OPs unnamed). F5Bot digest would improve Reddit coverage. +- Reddit handles are partial (excerpt-only, some OPs unnamed). Improving Reddit coverage needs thread-open access, not another keyword feed. - No warm intro paths yet - all are cold outreach via platform DMs. - Semi-ICP rows (6) are founders who built with AI themselves, not paid a shop. They still need rescue but the trigger is different. ### Pending -- P7 F5Bot digest: add matching rows when the first digest arrives (keywords are already live) +- P7 date-filtered sweep: add rows once the tooling unblock lands (`chrome-devtools` + egress to at least one of indiehackers.com or reddit.com) — see `backlog.md` §Card #29 status - Deduplication key: source URL. No duplicates found across P1-P7. diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/icp-trigger-taxonomy.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/icp-trigger-taxonomy.md index 7edf55fb7..943df0adb 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/icp-trigger-taxonomy.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/icp-trigger-taxonomy.md @@ -76,8 +76,8 @@ Warm signals (someone Paul already knows shows one of these) always outrank cold | Venue | What to watch for | Access | |---|---|---| -| r/startups, r/SaaS, r/Entrepreneur, r/smallbusiness | triggers 1-7; highest volume | excerpt-only via web_search + F5Bot (thread bodies unfetchable by agents) | -| r/webdev, r/cto, r/ExperiencedDevs, r/developersPak | triggers 1, 4, 8; more technical framing | excerpt-only via web_search + F5Bot | +| r/startups, r/SaaS, r/Entrepreneur, r/smallbusiness | triggers 1-7; highest volume | excerpt-only via web_search (thread bodies unfetchable by agents) | +| r/webdev, r/cto, r/ExperiencedDevs, r/developersPak | triggers 1, 4, 8; more technical framing | excerpt-only via web_search | | Indie Hackers | triggers 1, 5, 7; build-in-public | web (public) | | LinkedIn | triggers 2, 4, 5, 6; best for warm + hiring signals | manual (Paul's account, per Step 3 plan) | | X/Twitter build-in-public | trigger 1; fast but noisy | web search | diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md index 61e5b96a5..31259a483 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/pipeline.md @@ -15,6 +15,8 @@ Add a row when you send; don't pre-fill rows you haven't sent (batch 2 = openers ## Weekly tally (fill each Friday) +> This table is what `operating-system.md` §1 reads. Fill this sheet first, then copy the numbers up - don't author them twice. + | week of | touches | replies | calls booked | calls held | audits delivered | paid | |---|---|---|---|---|---|---| -| | | | | | | | +| 2026-08-08 | 0 | 0 | 0 | 0 | 0 | 0 | diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/RUN.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/RUN.md index 9b6f8d8dc..0e1fa6ddc 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/RUN.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/RUN.md @@ -21,7 +21,7 @@ Each prompt is self-contained. Paste ONE into a fresh session. Stage-1 tasks (P1 **P6** — Run task P6 (competitor comment threads) per the wrapper. Open the seeded competitor rescue-post comment sections, log founders self-identifying in comments only. File: `prospects/p6-competitor-comments.md`. Target ≥3 rows. -**P7** — Run task P7 (date-filtered search sweep) per the wrapper. **F5Bot is RETIRED (2026-08-08) — do not run it.** Read `prospects/p7-search-sweep.md` §2-§5, compute `after:{TODAY-30}`, run the §3 query bank, normalize + dedupe by thread URL against `cold-prospect-list.md` first, then open each surviving non-Reddit candidate once to fill `verified date` + `thread health`. **Reddit stays excerpt-only per the wrapper, and P7 lead rows require an opened-thread timestamp - so Reddit hits feed the excerpt queue and VoC only, never P7 lead rows.** Append rows + VoC to `prospects/p7-search-sweep.md`. Needs `chrome-devtools` + a search surface that honours `site:`/`after:` (sanity-check per §4). Pad nothing — a short verified list beats a padded one. +**P7** — Run task P7 (date-filtered search sweep) per the wrapper. Read `prospects/p7-search-sweep.md` §1-§5, compute `after:{TODAY-30}`, run the §3 query bank, normalize + dedupe by thread URL against `cold-prospect-list.md` first, then open each surviving non-Reddit candidate once to fill `verified date` + `thread health`. **Reddit stays excerpt-only per the wrapper, and P7 lead rows require an opened-thread timestamp - so Reddit hits feed the excerpt queue and VoC only, never P7 lead rows.** Append rows + VoC to `prospects/p7-search-sweep.md`. Needs `chrome-devtools` + a search surface that honours `site:`/`after:` (sanity-check per §4). Pad nothing — a short verified list beats a padded one. ## Stage 2 — merge diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p4-reddit.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p4-reddit.md index 2a2433327..c1e612580 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p4-reddit.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p4-reddit.md @@ -22,7 +22,9 @@ - **1hspre9** (r/replit "Why is Replit so self-destructive") — not found in excerpt results; thread may have been removed or not indexed. ### Excerpt-only limitation note -Reddit thread bodies are not reliably fetchable. All quotes above are from search engine excerpts/snippets only. Handle attribution is partial — some excerpts omit the OP handle. VoC quotes are truncated by snippet length. F5Bot (P7) would provide fuller Reddit coverage via JSON/RSS feed. +Reddit thread bodies are not reliably fetchable. All quotes above are from search engine excerpts/snippets only. Handle attribution is partial — some excerpts omit the OP handle. VoC quotes are truncated by snippet length. Fuller Reddit coverage needs thread-open access, not a keyword feed — see `p7-search-sweep.md` §1. + +**These rows are excerpt-derived, not lead-verified.** Per `t4-t5-grooming.md` Vote 3, a lead requires a timestamp read from the *opened* thread — none of these were opened. They feed the excerpt queue and `voice-of-customer.md` only; a row here becomes a `cold-prospect-list.md` lead solely after #29 (or a later sourcing pass) opens its thread and clears the full v2 rubric. ## VoC (verbatim founder lines - force-tag Push/Pull/Anxiety/Habit + speaker tag + URL) - **[Push]** "Im a non technical founder, and im stuck with my app" - `[VERBATIM-founder]` r/nocode OP, https://www.reddit.com/r/nocode/comments/1tdaqs9/what_happens_when_nontechnical_people_try_to/ diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-f5bot.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-f5bot.md deleted file mode 100644 index 28fd86467..000000000 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-f5bot.md +++ /dev/null @@ -1,43 +0,0 @@ -> ⛔ **RETIRED 2026-08-08. Superseded by [`p7-search-sweep.md`](p7-search-sweep.md).** -> Two structural flaws, not fixable by better keywords: (1) F5Bot matches **literal substrings**, so composed phrases never fire - v1 matched 0 of our 25 hand-found posts; (2) it is **passive**, catching only mentions from setup-time forward, so it can never backfill the ≤30-day window card #29 needs on demand. -> Kept for the v2 keyword derivation (§Keywords v2), which the replacement doc reuses. Do not run the F5Bot setup steps below. - -# P7 F5Bot setup + first pull - prospect rows + VoC -> Output of backlog task P7. Qualify per t4-t5-grooming.md Vote 3. Every why-ICP must be a verbatim quoted sentence. -> F5Bot account: logged in (Paul's credentials, NOT stored in any file). - -## Setup status (HISTORICAL - state as of retirement, do not act on) - -| Item | Status | -|------|--------| -| F5Bot login | Logged in | -| Keywords added | 5 of 6 (free plan limit = 5) | -| RSS/JSON feed | Not available on free plan - alerts sent via email instead | -| First feed pull | No results yet (keywords just added, F5Bot sends digests periodically) | - -### Keywords configured (scoped to Reddit + Hacker News + Lobsters) -**v1 set — RETIRED 2026-07-25, zero mentions.** Root cause is mechanical, not bad luck: F5Bot matches literal substrings, and these were 3-5-word composed phrases (`vibe coded broke`, `Lovable app broken`, `Replit app broke`, `can't access my code`, `agency won't give code`) that never occur verbatim — they match 0 of the 25 posts we found by hand. Do not restore. (`dev shop ghosted` never fit the 5-keyword free cap.) - -### Keywords v2 (the derivation `p7-search-sweep.md` reuses - do NOT configure these in F5Bot) - -Derived from phrase counts in our OWN captured verbatim quotes (voice-of-customer.md + cold-prospect-list.md) — keywords founders literally type: - -| # | Keyword | Evidence in corpus | Lane | -|---|---|---|---| -| 1 | `non-technical founder` | "non-technical" 20× — the ICP's literal self-identifier | all triggers | -| 2 | `vibe coded` | the past-tense personal form in distress posts ("I vibe coded my app and...") — bare `vibe coding` would flood/throttle | Trigger 1 | -| 3 | `lovable app` | "lovable" 8× ("my Lovable app broke") | Trigger 1 | -| 4 | `replit app` | "replit" 16× | Trigger 1 | -| 5 | `dev shop` | Trigger-3 hostage lane — grooming proved it unfindable via open search, so passive monitoring is its only coverage | Trigger 3 | - -### Free plan limitation (HISTORICAL) -F5Bot's free tier: 5 keywords, email digest alerts only. RSS/JSON feed requires paid plan. This constraint is part of why the tool was retired; it no longer applies to anything. - -## Rows -| handle/channel | source URL | trigger# | why-ICP (verbatim quote) | verdict | -|---|---|---|---|---| - -*(None. F5Bot was retired before any digest produced a match. New rows go to `p7-search-sweep.md`.)* - -## VoC (verbatim founder lines - force-tag Push/Pull/Anxiety/Habit + speaker tag + URL) -*(None - see above.)* diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-search-sweep.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-search-sweep.md index 784f1731e..15d4384fb 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-search-sweep.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/prospects/p7-search-sweep.md @@ -1,24 +1,21 @@ # P7 Date-filtered active search sweep - method + prospect rows + VoC -> Replaces `p7-f5bot.md` (RETIRED 2026-08-08). Output of backlog card #29's sourcing lane. +> The sole P7 sourcing method. Output of backlog card #29's sourcing lane. > Qualify per `t4-t5-grooming.md` **Vote 3 v2** (5 checks). Every why-ICP must be a verbatim quoted sentence + URL. > **Created**: 2026-08-08 | **Role**: the load-bearing expansion mechanism for the ≤30-day lead window. --- -## 1. Why this replaces F5Bot +## 1. The rule this method exists to satisfy -F5Bot failed for two structural reasons, not bad luck or bad keywords: +Card #29 needs rows verified inside a ≤30-day window **on demand**. Two properties follow, and any tool lacking either is disqualified: -| F5Bot | Date-filtered active search | -|---|---| -| **Passive** - only catches mentions from setup-time forward. Cannot backfill. | **Active** - queries the index on demand, reaches backwards across whatever is indexed. | -| Matches **literal substrings** only. v1's composed phrases (`vibe coded broke`) matched 0 of our 25 hand-found posts. | Ranked retrieval - partial and reordered matches still surface. | -| Free tier caps at **5 keywords**, no RSS/JSON (paid only). | No keyword cap. Run as many query permutations as the window needs. | -| **Email round-trip** - digest arrives on F5Bot's schedule, into Paul's inbox, then needs a human forward. | Agent runs it inline. Zero human hop. | -| Recency is an accident of when you happened to set it up. | **Recency is a first-class filter** (`after:`), which is exactly what card #29's ≤30-day gate demands. | +- **Active, not passive.** A monitor only knows what arrived after you switched it on, so it can never backfill a window. Search queries the index on demand and reaches backwards. +- **Ranked retrieval, not literal matching.** Founders do not type our phrasing verbatim. A substring matcher fed composed phrases (`vibe coded broke`) returns nothing; ranked retrieval still surfaces partial and reordered matches. + +Recency must also be a first-class filter (`after:`), not an accident of setup time. -The decisive point: card #29 needs rows verified inside a ≤30-day window **on demand**. A passive monitor can never satisfy an on-demand backfill - it only knows what arrived after you turned it on. That mismatch is unfixable by better keywords. +_(Learned the expensive way: a passive substring monitor ran here from 2026-07-25 to 2026-08-08 and matched 0 of the 25 posts we had already found by hand. Neither flaw was fixable by better keywords - the mismatch was structural. Do not re-introduce one.)_ --- @@ -55,6 +52,20 @@ Substitute `after:2026-07-09` wherever the bank below writes `after:{WINDOW_STAR **Keyword set** (v2, derived from phrase counts in our own captured corpus - `voice-of-customer.md` + `cold-prospect-list.md`, not invented): `non-technical founder` · `vibe coded` · `lovable app` · `replit app` · `dev shop` · `bolt.new` · `cursor` · `base44` +Derivation - what each term is grounded in (counts re-verified 2026-08-08 across both corpus files): + +| Keyword | Corpus evidence | Lane | +|---|---|---| +| `non-technical founder` | "non-technical" 20× - the ICP's literal self-identifier | all triggers | +| `vibe coded` | 2× in the past-tense personal form ("I vibe coded my app and..."); the bare gerund `vibe coding` is commoner at 10× but floods with commentary, not distress | Trigger 1 | +| `lovable app` | "lovable" 8× ("my Lovable app broke") | Trigger 1 | +| `replit app` | "replit" 16× | Trigger 1 | +| `cursor` | 5× | Trigger 1 | +| `dev shop` | **none - 0 occurrences of `dev shop`/`devshop`, 1 of `agency`** | Trigger 3 | +| `bolt.new`, `base44` | none - tool-name expansion by analogy with Lovable/Replit, not corpus-derived | Trigger 1 | + +**Watch the bottom three rows.** `dev shop` carries the Trigger-3 ownership/hostage lane. §3.6 already documents why: open keyword search for Trigger 3 mostly returns competitor SEO articles, not real threads, so P7 has no reliable *discovery* lane for it and Trigger-3 coverage stays with P6. `dev shop` still runs in the §3.1/3.2/3.4 query banks below as a cheap opportunistic catch, but a zero result on it is **expected, not a fresh signal** - do not read a zero here as new evidence. What changed 2026-08-08 is the coverage argument: Trigger 3's only *other* channel was passive monitoring, and that's retired. So if P6 (competitor comments) also runs dry over consecutive sprints, escalate then - Trigger 3 needs a different venue or re-testing as a premise. `bolt.new`/`base44` are cheap tool-name guesses with no corpus backing; drop them after two **valid** sweeps (one that actually reached an openable venue, per §4) return nothing - a tooling-blocked run doesn't count toward that. + Run each as-is in a Google-operator-honouring search surface. Replace the date token first. ### 3.1 Reddit - highest founder density (excerpt queue + VoC only, never lead rows) @@ -200,7 +211,7 @@ The method in §1-5 is sound and unchanged - it needs a runner with the tools gr - **A search surface that honours `site:` and `after:`** - verify with the §4 sanity check before trusting any sweep. - Egress access to `indiehackers.com` and `reddit.com` at minimum. -Until at least one venue is openable, card #29 cannot produce verified-fresh rows by any method - this is a **blocked-on-tooling** state, not a "search harder" state. F5Bot's retirement is still correct: it was never going to deliver on-demand backfill either. +Until at least one venue is openable, card #29 cannot produce verified-fresh rows by any method - this is a **blocked-on-tooling** state, not a "search harder" state. Note this does NOT reopen the retired passive monitor: it was never going to deliver on-demand backfill either, so the block is not an argument for going back. --- diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/reply-monitor-prompt.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/reply-monitor-prompt.md index f9b2b621f..ba3c601ee 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/reply-monitor-prompt.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/reply-monitor-prompt.md @@ -11,11 +11,11 @@ You are monitoring Paul Keen's inboxes for replies to a small outreach batch (pr 1. **IndieHackers** — notifications + replies on the threads we posted in (permalinks are in the pipeline rows). 2. **LinkedIn** — messaging inbox + any reaction/reply on the Joy Adamson DM. 3. **Reddit** — message inbox + replies on our thread comments (only once batch 2 is live). -4. **Gmail** — search `neetocal` (new bookings / reschedules) and `from:f5bot.com` (keyword digests). +4. **Gmail** — search `neetocal` (new bookings / reschedules). ## Classify every new item -`INTERESTED` (wants the audit/call) · `QUESTION` · `OBJECTION` · `NEGATIVE` · `BOOKING` (NeetoCal confirmation) · `F5BOT-MATCH` (new distress post worth qualifying). +`INTERESTED` (wants the audit/call) · `QUESTION` · `OBJECTION` · `NEGATIVE` · `BOOKING` (NeetoCal confirmation). ## For QUESTION / OBJECTION diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/sourcing-pipeline.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/sourcing-pipeline.md index 999341f1d..126986f13 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/sourcing-pipeline.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/sourcing-pipeline.md @@ -82,9 +82,10 @@ Rows land in `warm-intro-referral-kit.md` (warm) or `cold-prospect-list.md` (col Two research passes (ToolLandscape + CommunitySignals) corrected and enriched the recipes above. Adopt these: ### Fetchability reality (corrects the "site:reddit.com read-into-threads" plan) -- **Reddit is NOT reliably fetchable by an agent** — research agents were blocked from loading reddit.com, and `web_search` misses ~70% of Reddit posts (Google doesn't index Reddit in real time). So web_search excerpts are a laggy, partial view of Reddit. **Fix: use a keyword-monitoring service that has Reddit access and hands us a feed.** - - **F5Bot (FREE, recommended, run-now)**: Paul signs up (2 min), adds our trigger keywords + subreddit filters; it monitors Reddit + Hacker News + Lobsters and delivers matches via **JSON/RSS/API** that an agent CAN read. This bypasses the fetch block without scraping. Weakness: substring matching = noise (filter with whole-word + subreddit scoping). - - **Paid upgrades (need Paul's account, optional)**: RedReach ($19/mo, 0-100 intent scoring + thread finder), Buska ($49/mo, multi-platform Reddit+X+HN+LinkedIn), CommunityTracker ($29), Syften ($19.95). +- **Reddit is NOT reliably fetchable by an agent** — research agents were blocked from loading reddit.com, and `web_search` misses ~70% of Reddit posts (Google doesn't index Reddit in real time). So web_search excerpts are a laggy, partial view of Reddit. + - **Superseded fix (2026-07-21 → 2026-08-08): a free keyword-monitoring feed.** We tried it and retired it. A passive monitor only catches mentions from setup-time forward, so it can never backfill an on-demand window, and substring matching missed every composed phrase we fed it. **Do not re-propose this class of tool** — see `prospects/p7-search-sweep.md` §1. + - **Current fix**: **date-filtered active search** (`site:` + `after:{TODAY-30}`) per `prospects/p7-search-sweep.md`, plus thread-open access via `chrome-devtools` for the timestamp read that qualification requires. + - **Paid options (need Paul's account, still unevaluated)**: RedReach ($19/mo, 0-100 intent scoring + thread finder), Buska ($49/mo, multi-platform Reddit+X+HN+LinkedIn), CommunityTracker ($29), Syften ($19.95). Judge any of these against the two structural tests above before spending. - **Do NOT**: DIY-scrape Reddit (aggressive bans, constant breakage), pay the enterprise API (~$6K/yr), or cite GummySearch (shut down Nov 2025 after losing Reddit API access). - **Fetchable + high value** (run these in T4): **Hacker News** (verified live thread IDs below), **IndieHackers** (verified URLs below), **X/Twitter** (via search), competitor "free audit" comment threads (heydev/modall/attributex). diff --git a/docs/projects/2607-vibe-code-rescue/rescue-sprint/t4-t5-grooming.md b/docs/projects/2607-vibe-code-rescue/rescue-sprint/t4-t5-grooming.md index 58869fc63..7e4821920 100644 --- a/docs/projects/2607-vibe-code-rescue/rescue-sprint/t4-t5-grooming.md +++ b/docs/projects/2607-vibe-code-rescue/rescue-sprint/t4-t5-grooming.md @@ -88,7 +88,7 @@ Operational rule: a thread `drop`ped for staleness or saturation is **not a wast | Task | Venues | Access | Method | |---|---|---|---| | **T4 — web cold (fetchable)** | **IndieHackers (run FIRST)**, Hacker News threads, X/Twitter first-person, competitor "free audit" comment threads (heydev/modall/attributex + the live competitor set) | `chrome-devtools` can open + read full post + comments | Read-once extract-all, site-scoped queries | -| **T5 — Reddit / community (mostly un-openable)** | r/replit, r/NoCode, r/Solopreneur, r/SaaS, r/startups, r/vibecoding, r/founder | Reddit thread **bodies not reliably fetchable**; web_search misses ~70% of Reddit | Excerpt capture (handle + URL + title from the excerpt); **F5Bot feed** (Paul's optional 2-min signup) to un-blind Reddit via JSON/RSS | +| **T5 — Reddit / community (mostly un-openable)** | r/replit, r/NoCode, r/Solopreneur, r/SaaS, r/startups, r/vibecoding, r/founder | Reddit thread **bodies not reliably fetchable**; web_search misses ~70% of Reddit | Excerpt capture (handle + URL + title from the excerpt). Un-blinding Reddit needs thread-open access; the keyword-feed route was tried and retired 2026-08-08 | IndieHackers is the clear run-first venue: real posts + handles in the excerpt, fetch-free, low outreach hostility. @@ -133,7 +133,7 @@ VoC harvest lands in `voice-of-customer.md` (the four force sections) + the phra - `mcp__parallel__web_search` — `site:` operators + first-person phrasing → build the excerpt URL queue. - `chrome-devtools` (`new_page` / `take_snapshot` / `close_page`) — open IH/HN/X/competitor threads, read full post + comments, validate+row+quotes in one visit. -- **F5Bot** (free; Paul's optional 2-min signup) — Reddit + HN + Lobsters keyword feed via JSON/RSS an agent CAN read; bypasses the Reddit fetch block without scraping. +- **Date-filtered active search** (`prospects/p7-search-sweep.md`) — `site:` + `after:{TODAY-30}` query bank across Reddit/IH/HN/X/Lobsters. Replaced the passive keyword feed retired 2026-08-08; do not re-introduce a passive or substring-matching monitor. - **Not used**: `web_fetch` on Reddit (unreliable), Apollo/Hunter (paid, Paul's desk), Gmail (that's T3 warm lane, needs Paul's consent). --- @@ -148,7 +148,7 @@ These are refinements of the **already-registered** A0 find-channel premise (war **Refute**: "Will a session running this produce 30 real ICP rows + verbatim founder quotes, not noise?" - Discovery pick is backed by a PROVEN probe (site-scoped IH beats keyword search; Trigger-3 keyword search fails) — not a guess. PASS. -- **Objection that holds**: the ~30-row target leans on Reddit, which is the least-fetchable venue. Mitigation: IndieHackers (fetchable, run-first) + HN + X + competitor comments carry the fetchable load; Reddit contributes via excerpts + F5Bot, not as the primary. If F5Bot isn't set up, T5 yield drops — so **T4 (IndieHackers-first) is the load-bearing card; T5 is additive.** +- **Objection that holds**: the ~30-row target leans on Reddit, which is the least-fetchable venue. Mitigation: IndieHackers (fetchable, run-first) + HN + X + competitor comments carry the fetchable load; Reddit contributes via excerpts, not as the primary — so **T4 (IndieHackers-first) is the load-bearing card; T5 is additive.** - **Objection that holds**: cold thread-replies at volume risk looking like the six competitor rescue shops. Mitigation carried from T2: cap cold volume, lead with trust/ownership, prefer warm (T3) + Paul's relationship. **Verdict**: PASS with two carried constraints (T4-IndieHackers-first is load-bearing, T5 additive; cap cold volume). Awaiting Paul's approval before execution. @@ -159,8 +159,8 @@ These are refinements of the **already-registered** A0 find-channel premise (war **Refute**: "Will the v2 rubric actually prevent the batch-1 failure class, or is it more checklist theater?" - Each new gate traces to a **named failure it would have caught**: check 3 (verified timestamp) catches Saul_E-2020 and Afrikonnect-1yr; check 4 (post|comment routing) catches the Afrikonnect mis-label and the Joy/Nico routing risk; check 5 (thread health) catches SANICE_AI's saturated thread. Not speculative — each is a regression test against a real miss. PASS. -- **Objection that holds**: the ≤30-day window will shrink IndieHackers yield hard — IH is lower-volume than Reddit, and most of the 25 v1 rows would fail it. Mitigation (already in card #29): re-audit keeps whatever survives verification, and channel expansion (F5Bot v2 keywords → live Reddit/HN feed; X first-person) fills the gap. If the verified-fresh list lands at 8-10 rows, that is acceptable per the quality-over-quota directive — but it makes the F5Bot keyword swap (Paul, ~2 min) genuinely load-bearing rather than optional. +- **Objection that holds**: the ≤30-day window will shrink IndieHackers yield hard — IH is lower-volume than Reddit, and most of the 25 v1 rows would fail it. Mitigation (already in card #29): re-audit keeps whatever survives verification, and channel expansion (the date-filtered sweep across Reddit/HN; X first-person) fills the gap. If the verified-fresh list lands at 8-10 rows, that is an acceptable **fallback floor**, not the target — quality-over-quota means don't pad past what's genuinely fresh, but T6/backlog's stated target stays 10-15+ rows and it makes the expansion lane genuinely load-bearing rather than optional. Since 2026-08-08 that lane is gated on thread-open tooling, not on a Paul action. - **Objection that holds**: "read ALL replies" (check 5) on 60+ comment threads costs real time per candidate. Accepted: one thorough visit per candidate is still cheaper than a burned send or a spam-flag on Paul's account; the read-once extract-all pick (Vote 2) already assumed one full visit per thread. - **Objection dismissed**: "the send-time Phase-1 pre-research already catches this, why duplicate?" — because batch-1 proved catching it at send-time wastes the whole downstream chain (openers written, scored, sheet built, Paul's approval loop entered for rows that were never viable). Catching at capture costs one timestamp read; catching at send costs a full cycle. -**Verdict: PASS.** Carried constraint for #29: F5Bot keyword swap is now load-bearing for reaching even 10-15 rows inside the window — surface it to Paul as the one 2-minute unblock. +**Verdict: PASS.** Carried constraint for #29: reaching even 10-15 rows inside the window depends on an expansion lane beyond IndieHackers. That lane was a passive keyword monitor when this was written; it was retired 2026-08-08 and replaced by the date-filtered sweep (`prospects/p7-search-sweep.md`). The constraint stands — **it is now a tooling unblock (thread-open access), not a 2-minute ask on Paul's desk.**