@sellable/mcp 0.1.729 → 0.1.730

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1458,6 +1458,18 @@ async function selectWorkspaceExactTarget(input, workspacePlanOverride, options
1458
1458
  selectedActionFamily === "continue_prospeo_source" ||
1459
1459
  selectedActionFamily === "broaden_provider_search" ||
1460
1460
  selectedActionFamily === "refresh_sender_post_engagers";
1461
+ // fix(112af-c): a prepare_messages edge suffers the same pooled-cascade
1462
+ // masking as sources/sweeps/waits — its exact scope can read scheduler-loaded
1463
+ // or complete via the shared ready buffer while the lane still holds genuine
1464
+ // never-run supply (sellable.dev 7-29: cmrcd4x4a send_invite prepare skipped
1465
+ // while 69 enrich + 1 generate never-run rows sat behind it). Unlike those
1466
+ // families a prepare is not unconditionally bindable — a genuinely-complete
1467
+ // prepare must stay deferred to avoid a re-prepare loop. So bind ONLY when the
1468
+ // LANE-SCOPED actionable census (per-sender existingRowFrontier stageCounts,
1469
+ // never the pooled coverage) proves a real frontier; an empty census keeps the
1470
+ // settled skip, and the bounded job consumes the frontier so the census drains.
1471
+ const isMaskedPrepareTarget = selectedActionFamily === "prepare_messages" &&
1472
+ exactPlanHasLaneScopedActionableFrontier(exactTargetPlan);
1461
1473
  // fix(111f, OWNER DIRECTIVE — dispatch-first): a settled preflight read
1462
1474
  // may only skip a target when its exact plan exposes NO unresolved
1463
1475
  // coordinator action — any bindable head (source supply, sweeps,
@@ -1470,6 +1482,7 @@ async function selectWorkspaceExactTarget(input, workspacePlanOverride, options
1470
1482
  const bypassSettledSkips = isSchedulerSweepTarget ||
1471
1483
  isBackgroundWaitTarget ||
1472
1484
  isSourceSupplyTarget ||
1485
+ isMaskedPrepareTarget ||
1473
1486
  yoloPlanHasUnresolvedCoordinatorAction(exactTargetPlan);
1474
1487
  if (!bypassSettledSkips && yoloPlanIsComplete(exactTargetPlan)) {
1475
1488
  completedExactTargetCount += 1;
@@ -1786,6 +1799,25 @@ function classifyWorkspaceUnavailableTerminal(plan, contextNote) {
1786
1799
  }
1787
1800
  return { code: "workspace_exact_target_unavailable", note: contextNote };
1788
1801
  }
1802
+ // fix(112af-c): a prepare_messages edge on a cascade can read scheduler-loaded
1803
+ // or complete at the pooled campaign scope (the shared ready buffer routed to
1804
+ // Open/paid InMail or the connection fallback covers the aggregate gap) while a
1805
+ // specific lane still holds genuine never-run supply the pooled coverage masks
1806
+ // (sellable.dev 7-29: cmrcd4x4a send_invite prepare skipped as "complete or
1807
+ // scheduler-loaded" while 69 enrich + 1 generate never-run rows sat behind it).
1808
+ // The lane-scoped signal is the per-sender existingRowFrontier stageCounts summed
1809
+ // by workspaceActionableSupplyCensus — NEVER the pooled readyBuffer/coverage. When
1810
+ // that census is non-empty the prepare edge is a masked-gap prepare and must bind
1811
+ // so the bounded job consumes the frontier; when the census is empty the edge is
1812
+ // genuinely settled and stays deferred (no re-prepare loop).
1813
+ function exactPlanHasLaneScopedActionableFrontier(plan) {
1814
+ const census = workspaceActionableSupplyCensus(plan);
1815
+ return (census.approvalFrontier > 0 ||
1816
+ census.generateFrontier > 0 ||
1817
+ census.enrichFrontier > 0 ||
1818
+ census.rubricFrontier > 0 ||
1819
+ census.frontierHasMoreRows);
1820
+ }
1789
1821
  function yoloPlanIsComplete(plan) {
1790
1822
  const coverage = yoloCoverage(plan);
1791
1823
  return (coverage.status === "complete" ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.729",
3
+ "version": "0.1.730",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code, Codex, and Hermes campaign workflows",
6
6
  "main": "dist/index.js",