@sellable/mcp 0.1.728 → 0.1.729

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.
@@ -1313,7 +1313,29 @@ async function selectWorkspaceExactTarget(input, workspacePlanOverride, options
1313
1313
  return (!excludedTargets.some((excluded) => excluded.campaignId === candidate.campaignId &&
1314
1314
  excluded.tableId === candidate.tableId) &&
1315
1315
  !excludedExactTargetKeys.has(key) &&
1316
- !prefilterBlockedTargets.some((blocked) => coordinatorBlockedExactTargetMatches(blocked, candidate)));
1316
+ !prefilterBlockedTargets.some((blocked) => {
1317
+ if (!coordinatorBlockedExactTargetMatches(blocked, candidate)) {
1318
+ return false;
1319
+ }
1320
+ // fix(112ag): a run_scheduler_sweep is the scheduler PLACEMENT action that
1321
+ // RESOLVES a loaded_awaiting_scheduler state — the loaded blocker is set by
1322
+ // the prepare/approve fence that produced the ready rows, not by the sweep.
1323
+ // prefilterBlockedTargets excludes every blocker EXCEPT complete/capped, so
1324
+ // a loaded edge lands here and would drop its own sweep BEFORE the in-loop
1325
+ // "sweeps always bind" bypass can act (Amplify t2: cascade cmrk6nihu loaded
1326
+ // 8x, the dated 2026-07-29 sweep — required because that date is beyond the
1327
+ // 48h ambient window — was prefilter-dropped, 0 sweep dispatches, 37 ready
1328
+ // rows stranded at scheduled 0). Waive ONLY the loaded_awaiting_scheduler
1329
+ // blocker and ONLY for the sweep candidate: every other blocker still
1330
+ // excludes it, prep/approve candidates on a loaded edge are still excluded,
1331
+ // and complete/capped edges (never in prefilterBlockedTargets) still bar
1332
+ // prep re-dispatch via completeDeferredTargets in the loop below.
1333
+ if (blocked.blocker === "loaded_awaiting_scheduler" &&
1334
+ workspaceActionFamily(candidate.actionKey) === "run_scheduler_sweep") {
1335
+ return false;
1336
+ }
1337
+ return true;
1338
+ }));
1317
1339
  });
1318
1340
  if (targetCandidates.length === 0) {
1319
1341
  const pendingWaitAction = workspaceActiveWorkWaitAction(workspaceActions) ??
@@ -1519,7 +1541,20 @@ async function selectWorkspaceExactTarget(input, workspacePlanOverride, options
1519
1541
  // must be enforced again after the exact binding is known.
1520
1542
  actionKey: targetConfig.approvalInputs.expectedActionKey,
1521
1543
  };
1522
- if (blockedExactTargets.some((blocked) => coordinatorBlockedExactTargetMatches(blocked, exactSelectedTarget))) {
1544
+ if (blockedExactTargets.some((blocked) => {
1545
+ if (!coordinatorBlockedExactTargetMatches(blocked, exactSelectedTarget)) {
1546
+ return false;
1547
+ }
1548
+ // fix(112ag): mirror the prefilter waiver after the exact rebind — a
1549
+ // run_scheduler_sweep is the placement action that resolves a
1550
+ // loaded_awaiting_scheduler state, so a loaded blocker on its own edge
1551
+ // must not re-skip it here. Every other blocker still excludes it.
1552
+ if (isSchedulerSweepTarget &&
1553
+ blocked.blocker === "loaded_awaiting_scheduler") {
1554
+ return false;
1555
+ }
1556
+ return true;
1557
+ })) {
1523
1558
  continue;
1524
1559
  }
1525
1560
  const selection = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.728",
3
+ "version": "0.1.729",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code, Codex, and Hermes campaign workflows",
6
6
  "main": "dist/index.js",