@sellable/mcp 0.1.733 → 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.
@@ -454,7 +454,7 @@ function buildRefillSendsCommand(input) {
454
454
  workflowAsset: {
455
455
  subskillName: "refill-sends-workflow",
456
456
  assetPath: "core/flow.v1.json",
457
- expectedVersion: "v1.9",
457
+ expectedVersion: "v1.8",
458
458
  },
459
459
  yolo,
460
460
  executionMode,
@@ -502,7 +502,7 @@ function buildRefillSendsCommand(input) {
502
502
  },
503
503
  firstOperationalSteps: [
504
504
  'Load get_subskill_prompt({ subskillName: "refill-sends-workflow" }) before any product operation.',
505
- 'Load get_subskill_asset({ subskillName: "refill-sends-workflow", assetPath: "core/flow.v1.json" }) before any product operation; continue chunks until hasMore is false, parse JSON, and require exactly workflow:"refill-sends-workflow" and version:"v1.9". Report the verified version before D1. Any other or unverified version is workflow_version_mismatch and must stop before get_refill_target_plan or mutation.',
505
+ 'Load get_subskill_asset({ subskillName: "refill-sends-workflow", assetPath: "core/flow.v1.json" }) before any product operation; continue chunks until hasMore is false, parse JSON, and require exactly workflow:"refill-sends-workflow" and version:"v1.8". Report the verified version before D1. Any other or unverified version is workflow_version_mismatch and must stop before get_refill_target_plan or mutation.',
506
506
  "A skill cannot create or invoke /goal by itself. If this refill is already running inside an active Codex goal, keep that goal open until every selected sender lane is horizon-filled by projected coverage (sent + scheduled), Christian explicitly stops/statuses the run, or a concrete non-scheduler blocker appears.",
507
507
  `Call get_refill_target_plan({ intent: "${intent}"${workspaceId ? `, workspaceId: "${workspaceId}"` : ""}${input.campaignId ? `, campaignId: "${input.campaignId}"` : ""}${input.tableId ? `, tableId: "${input.tableId}"` : ""}${senderIds.length > 0 ? `, senderIds: ${JSON.stringify(senderIds)}` : ""}${senderNames.length > 0
508
508
  ? `, senderNames: ${JSON.stringify(senderNames)}`
@@ -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.733",
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",
@@ -75,7 +75,7 @@ get_subskill_asset({ subskillName: "refill-sends-workflow", assetPath: "core/flo
75
75
  ```
76
76
 
77
77
  Continue chunks until `hasMore:false`; require
78
- exactly `workflow:"refill-sends-workflow"` and `version:"v1.9"`, then report
78
+ exactly `workflow:"refill-sends-workflow"` and `version:"v1.8"`, then report
79
79
  that verified version before D1. Any other or unverified version is
80
80
  `workflow_version_mismatch`: stop before `get_refill_target_plan` or mutation.
81
81
  Route intent is immutable:
@@ -24,7 +24,7 @@ In `--yolo`, the coordinator may
24
24
  perform every fresh planner-ranked safe transition among existing campaigns,
25
25
  lanes, and source families. It may not create a new campaign.
26
26
 
27
- The host must load the entire asset and verify exactly `version:"v1.9"` before
27
+ The host must load the entire asset and verify exactly `version:"v1.8"` before
28
28
  D1. It reports that verified version explicitly. A different or unverified
29
29
  version is `workflow_version_mismatch` and stops before planner or mutation.
30
30
 
@@ -32,7 +32,7 @@ version is `workflow_version_mismatch` and stops before planner or mutation.
32
32
 
33
33
  ```mermaid
34
34
  flowchart TD
35
- A["Receive exact workspace, sender/action selectors, and date envelope"] --> ASSET["Verify complete flow.v1.json, workflow refill-sends-workflow, exact version v1.9"]
35
+ A["Receive exact workspace, sender/action selectors, and date envelope"] --> ASSET["Verify complete flow.v1.json, workflow refill-sends-workflow, exact version v1.8"]
36
36
  ASSET --> D1["Call get_refill_target_plan read-only with immutable route intent"]
37
37
  D1 --> RENDER["Render sender/campaign waterfall, coverage ledger, bounded side effects, forbidden actions, and stop condition"]
38
38
  RENDER --> D2["Call refill_sends with workspaceCoordinator true and displayed revision/action pins"]
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "v1.9",
2
+ "version": "v1.8",
3
3
  "workflow": "refill-sends-workflow",
4
4
  "principle": "The planner chooses one exact next action and refill_sends alone executes it. Every bounded action is receipted and followed by a canonical replan. Yolo may traverse every planner-ranked existing campaign, lane, and source family; only new campaign creation requires the user.",
5
5
  "requiredBootstrap": [
@@ -17,7 +17,7 @@
17
17
  "mustReadUntil": { "hasMore": false },
18
18
  "validation": {
19
19
  "workflow": "refill-sends-workflow",
20
- "exactVersion": "v1.9",
20
+ "exactVersion": "v1.8",
21
21
  "requiredTopLevelKeys": [
22
22
  "states",
23
23
  "gateOrder",