From c4ae0d7eb0369b35e34e03eaadd93755fe9ed0fe Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 7 Jul 2026 16:18:16 -0700 Subject: [PATCH 1/4] Add system health/version check to remaining user-invocable skills conversation-planner, reply-to-post, stats, and sync-planner-persona-from-linkedin were missing the inline outreach-update-check block that setup-outreach and send-connection-request already run, so they could silently run against a stale version or a down browser/cron service. --- outreach/skills/conversation-planner/SKILL.md | 14 ++++++++++++++ outreach/skills/reply-to-post/SKILL.md | 14 ++++++++++++++ outreach/skills/stats/SKILL.md | 14 ++++++++++++++ .../sync-planner-persona-from-linkedin/SKILL.md | 14 ++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/outreach/skills/conversation-planner/SKILL.md b/outreach/skills/conversation-planner/SKILL.md index d33a90d..8ed3b16 100644 --- a/outreach/skills/conversation-planner/SKILL.md +++ b/outreach/skills/conversation-planner/SKILL.md @@ -45,6 +45,20 @@ operator the LinkedIn MCP is not registered** (fix: run `./install.sh` or `make claude-install`). Do **not** pick up a different browser tool as a fallback. **Plan-only** mode (Phase B only, no MCP) is the only allowed degradation — never substitute another browser. +## System check (run first) + +Before planning or sending, check service health and for a newer ebase version: + +```bash +bin/outreach-update-check 2>/dev/null || true +``` + +Follow the inline flow in skill **`outreach-upgrade`** for every line printed: +`SERVICE_DOWN ` (inform the user, non-blocking), then +`UPGRADE_AVAILABLE` (ask to upgrade), `UPGRADED`/`JUST_UPGRADED` (log and +continue), or `UP_TO_DATE`/empty (continue silently). +Do not block on network failures. + ## Role You are the configured outreach operator defined in runtime planner config. diff --git a/outreach/skills/reply-to-post/SKILL.md b/outreach/skills/reply-to-post/SKILL.md index c6a911e..3003c59 100644 --- a/outreach/skills/reply-to-post/SKILL.md +++ b/outreach/skills/reply-to-post/SKILL.md @@ -33,6 +33,20 @@ If `mcp__linkedin__*` tools are not registered in the current session, **stop an operator the LinkedIn MCP is not registered** (fix: run `./install.sh` or `make claude-install`). Do **not** pick up a different browser tool as a fallback. +## System check (run first) + +Before posting, check service health and for a newer ebase version: + +```bash +bin/outreach-update-check 2>/dev/null || true +``` + +Follow the inline flow in skill **`outreach-upgrade`** for every line printed: +`SERVICE_DOWN ` (inform the user, non-blocking), then +`UPGRADE_AVAILABLE` (ask to upgrade), `UPGRADED`/`JUST_UPGRADED` (log and +continue), or `UP_TO_DATE`/empty (continue silently). +Do not block on network failures. + ## Test and fixture data (do not corrupt) - Do **not** edit or write under `tests/` or `tests/fixtures/` when logging or updating pipeline state. diff --git a/outreach/skills/stats/SKILL.md b/outreach/skills/stats/SKILL.md index abac2b9..7027931 100644 --- a/outreach/skills/stats/SKILL.md +++ b/outreach/skills/stats/SKILL.md @@ -7,6 +7,20 @@ description: Show outreach performance — connection funnel, reply rates, seque Render a funnel dashboard from the `get_outreach_stats` MCP tool. One tool call, no loops — all aggregation happens server-side. +## System check (run first) + +Before pulling stats, check service health and for a newer ebase version: + +```bash +bin/outreach-update-check 2>/dev/null || true +``` + +Follow the inline flow in skill **`outreach-upgrade`** for every line printed: +`SERVICE_DOWN ` (inform the user, non-blocking), then +`UPGRADE_AVAILABLE` (ask to upgrade), `UPGRADED`/`JUST_UPGRADED` (log and +continue), or `UP_TO_DATE`/empty (continue silently). +Do not block on network failures. + ## Inputs - `since` (optional) — `YYYY-MM-DD`. If the user gives a relative date ("last week", "since Monday"), resolve it to an absolute date before calling the tool. diff --git a/outreach/skills/sync-planner-persona-from-linkedin/SKILL.md b/outreach/skills/sync-planner-persona-from-linkedin/SKILL.md index a83a384..de2ef51 100644 --- a/outreach/skills/sync-planner-persona-from-linkedin/SKILL.md +++ b/outreach/skills/sync-planner-persona-from-linkedin/SKILL.md @@ -38,6 +38,20 @@ operator the LinkedIn MCP is not registered** (fix: run `./install.sh` or --- +## System check (run first) + +Before syncing, check service health and for a newer ebase version: + +```bash +bin/outreach-update-check 2>/dev/null || true +``` + +Follow the inline flow in skill **`outreach-upgrade`** for every line printed: +`SERVICE_DOWN ` (inform the user, non-blocking), then +`UPGRADE_AVAILABLE` (ask to upgrade), `UPGRADED`/`JUST_UPGRADED` (log and +continue), or `UP_TO_DATE`/empty (continue silently). +Do not block on network failures. + ## When to use - First-time persona setup before running **conversation-planner** From 5ce4e8861d1db457e24025594d4bd0eb63436668 Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 7 Jul 2026 16:26:51 -0700 Subject: [PATCH 2/4] Drop system check from conversation-planner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's invoked per-prospect by the dashboard scheduler, not directly by the user — an upgrade prompt on every automated run would block the sweep. Health/version checks stay on the user-invoked skills only. --- outreach/skills/conversation-planner/SKILL.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/outreach/skills/conversation-planner/SKILL.md b/outreach/skills/conversation-planner/SKILL.md index 8ed3b16..d33a90d 100644 --- a/outreach/skills/conversation-planner/SKILL.md +++ b/outreach/skills/conversation-planner/SKILL.md @@ -45,20 +45,6 @@ operator the LinkedIn MCP is not registered** (fix: run `./install.sh` or `make claude-install`). Do **not** pick up a different browser tool as a fallback. **Plan-only** mode (Phase B only, no MCP) is the only allowed degradation — never substitute another browser. -## System check (run first) - -Before planning or sending, check service health and for a newer ebase version: - -```bash -bin/outreach-update-check 2>/dev/null || true -``` - -Follow the inline flow in skill **`outreach-upgrade`** for every line printed: -`SERVICE_DOWN ` (inform the user, non-blocking), then -`UPGRADE_AVAILABLE` (ask to upgrade), `UPGRADED`/`JUST_UPGRADED` (log and -continue), or `UP_TO_DATE`/empty (continue silently). -Do not block on network failures. - ## Role You are the configured outreach operator defined in runtime planner config. From 489b465cc460e412dc5de1d7afd3f700a5248e0b Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 7 Jul 2026 16:53:23 -0700 Subject: [PATCH 3/4] Bump version to 1.0.0.11 Covers the system-check rollout to reply-to-post, stats, and sync-planner-persona-from-linkedin. --- CHANGELOG.md | 5 +++++ VERSION | 2 +- pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63a42ce..e74aecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## [1.0.0.11] - 2026-07-07 + +### Added +- `reply-to-post`, `stats`, and `sync-planner-persona-from-linkedin` skills now run the inline `bin/outreach-update-check` system check (service health + version check) at skill start, matching `setup-outreach` and `send-connection-request`. Skipped for `outreach-uninstall` (about to tear down) and `conversation-planner` (scheduler-driven, not user-invoked). + ## [1.0.0.10] - 2026-07-07 ### Changed diff --git a/VERSION b/VERSION index 6f1dca2..759c95c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0.10 +1.0.0.11 diff --git a/pyproject.toml b/pyproject.toml index 7dc2159..5008eb6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ebase" -version = "1.0.0.10" +version = "1.0.0.11" description = "LinkedIn recruiting outreach that runs inside Claude Code" readme = "README.md" license = "MIT" From 8d216dba5e0f24403cd79389cd8d48dbbade0d31 Mon Sep 17 00:00:00 2001 From: Ruoqi Huang Date: Tue, 7 Jul 2026 16:57:58 -0700 Subject: [PATCH 4/4] Drop stale Chrome auto-start hint from make status; bump to 1.0.0.12 Chrome boots on demand (since 1.0.0.10), so an unregistered always-on browser service isn't a gap worth flagging in `make status` anymore. The auto-start line still prints when a launchd/systemd service is actually registered. --- CHANGELOG.md | 5 +++++ VERSION | 2 +- cron/system_status.py | 2 -- pyproject.toml | 2 +- uv.lock | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e74aecc..6c335a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. +## [1.0.0.12] - 2026-07-07 + +### Changed +- `make status` no longer prints the Chrome CDP "auto-start not registered (run bin/browser-service install)" hint — Chrome boots on demand now, so an unregistered always-on service isn't a gap to flag. The `auto-start` line still shows when a launchd/systemd service *is* registered. + ## [1.0.0.11] - 2026-07-07 ### Added diff --git a/VERSION b/VERSION index 759c95c..6ebe80a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0.11 +1.0.0.12 diff --git a/cron/system_status.py b/cron/system_status.py index 97b8031..d4f2012 100644 --- a/cron/system_status.py +++ b/cron/system_status.py @@ -126,8 +126,6 @@ def format_browser_lines() -> list[str]: lines.append( f" auto-start {browser.get('service_backend')} ({browser.get('service_unit_path')})" ) - elif not browser.get("auto_start_on_reboot"): - lines.append(" auto-start not registered (run bin/browser-service install)") return lines diff --git a/pyproject.toml b/pyproject.toml index 5008eb6..9d2d8dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ebase" -version = "1.0.0.11" +version = "1.0.0.12" description = "LinkedIn recruiting outreach that runs inside Claude Code" readme = "README.md" license = "MIT" diff --git a/uv.lock b/uv.lock index 0b2baa4..591b840 100644 --- a/uv.lock +++ b/uv.lock @@ -245,7 +245,7 @@ wheels = [ [[package]] name = "ebase" -version = "1.0.0.10" +version = "1.0.0.12" source = { virtual = "." } dependencies = [ { name = "certifi" },