@sellable/mcp 0.1.418 → 0.1.420
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.
package/README.md
CHANGED
|
@@ -66,8 +66,9 @@ reader value, validates proof/AI tells, and saves content artifacts under
|
|
|
66
66
|
|
|
67
67
|
The refill-sends public command wrapper plans and executes approval-gated send
|
|
68
68
|
refills. It supports `--yolo` and optional sender selectors such as
|
|
69
|
-
`--sender "Christian Reyes"
|
|
70
|
-
|
|
69
|
+
`--sender "Christian Reyes"`, optional through-date selectors such as
|
|
70
|
+
`--until 2026-06-30`, or typed MCP calls to `refill_sends({ yolo, senders,
|
|
71
|
+
untilDate })` from:
|
|
71
72
|
|
|
72
73
|
- `mcp/sellable/skills/refill-sends/SKILL.md`
|
|
73
74
|
|
|
@@ -296,6 +297,7 @@ Use the refill command for sender send refills:
|
|
|
296
297
|
|
|
297
298
|
```
|
|
298
299
|
/sellable:refill-sends --yolo
|
|
300
|
+
/sellable:refill-sends --yolo --until 2026-06-30
|
|
299
301
|
/sellable:refill-sends --sender "Christian Reyes" --sender "Thomas Nobbs"
|
|
300
302
|
```
|
|
301
303
|
|
|
@@ -323,6 +325,7 @@ Use the Codex refill command with the same flags:
|
|
|
323
325
|
|
|
324
326
|
```
|
|
325
327
|
$sellable:refill-sends --yolo
|
|
328
|
+
$sellable:refill-sends --yolo --until 2026-06-30
|
|
326
329
|
$sellable:refill-sends --sender "Christian Reyes" --sender "Thomas Nobbs"
|
|
327
330
|
```
|
|
328
331
|
|
|
@@ -6,6 +6,7 @@ type RefillSendsCommandInput = {
|
|
|
6
6
|
senderIds?: string[];
|
|
7
7
|
senderNames?: string[];
|
|
8
8
|
horizonSendDays?: number;
|
|
9
|
+
untilDate?: string;
|
|
9
10
|
campaignId?: string;
|
|
10
11
|
tableId?: string;
|
|
11
12
|
intent?: RefillSendsIntent;
|
|
@@ -48,6 +49,11 @@ export declare const refillSendsToolDefinitions: {
|
|
|
48
49
|
maximum: number;
|
|
49
50
|
description: string;
|
|
50
51
|
};
|
|
52
|
+
untilDate: {
|
|
53
|
+
type: string;
|
|
54
|
+
pattern: string;
|
|
55
|
+
description: string;
|
|
56
|
+
};
|
|
51
57
|
campaignId: {
|
|
52
58
|
type: string;
|
|
53
59
|
description: string;
|
|
@@ -78,7 +84,19 @@ export declare function refillSendsCommand(input?: RefillSendsCommandInput): {
|
|
|
78
84
|
workflowPromptName: string;
|
|
79
85
|
yolo: boolean;
|
|
80
86
|
intent: RefillSendsIntent;
|
|
81
|
-
|
|
87
|
+
untilDate: string | null;
|
|
88
|
+
horizonSendDays: number | null;
|
|
89
|
+
fillWindow: {
|
|
90
|
+
mode: string;
|
|
91
|
+
untilDate: string;
|
|
92
|
+
description: string;
|
|
93
|
+
horizonSendDays?: undefined;
|
|
94
|
+
} | {
|
|
95
|
+
mode: string;
|
|
96
|
+
horizonSendDays: number | null;
|
|
97
|
+
description: string;
|
|
98
|
+
untilDate?: undefined;
|
|
99
|
+
};
|
|
82
100
|
approvalMode: RefillSendsApprovalMode;
|
|
83
101
|
campaignId: string | null;
|
|
84
102
|
tableId: string | null;
|
|
@@ -101,7 +119,8 @@ export declare function refillSendsCommand(input?: RefillSendsCommandInput): {
|
|
|
101
119
|
senders: string[];
|
|
102
120
|
senderIds: string[];
|
|
103
121
|
senderNames: string[];
|
|
104
|
-
|
|
122
|
+
untilDate: string | null;
|
|
123
|
+
horizonSendDays: number | null;
|
|
105
124
|
campaignId: string | undefined;
|
|
106
125
|
tableId: string | undefined;
|
|
107
126
|
intent: RefillSendsIntent;
|
|
@@ -14,6 +14,25 @@ function normalizeHorizonSendDays(value) {
|
|
|
14
14
|
}
|
|
15
15
|
return Math.max(1, Math.min(7, Math.floor(value)));
|
|
16
16
|
}
|
|
17
|
+
function normalizeUntilDate(value) {
|
|
18
|
+
if (value === undefined || value === null || value === "")
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof value !== "string") {
|
|
21
|
+
throw new Error("untilDate must be a string in YYYY-MM-DD format.");
|
|
22
|
+
}
|
|
23
|
+
const trimmed = value.trim();
|
|
24
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(trimmed)) {
|
|
25
|
+
throw new Error("untilDate must use YYYY-MM-DD format.");
|
|
26
|
+
}
|
|
27
|
+
const [year, month, day] = trimmed.split("-").map((part) => Number(part));
|
|
28
|
+
const parsed = new Date(Date.UTC(year, month - 1, day));
|
|
29
|
+
if (parsed.getUTCFullYear() !== year ||
|
|
30
|
+
parsed.getUTCMonth() !== month - 1 ||
|
|
31
|
+
parsed.getUTCDate() !== day) {
|
|
32
|
+
throw new Error("untilDate must be a valid calendar date.");
|
|
33
|
+
}
|
|
34
|
+
return trimmed;
|
|
35
|
+
}
|
|
17
36
|
export const refillSendsToolDefinitions = [
|
|
18
37
|
{
|
|
19
38
|
name: "refill_sends",
|
|
@@ -44,7 +63,12 @@ export const refillSendsToolDefinitions = [
|
|
|
44
63
|
type: "number",
|
|
45
64
|
minimum: 1,
|
|
46
65
|
maximum: 7,
|
|
47
|
-
description: "Number of sender-local send days to fill. Defaults to 2.",
|
|
66
|
+
description: "Number of sender-local send days to fill. Defaults to 2 when untilDate is not provided.",
|
|
67
|
+
},
|
|
68
|
+
untilDate: {
|
|
69
|
+
type: "string",
|
|
70
|
+
pattern: "^\\d{4}-\\d{2}-\\d{2}$",
|
|
71
|
+
description: "Optional sender-local YYYY-MM-DD date to fill through, inclusive. Overrides the default two send-day horizon.",
|
|
48
72
|
},
|
|
49
73
|
campaignId: {
|
|
50
74
|
type: "string",
|
|
@@ -76,7 +100,10 @@ export function refillSendsCommand(input = {}) {
|
|
|
76
100
|
const senderNames = normalizeStrings(input.senderNames);
|
|
77
101
|
const hasSenderSelectors = senders.length > 0 || senderIds.length > 0 || senderNames.length > 0;
|
|
78
102
|
const yolo = input.yolo === true;
|
|
79
|
-
const
|
|
103
|
+
const untilDate = normalizeUntilDate(input.untilDate);
|
|
104
|
+
const horizonSendDays = untilDate
|
|
105
|
+
? null
|
|
106
|
+
: normalizeHorizonSendDays(input.horizonSendDays);
|
|
80
107
|
const intent = input.intent ?? "plain";
|
|
81
108
|
const approvalMode = input.approvalMode ?? (yolo ? "approve" : "mark_ready");
|
|
82
109
|
const senderScope = hasSenderSelectors
|
|
@@ -91,7 +118,19 @@ export function refillSendsCommand(input = {}) {
|
|
|
91
118
|
workflowPromptName: "refill-sends-workflow",
|
|
92
119
|
yolo,
|
|
93
120
|
intent,
|
|
121
|
+
untilDate,
|
|
94
122
|
horizonSendDays,
|
|
123
|
+
fillWindow: untilDate
|
|
124
|
+
? {
|
|
125
|
+
mode: "until_date",
|
|
126
|
+
untilDate,
|
|
127
|
+
description: "Fill through this sender-local date inclusive, skipping no-send days and never extending beyond the date without a new packet.",
|
|
128
|
+
}
|
|
129
|
+
: {
|
|
130
|
+
mode: "horizon_send_days",
|
|
131
|
+
horizonSendDays,
|
|
132
|
+
description: "Fill the default bounded horizon by sender-local send days.",
|
|
133
|
+
},
|
|
95
134
|
approvalMode,
|
|
96
135
|
campaignId: input.campaignId ?? null,
|
|
97
136
|
tableId: input.tableId ?? null,
|
|
@@ -105,6 +144,9 @@ export function refillSendsCommand(input = {}) {
|
|
|
105
144
|
'Load get_subskill_prompt({ subskillName: "refill-sends-workflow" }) before any product operation.',
|
|
106
145
|
`Resolve route with resolve_campaign_fill_route({ intent: "${intent}"${input.campaignId ? `, campaignId: "${input.campaignId}"` : ""}${input.tableId ? `, tableId: "${input.tableId}"` : ""} }).`,
|
|
107
146
|
"Call list_senders and get_sender_routing, then resolve sender selectors against active enrolled campaign-backed sequence senders.",
|
|
147
|
+
untilDate
|
|
148
|
+
? `Use fill window untilDate="${untilDate}" as the inclusive sender-local through date; do not extend beyond that date without a new approval packet.`
|
|
149
|
+
: `Use the default fill window of ${horizonSendDays} sender-local send days.`,
|
|
108
150
|
"Read get_campaign_refill_state for enough exact candidate campaigns to pick the best per-sender target by recent/future scheduler-owned sends, then recent result evidence, then source health.",
|
|
109
151
|
"Fresh reread get_campaign_refill_state immediately before any import, prep, approval, or horizon-fill mutation.",
|
|
110
152
|
],
|
|
@@ -125,10 +167,12 @@ export function refillSendsCommand(input = {}) {
|
|
|
125
167
|
hostExamples: {
|
|
126
168
|
claude: [
|
|
127
169
|
"/sellable:refill-sends --yolo",
|
|
170
|
+
"/sellable:refill-sends --yolo --until 2026-06-30",
|
|
128
171
|
'/sellable:refill-sends --sender "Christian Reyes" --sender "Thomas Nobbs"',
|
|
129
172
|
],
|
|
130
173
|
codex: [
|
|
131
174
|
"$sellable:refill-sends --yolo",
|
|
175
|
+
"$sellable:refill-sends --yolo --until 2026-06-30",
|
|
132
176
|
'$sellable:refill-sends --sender "Christian Reyes" --sender "Thomas Nobbs"',
|
|
133
177
|
],
|
|
134
178
|
mcpTool: {
|
|
@@ -138,6 +182,7 @@ export function refillSendsCommand(input = {}) {
|
|
|
138
182
|
senders,
|
|
139
183
|
senderIds,
|
|
140
184
|
senderNames,
|
|
185
|
+
untilDate,
|
|
141
186
|
horizonSendDays,
|
|
142
187
|
campaignId: input.campaignId,
|
|
143
188
|
tableId: input.tableId,
|
|
@@ -6,7 +6,7 @@ async function postSetupEvergreenCampaigns(body) {
|
|
|
6
6
|
export const setupEvergreenCampaignsToolDefinitions = [
|
|
7
7
|
{
|
|
8
8
|
name: "setup_evergreen_campaigns",
|
|
9
|
-
description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. If a protected existing Post Engagers campaign must stay unchanged and the operator requested only shared lane execution, pass postEngagerSenderIds:[] and sharedSenderIds; do not include the protected active Post Engagers lane as a reuse packet because it can make the yolo plan non-autoExecutable. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; pass yolo only in plan mode and never include yolo on mode:\"verify\" calls. This backend command remains read-only in plan mode and verifies receipts in verify mode. Package-backed prompt authority: the installed public wrapper can be the local Codex skill entrypoint, but lane workers must use get_subskill_prompt and get_subskill_asset for nested `$sellable:create-campaign`, create-campaign-v2, generate-messages, validation, and assets; nested filesystem prompt fallback is a failed UAT. Use mcp__sellable only for workspace selection and product mutations/readbacks. Do not use mcp__sellable_admin, direct DB, Prisma, SQL, built-in web search, browser search, web.run, or any external browsing/search tool as execution or research proof; if Sellable MCP research tools are insufficient, write a blocked receipt instead of browsing externally. Worker-local replans are read-only drift checks and must preserve the exact parent sender scopes, including postEngagerSenderIds:[] when intentionally empty and the exact sharedSenderIds array; if scope, planRevision, actionId, or laneKey drifts, stop with blocked:worker_plan_scope_drift before mutation. Each lane packet includes workerDispatch with acceptedRuntimes, rejectedRuntimes, requiresVisibleThreadOrDurableReceipt, receiptArtifactHint, receiptRunId, and receiptMustBeWrittenAfter; pre-existing receipts at old deterministic paths are stale and must not be used, so stop with blocked:stale_receipt_artifact if the receipt was not freshly written for the current receiptRunId. `multi_agent_v1.spawn_agent`/opaque spawn_agent is not accepted for mutating command proof unless the parent has visible thread or durable receipt proof. In local Codex, prefer `codex_app.list_projects` then `codex_app.create_thread` with a local project target; do not create a worktree for lane execution. If Codex app thread tools are unavailable but local Codex CLI is available, use durable streaming workers with `codex -a never -s danger-full-access exec -C <repo> -o <worker-final-file> -`; approval and sandbox flags must appear before `exec`, and current customer CLI installs reject `codex exec --ask-for-approval never` and `codex exec -a never`. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. In exec/automation mode, do not call request_user_input; if yolo plan autoExecutable:false and no interactive approval can be received, stop with blocked:bounded_approval_unavailable_in_exec_mode before any mutation. Lane workers must explicitly load and use the installed `$sellable:create-campaign` wrapper as the nested workflow entrypoint, then load `create-campaign-v2` and `create-campaign-v2/core/flow.v2.json`; they must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, pause_campaign review-state transition when the current table is still DRAFT, and review readiness through that existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must set status:'succeeded' or status:'completed'; status:'passed', status:'pass', and status:'passed_with_warnings' are rejected as primary success statuses. Receipts must include createCampaignStepReceipt with setupPlanCall, createCampaignWorkflowReceipt, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall nested inside createCampaignStepReceipt; top-level-only copies of those objects are not enough and are not promoted by verify. setupPlanCall must use canonical keys: planRevision, actionId, laneKey, workspaceId, senderIds, campaignId, tableId, createIntent. Do not use laneActionId, lanePacketActionId, delegatedPlanRevision, delegatedActionId, or requestedCall text as a substitute for those canonical fields. createCampaignWorkflowReceipt must include skillCommand:'$sellable:create-campaign', skillName:'create-campaign', wrapperSkillLoaded:true, workflowPromptName:'create-campaign-v2', workflowPromptLoadedToHasMoreFalse:true, workflowAssetPath:'create-campaign-v2/core/flow.v2.json', workflowAssetLoaded:true, workerRuntime, workerThreadId or receiptArtifactPath, durableReceiptWritten when using a receipt file, and notAdHoc:true. messageDraftingReceipt must use exactly statusSource:'branch' or statusSource:'packaged-generate-messages-worker'; descriptive aliases such as statusSource:'package-readback-local-thread' are rejected. It must include proof that generate-messages was loaded, start_campaign_message_preparation/get_campaign_message_preparation_status ran when the packaged worker path is used, validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with rowId, generatedMessageText, verdict, and issues; Do not substitute `message` for `generatedMessageText`; Do not substitute `passVerdict` for `verdict`. Before writing durable receipts, run a receipt self-check: top-level `planRevision`, `actionId`, `laneKey`, `laneType`, `workspaceId`, and `senderIds` must exist; if the self-check fails, fix the receipt before ending. Use start_campaign_message_preparation with approvalMode:\"mark_ready\" only for evergreen setup. Never call `start_campaign_message_preparation` with `approvalMode:\"approve\"`; approve exactly one semantic Approved cell through select_campaign_cells/update_cell and final proof must show approvedGeneratedMessageCount exactly 1. Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not raw-write campaign status, does not archive/delete cleanup targets, and does not spend paid credits.",
|
|
9
|
+
description: "Evergreen campaign setup plan/verify command. Use plan mode first to inspect exact workspace/sender/campaign/table/source state and receive immutable lane packets. `selectedSenderIds` is a legacy shorthand for both scopes; prefer `postEngagerSenderIds` for the Post Engagers sender scope and `sharedSenderIds` for the shared lane sender scope when they differ. If a protected existing Post Engagers campaign must stay unchanged and the operator requested only shared lane execution, pass postEngagerSenderIds:[] and sharedSenderIds; do not include the protected active Post Engagers lane as a reuse packet because it can make the yolo plan non-autoExecutable. The command plans one Post Engagers lane per post-engager sender plus shared Signal Discovery and Shared Cold Fallback lanes for the shared sender set. yolo is only a parent-skill auto-execution hint for safe lane packets; pass yolo only in plan mode and never include yolo on mode:\"verify\" calls. This backend command remains read-only in plan mode and verifies receipts in verify mode. Package-backed prompt authority: the installed public wrapper can be the local Codex skill entrypoint, but lane workers must use get_subskill_prompt and get_subskill_asset for nested `$sellable:create-campaign`, create-campaign-v2, generate-messages, validation, and assets; nested filesystem prompt fallback is a failed UAT. Use mcp__sellable only for workspace selection and product mutations/readbacks. Do not use mcp__sellable_admin, direct DB, Prisma, SQL, built-in web search, browser search, web.run, or any external browsing/search tool as execution or research proof; if Sellable MCP research tools are insufficient, write a blocked receipt instead of browsing externally. Worker-local replans are read-only drift checks and must preserve the exact parent sender scopes, including postEngagerSenderIds:[] when intentionally empty and the exact sharedSenderIds array; if scope, planRevision, actionId, or laneKey drifts, stop with blocked:worker_plan_scope_drift before mutation. Each lane packet includes workerDispatch with acceptedRuntimes, rejectedRuntimes, requiresVisibleThreadOrDurableReceipt, receiptArtifactHint, receiptRunId, and receiptMustBeWrittenAfter; pre-existing receipts at old deterministic paths are stale and must not be used, so stop with blocked:stale_receipt_artifact if the receipt was not freshly written for the current receiptRunId. `multi_agent_v1.spawn_agent`/opaque spawn_agent is not accepted for mutating command proof unless the parent has visible thread or durable receipt proof. In local Codex, prefer `codex_app.list_projects` then `codex_app.create_thread` with a local project target; do not create a worktree for lane execution. If Codex app thread tools are unavailable but local Codex CLI is available, use durable streaming workers with `codex -a never -s danger-full-access exec -C <repo> -o <worker-final-file> -`; approval and sandbox flags must appear before `exec`, and current customer CLI installs reject `codex exec --ask-for-approval never` and `codex exec -a never`. Plan responses include approvalSummary; render approvalSummary when asking for bounded delegated approval because it explicitly lists campaignsToCreate, campaignsToUpdate, campaignsToVerifyOnly, campaignsLeftUntouched, attachedSenders, selectedActionIds, allowedSideEffects, forbiddenSideEffects, blockers, and approvalQuestion. When safe-yolo needs normal setup work, the parent skill may ask for bounded delegated approval: one approval over the current planRevision, selected action ids, caps, allowed side-effect classes, and stop conditions lets lane workers execute without per-substep approval while staying inside that packet. In exec/automation mode, do not call request_user_input; if yolo plan autoExecutable:false and no interactive approval can be received, stop with blocked:bounded_approval_unavailable_in_exec_mode before any mutation. Lane workers must explicitly load and use the installed `$sellable:create-campaign` wrapper as the nested workflow entrypoint, then load `create-campaign-v2` and `create-campaign-v2/core/flow.v2.json`; they must execute creation, source import, create-campaign workflow steps, generate-messages, sequence attachment, pause_campaign review-state transition when the current table is still DRAFT, and review readiness through that existing create-campaign workflow/subskills, then return receipts here for verification. Customer-visible verify receipts must set status:'succeeded' or status:'completed'; status:'passed', status:'pass', and status:'passed_with_warnings' are rejected as primary success statuses. Receipts must include createCampaignStepReceipt with setupPlanCall, createCampaignWorkflowReceipt, campaignBriefReceipt, sourceDecisionReceipt, filterDecisionReceipt, messageDraftingReceipt, reviewBatchReceipt, sequenceReceipt, and verifyCall nested inside createCampaignStepReceipt; top-level-only copies of those objects are not enough and are not promoted by verify. setupPlanCall must use canonical keys: planRevision, actionId, laneKey, workspaceId, senderIds, campaignId, tableId, createIntent. Do not use laneActionId, lanePacketActionId, delegatedPlanRevision, delegatedActionId, or requestedCall text as a substitute for those canonical fields. createCampaignWorkflowReceipt must include skillCommand:'$sellable:create-campaign', skillName:'create-campaign', wrapperSkillLoaded:true, workflowPromptName:'create-campaign-v2', workflowPromptLoadedToHasMoreFalse:true, workflowAssetPath:'create-campaign-v2/core/flow.v2.json', workflowAssetLoaded:true, workerRuntime, workerThreadId or receiptArtifactPath, durableReceiptWritten when using a receipt file, and notAdHoc:true. messageDraftingReceipt must use exactly statusSource:'branch' or statusSource:'packaged-generate-messages-worker'; descriptive aliases such as statusSource:'package-readback-local-thread' are rejected. It must include proof that generate-messages was loaded, start_campaign_message_preparation/get_campaign_message_preparation_status ran when the packaged worker path is used, validationResult:'passed', a passed qualityReview, and at least 3 concrete sampleMessages with rowId, generatedMessageText, verdict, and issues; Do not substitute `message` for `generatedMessageText`; Do not substitute `passVerdict` for `verdict`. Before writing durable receipts, run a receipt self-check: top-level `planRevision`, `actionId`, `laneKey`, `laneType`, `workspaceId`, and `senderIds` must exist; if the self-check fails, fix the receipt before ending. Use start_campaign_message_preparation with approvalMode:\"mark_ready\" only for evergreen setup. Never call `start_campaign_message_preparation` with `approvalMode:\"approve\"`; approve exactly one semantic Approved cell through select_campaign_cells/update_cell and final proof must show approvedGeneratedMessageCount exactly 1. Shared Cold Fallback samples with a standalone name followed by 'Hey there' are rejected. This command does not launch campaigns, does not schedule sends, does not assign scheduler-owned send fields, does not raw-write campaign status, does not archive/delete cleanup targets, and does not spend paid credits.",
|
|
10
10
|
inputSchema: {
|
|
11
11
|
type: "object",
|
|
12
12
|
properties: {
|
package/package.json
CHANGED
|
@@ -234,7 +234,15 @@ blocker and would make the whole yolo plan non-autoExecutable even though the
|
|
|
234
234
|
operator asked to leave it untouched. Inventory and waterfall proof may mention
|
|
235
235
|
the protected lane, but selectedActionIds and lane workers must cover only the
|
|
236
236
|
shared lane packets.
|
|
237
|
+
If the operator says to preserve existing active/live campaigns, preserve an
|
|
238
|
+
ACTIVE Post Engagers lane the same way: treat it as protected inventory, exclude
|
|
239
|
+
it from `postEngagerSenderIds` for the execution plan, and select only the
|
|
240
|
+
remaining missing/reusable shared-lane actionIds. Do not let a protected active
|
|
241
|
+
Post Engagers reuse packet block shared-lane verification or repair. Report the
|
|
242
|
+
protected active lane in inventory/final notes, but do not dispatch a worker for
|
|
243
|
+
it and do not include it in `selectedActionIds`.
|
|
237
244
|
Short form: Do not include the protected active Post Engagers lane as a reuse packet when the operator requested only shared lane execution.
|
|
245
|
+
Short form: "preserve existing active/live campaigns" means exclude ACTIVE Post Engagers from yolo execution, not block all shared-lane work.
|
|
238
246
|
|
|
239
247
|
When senders are ambiguous, ask which sender ids belong in the Post Engagers
|
|
240
248
|
sender scope and which belong in the shared lane sender scope before planning.
|
|
@@ -261,11 +269,23 @@ sender scopes, explicit bindings, or an interactive session.
|
|
|
261
269
|
|
|
262
270
|
When safe-yolo is blocked only because the plan needs normal setup work, ask
|
|
263
271
|
for a **bounded delegated approval** over the rendered current plan instead of
|
|
264
|
-
asking for each substep. The approval
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
asking for each substep. The approval request must be rendered from the plan's
|
|
273
|
+
`approvalSummary`, not handwritten from raw lane packets alone. Show:
|
|
274
|
+
|
|
275
|
+
- `workspaceId`, `planRevision`, and `selectedActionIds`.
|
|
276
|
+
- Sender scopes with display names and ids: Post Engagers senders and shared-lane senders.
|
|
277
|
+
- `campaignsToCreate`: each campaign/lane name, action id, create intent, attached senders, and allowed side effects.
|
|
278
|
+
- `campaignsToUpdate`: each existing campaign/table id, current status/step, attached senders, and exact repairs or setup side effects.
|
|
279
|
+
- `campaignsToVerifyOnly`: existing campaigns that will only be verified/read.
|
|
280
|
+
- `campaignsLeftUntouched`: existing campaigns attached to selected senders but excluded from the current selected lane scope, with the reason.
|
|
281
|
+
- Source/import caps, generate-message caps, route-proof approval policy, allowed side-effect classes, forbidden side effects, blockers, and stop conditions.
|
|
282
|
+
|
|
283
|
+
If `approvalSummary.approvalQuestion` is present, use it as the short approval
|
|
284
|
+
question and put the detailed buckets underneath. Do not ask a vague yes/no
|
|
285
|
+
question that only says "run evergreen setup" or "approve this plan" without
|
|
286
|
+
naming the campaigns to create, existing campaigns to update/verify, campaigns
|
|
287
|
+
left untouched, and attached senders. After that one approval covers the current
|
|
288
|
+
planRevision and selectedActionIds, the parent may act on behalf of the
|
|
269
289
|
operator and execute the selectedActionIds end to end. Do not ask again for
|
|
270
290
|
substep approvals for source import, create-campaign choices, Message Drafting,
|
|
271
291
|
sequence attach/precheck, or exactly one route-proof approval when those actions
|
|
@@ -275,6 +295,7 @@ workspace id, sender ids, source/list id, campaign/table id, new campaign/table
|
|
|
275
295
|
id, planRevision, actionId, selectedActionIds, allowed side effects, caps,
|
|
276
296
|
status, or blocker set outside the approved packet.
|
|
277
297
|
The short rule: one approval covers the current planRevision and selectedActionIds.
|
|
298
|
+
The approval clarity rule: the operator approves named campaign create/update/verify/untouched buckets and attached senders, not a generic evergreen run.
|
|
278
299
|
The execution rule: act on behalf of the operator; do not ask again for substep approvals while work stays within the lane packet, approved caps, approved side-effect classes, and route-proof approval policy.
|
|
279
300
|
The drift rule: stop and re-plan when ids, caps, blockers, side-effect classes, or any new campaign/table id leave the approved packet.
|
|
280
301
|
|
|
@@ -346,6 +367,14 @@ When launching durable Codex CLI workers from an automation parent, pass an
|
|
|
346
367
|
explicit supported worker model instead of relying on the Codex CLI default
|
|
347
368
|
model. Use the parent runtime model when known, for example:
|
|
348
369
|
`codex -a never -s danger-full-access exec --skip-git-repo-check -m <worker-model> -C <repo> -o <worker-final-file> -`.
|
|
370
|
+
In Codex CLI, the parent runtime model is visible in the run header as
|
|
371
|
+
`model: <model-name>`. Copy that exact model string into child worker launches
|
|
372
|
+
first. If the parent header says `model: gpt-5.5`, launch workers with
|
|
373
|
+
`-m gpt-5.5`; do not invent or probe nearby aliases such as `gpt-5.3-codex`,
|
|
374
|
+
`gpt-5.2`, `gpt-5-codex`, `codex-latest`, or `codex-mini-latest` before trying
|
|
375
|
+
the exact parent model. A one-line probe must count as supported only when it
|
|
376
|
+
exits 0 and returns the requested output; a session header followed by a
|
|
377
|
+
`not supported` error is rejected, not accepted.
|
|
349
378
|
Do not rely on the Codex CLI default model; some customer and VPS installs
|
|
350
379
|
default to unavailable model aliases. If the parent cannot identify a supported
|
|
351
380
|
worker model and a test `codex exec -m <worker-model>` launch is rejected, stop
|
|
@@ -66,14 +66,18 @@ Accepted invocation flags in the same user request:
|
|
|
66
66
|
fresh state reread.
|
|
67
67
|
- `--sender <name-or-id>`: scope to a specific sender; repeat for multiple
|
|
68
68
|
senders.
|
|
69
|
+
- `--until <YYYY-MM-DD>`: fill through that sender-local date, inclusive,
|
|
70
|
+
instead of the default two send-day horizon.
|
|
69
71
|
- `senderIds: <id>, <id>` or `senderNames: <name>, <name>`: explicit selector
|
|
70
72
|
alternatives when the host preserves natural-language arguments better than
|
|
71
73
|
shell-style flags.
|
|
74
|
+
- `untilDate: YYYY-MM-DD`: explicit date selector alternative when the host
|
|
75
|
+
preserves natural-language arguments better than shell-style flags.
|
|
72
76
|
|
|
73
77
|
When the host can call typed MCP tools, start with:
|
|
74
78
|
|
|
75
79
|
```text
|
|
76
|
-
refill_sends({ yolo?: boolean, senders?: string[], senderIds?: string[], senderNames?: string[], horizonSendDays?: number })
|
|
80
|
+
refill_sends({ yolo?: boolean, senders?: string[], senderIds?: string[], senderNames?: string[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD" })
|
|
77
81
|
```
|
|
78
82
|
|
|
79
83
|
That command helper only normalizes arguments and returns the execution
|
|
@@ -132,13 +136,16 @@ reassignment, or campaigns outside those selected for the eligible sender set.
|
|
|
132
136
|
Stop and re-plan if the route, sender set, ids, caps, blockers, or side-effect
|
|
133
137
|
class drift before mutation.
|
|
134
138
|
|
|
135
|
-
In `--yolo`, the default two-day fill horizon is two send days
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
139
|
+
In `--yolo`, the default two-day fill horizon is two send days unless
|
|
140
|
+
`--until`/`untilDate` is provided. If an until date is provided, compute bounded
|
|
141
|
+
gaps through that sender-local date inclusive, skipping no-send days and never
|
|
142
|
+
extending beyond that date without a new packet. For each target sender, compute
|
|
143
|
+
the bounded gap from that sender's healthy daily capacity, existing future
|
|
144
|
+
scheduler-owned scheduled sends, and rows already ready to schedule across
|
|
145
|
+
active campaigns enrolled with that sender. Then pick the best same-sender
|
|
146
|
+
campaign to fill the gap: prefer recent/future scheduler-owned sends for that
|
|
147
|
+
sender, then strongest recent result evidence, then source health. Do not stop
|
|
148
|
+
after filling only one sender when the request was sender-scoped. If a
|
|
142
149
|
same-source copy hits the campaign-table row cap, split the current source into
|
|
143
150
|
a bounded LinkedIn profile source list, confirm only that smaller list into the
|
|
144
151
|
same campaign, and operate on the copied review batch. Do not fall back to
|