@sellable/mcp 0.1.734 → 0.1.735

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.
@@ -1876,6 +1876,25 @@ export function sanitizeRefillTargetPlanResult(result) {
1876
1876
  const paidRefreshNeededSenderIdSet = paidRefreshNeededSenderIds(senderRefillPlans);
1877
1877
  const blockers = sanitizeBlockers(result.blockers, selectedKeys, paidRefreshNeededSenderIdSet);
1878
1878
  const request = isRecord(result.request) ? result.request : {};
1879
+ // fix(112ak-s2): this is the CLIENT mirror of the server's dated-sweep gate,
1880
+ // and it silently discarded the server's valid sweep. sanitizeTargetSchedulerSweep
1881
+ // derives its expected senders/actions from this map and returns null when the
1882
+ // map is empty, so a stricter rule here vetoes the server outright: Dotwork
1883
+ // 2026-07-29 (five lanes, remainingProjectedGap 10, readyBuffer 4, rrpg 6) had
1884
+ // the server emit a 20-placement sweep across all five senders, this loop
1885
+ // marked zero lanes eligible, and every served plan came back with
1886
+ // approve_messages at globalActionQueue[0] and no sweep at any rank. Because
1887
+ // the coordinator consumes the sanitized plan, that blocked execution, not just
1888
+ // display. 112ak-s relaxed the same predicate server-side
1889
+ // (refill-target-plan.ts buildExactDateSchedulerSweepAction): a lane earns a
1890
+ // sweep by HOLDING ready rows against an open dated slot, not by its ready
1891
+ // buffer fully covering its gap. No target-date condition is needed to mirror
1892
+ // the server's scoping — sanitizeTargetSchedulerSweep already refuses to run
1893
+ // without an expectedTargetDate matching ^\d{4}-\d{2}-\d{2}$, so this path is
1894
+ // explicit-date-only by construction. Deliberately the ONLY relaxed occurrence:
1895
+ // the wait_for_scheduler append and the status derivation below both keep
1896
+ // `remainingReadyOrProjectedGap === 0`, where full ready coverage is the
1897
+ // correct and intended meaning.
1879
1898
  const sweepEligibleBySender = new Map();
1880
1899
  for (const plan of senderPlans) {
1881
1900
  const senderId = stringValue(plan.senderId);
@@ -1883,7 +1902,6 @@ export function sanitizeRefillTargetPlanResult(result) {
1883
1902
  if (senderId &&
1884
1903
  actionType &&
1885
1904
  numberValue(plan.remainingProjectedGap) > 0 &&
1886
- numberValue(plan.remainingReadyOrProjectedGap) === 0 &&
1887
1905
  numberValue(plan.readyBuffer) > 0) {
1888
1906
  const lanes = sweepEligibleBySender.get(senderId) ?? new Set();
1889
1907
  lanes.add(actionType);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.734",
3
+ "version": "0.1.735",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code, Codex, and Hermes campaign workflows",
6
6
  "main": "dist/index.js",