@sellable/install 0.1.427-wip.phase143.20260727140500 → 0.1.428

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.
@@ -40,7 +40,7 @@ function getInstallVersion() {
40
40
  }
41
41
  }
42
42
 
43
- const CODEX_PLUGIN_VERSION = "0.1.71";
43
+ const CODEX_PLUGIN_VERSION = "0.1.72";
44
44
  const CODEX_PLUGIN_COMPAT_VERSIONS = [
45
45
  "0.1.8",
46
46
  "0.1.9",
@@ -96,6 +96,7 @@ const CODEX_PLUGIN_COMPAT_VERSIONS = [
96
96
  "0.1.68",
97
97
  "0.1.69",
98
98
  "0.1.70",
99
+ "0.1.71",
99
100
  "0.1.70-phase981.20260711223346+codex.20260712010246",
100
101
  ];
101
102
  const RAW_INSTALL_PACKAGE_SPEC =
@@ -3,12 +3,12 @@ FROM ${HERMES_IMAGE}
3
3
 
4
4
  USER root
5
5
 
6
- ARG INSTALLER_PACKAGE=@sellable/install@0.1.427-wip.phase143.20260727140500
6
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.428
7
7
  ARG MCP_PACKAGE=@sellable/mcp@0.1.760-wip.phase143.20260727100513
8
8
  ARG INSTALLER_INTEGRITY
9
9
  ARG MCP_INTEGRITY=sha512-muNXHuRnLTfsnW+MQUvK+p0VBZETDKeevr70iRliXyqE3/SLrZQJLL1laJzMo+qiUs9jMXMHdKOQfQqLiwJvtg==
10
10
 
11
- RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.427-wip.phase143.20260727140500" \
11
+ RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.428" \
12
12
  && test "${MCP_PACKAGE}" = "@sellable/mcp@0.1.760-wip.phase143.20260727100513" \
13
13
  && test -n "${INSTALLER_INTEGRITY}" \
14
14
  && test "$(npm view "${INSTALLER_PACKAGE}" dist.integrity)" = "${INSTALLER_INTEGRITY}" \
@@ -23,9 +23,9 @@ RUN test "${INSTALLER_PACKAGE}" = "@sellable/install@0.1.427-wip.phase143.202607
23
23
  && mkdir -p /opt/sellable-agent/install-root /opt/sellable-agent/mcp-root \
24
24
  && npm install --prefix /opt/sellable-agent/install-root --omit=dev --ignore-scripts --no-audit --no-fund "${INSTALLER_PACKAGE}" \
25
25
  && npm install --prefix /opt/sellable-agent/mcp-root --omit=dev --ignore-scripts --no-audit --no-fund "${MCP_PACKAGE}" \
26
- && node --input-type=module -e "import { readFileSync } from 'node:fs'; const install = JSON.parse(readFileSync('/opt/sellable-agent/install-root/node_modules/@sellable/install/package.json')); const mcp = JSON.parse(readFileSync('/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp/package.json')); if (install.name !== '@sellable/install' || install.version !== '0.1.427-wip.phase143.20260727140500' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.760-wip.phase143.20260727100513') throw new Error('package identity rejected');" \
26
+ && node --input-type=module -e "import { readFileSync } from 'node:fs'; const install = JSON.parse(readFileSync('/opt/sellable-agent/install-root/node_modules/@sellable/install/package.json')); const mcp = JSON.parse(readFileSync('/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp/package.json')); if (install.name !== '@sellable/install' || install.version !== '0.1.428' || mcp.name !== '@sellable/mcp' || mcp.version !== '0.1.760-wip.phase143.20260727100513') throw new Error('package identity rejected');" \
27
27
  && node --input-type=module -e "import { buildExternalRuntimeClosure } from '/opt/sellable-agent/install-root/node_modules/@sellable/install/lib/sellable-agent/external-runtime-builder.mjs'; const built = buildExternalRuntimeClosure({ mcpPackageRoot: '/opt/sellable-agent/mcp-root/node_modules/@sellable/mcp', mcpNodeModulesRoot: '/opt/sellable-agent/mcp-root/node_modules', hermesSourceRoot: '/opt/hermes', ownerUid: 0, ownerGid: 0 }); if (!built.closureDigest) throw new Error('runtime closure rejected');" \
28
- && node --input-type=module -e "import { chmodSync, writeFileSync } from 'node:fs'; const release = { installerPackage: '@sellable/install@0.1.427-wip.phase143.20260727140500', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.760-wip.phase143.20260727100513', mcpIntegrity: process.argv[2] }; writeFileSync('/opt/sellable-agent/release.json', JSON.stringify(release) + '\\n', { mode: 0o444 }); chmodSync('/opt/sellable-agent/release.json', 0o444);" "${INSTALLER_INTEGRITY}" "${MCP_INTEGRITY}" \
28
+ && node --input-type=module -e "import { chmodSync, writeFileSync } from 'node:fs'; const release = { installerPackage: '@sellable/install@0.1.428', installerIntegrity: process.argv[1], mcpPackage: '@sellable/mcp@0.1.760-wip.phase143.20260727100513', mcpIntegrity: process.argv[2] }; writeFileSync('/opt/sellable-agent/release.json', JSON.stringify(release) + '\\n', { mode: 0o444 }); chmodSync('/opt/sellable-agent/release.json', 0o444);" "${INSTALLER_INTEGRITY}" "${MCP_INTEGRITY}" \
29
29
  && npm cache clean --force
30
30
 
31
31
  COPY entrypoint.sh /usr/local/bin/sellable-agent-container-entrypoint
@@ -3,13 +3,13 @@
3
3
  This image is a dedicated Agent worker/runtime boundary beside an existing Hermes dashboard. It never replaces or reconfigures the dashboard container.
4
4
 
5
5
  Build from this directory after
6
- `@sellable/install@0.1.427-wip.phase143.20260727140500` is
6
+ `@sellable/install@0.1.428` is
7
7
  published:
8
8
 
9
9
  ```sh
10
10
  docker build --platform linux/amd64 \
11
11
  --build-arg INSTALLER_INTEGRITY='sha512-…' \
12
- --tag sellable-agent-host:0.1.427-wip.phase143.20260727140500 .
12
+ --tag sellable-agent-host:0.1.428 .
13
13
  ```
14
14
 
15
15
  Create a private `bootstrap/` directory owned by root with mode `0700`. It must contain `bootstrap.json`, `provider-auth`, and `slack-app`, each owned by root with mode `0600`. `bootstrap.json` contains only non-secret identities, hashes, package integrities, and the control-plane URL. The other two files contain the provider JSON and global Slack app token whose hashes are pinned by `bootstrap.json`.
@@ -3,9 +3,9 @@ FROM ${HERMES_IMAGE}
3
3
 
4
4
  USER root
5
5
 
6
- ARG MCP_PACKAGE=@sellable/mcp@0.1.760-wip.phase143.20260727100513
7
- ARG MCP_INTEGRITY=sha512-iQ7jvv5zZGJRww4hoxkPck+9vpYywTJo6k2pi5e/wCWFGDaNQtOlChVWPPFVykbYr5ePlecn6IGQrdFUHgobSg==
8
- ARG INSTALLER_PACKAGE=@sellable/install@0.1.427-wip.phase143.20260727140500
6
+ ARG MCP_PACKAGE=@sellable/mcp@0.1.769
7
+ ARG MCP_INTEGRITY=sha512-pegoOIoduxY7xmngxUCaNXXZV15Rw0fiQre2/SNVKO4dT3xtwS5/LWJc7a2ht2VDJwnqsdSwSsS4m6ZLmjefHw==
8
+ ARG INSTALLER_PACKAGE=@sellable/install@0.1.428
9
9
  ARG HERMES_VERSION=0.19.0
10
10
  ARG MCP_TRUST_ROOT_B64
11
11
  ARG TIRITH_VERSION=0.3.3
@@ -62,9 +62,9 @@ const RUNTIME_GENERATION = Number(
62
62
  const BOOT_SESSION_ID = randomUUID();
63
63
  const HERMES_VERSION = process.env.SELLABLE_AGENT_HERMES_VERSION ?? "0.19.0";
64
64
  const INSTALLER_PACKAGE =
65
- process.env.SELLABLE_AGENT_INSTALLER_PACKAGE ?? "@sellable/install@0.1.427-wip.phase143.20260727140500";
65
+ process.env.SELLABLE_AGENT_INSTALLER_PACKAGE ?? "@sellable/install@0.1.428";
66
66
  const MCP_PACKAGE =
67
- process.env.SELLABLE_AGENT_MCP_PACKAGE ?? "@sellable/mcp@0.1.760-wip.phase143.20260727100513";
67
+ process.env.SELLABLE_AGENT_MCP_PACKAGE ?? "@sellable/mcp@0.1.769";
68
68
 
69
69
  const sha256 = (value) => createHash("sha256").update(value).digest("hex");
70
70
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -38,8 +38,7 @@ import { installAgentHostServices } from "./service-installer.mjs";
38
38
  const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
39
39
  const VERSION = "sellable-agent-host-bootstrap/v1";
40
40
  const RECEIPT_VERSION = "sellable-agent-host-registration/v1";
41
- const INSTALLER_PACKAGE =
42
- "@sellable/install@0.1.427-wip.phase143.20260727140500";
41
+ const INSTALLER_PACKAGE = "@sellable/install@0.1.428";
43
42
  const MCP_PACKAGE = "@sellable/mcp@0.1.760-wip.phase143.20260727100513";
44
43
  const HERMES_VERSION = "0.18.0";
45
44
  const SHA256 = /^[a-f0-9]{64}$/;
@@ -1513,9 +1513,9 @@ export function compileClaimToProfileDesired(activeClaim, config) {
1513
1513
  ]) ||
1514
1514
  pinned.hermesCli !== "hermes" ||
1515
1515
  pinned.hermesVersion !== "0.18.0" ||
1516
- pinned.installerPackage !==
1517
- "@sellable/install@0.1.427-wip.phase143.20260727140500" ||
1518
- pinned.mcpPackage !== "@sellable/mcp@0.1.760-wip.phase143.20260727100513" ||
1516
+ pinned.installerPackage !== "@sellable/install@0.1.428" ||
1517
+ pinned.mcpPackage !==
1518
+ "@sellable/mcp@0.1.760-wip.phase143.20260727100513" ||
1519
1519
  !Array.isArray(policy.toolInclude) ||
1520
1520
  policy.toolInclude.length === 0 ||
1521
1521
  !Number.isSafeInteger(slack.generation) ||
@@ -23,12 +23,12 @@ import {
23
23
  relative,
24
24
  resolve,
25
25
  } from "node:path";
26
- import { HERMES_AGENT_BRIDGE_CONTRACT } from "./hermes-bridge.mjs";
27
26
  import {
28
27
  FLY_CUSTOMER_MODEL_ID,
29
28
  FLY_CUSTOMER_MODEL_PROVIDER,
30
29
  FLY_CUSTOMER_MODEL_REASONING_EFFORT,
31
30
  } from "./fly-customer-model.mjs";
31
+ import { HERMES_AGENT_BRIDGE_CONTRACT } from "./hermes-bridge.mjs";
32
32
 
33
33
  export const PROFILE_MATERIALIZER_PORTS = Object.freeze({
34
34
  hostAppSecret: ["resolveHostSecret"],
@@ -192,9 +192,9 @@ function validateDesired(desired) {
192
192
  desired.serviceCredentialGeneration < 1 ||
193
193
  desired.hermesCli !== "hermes" ||
194
194
  desired.hermesVersion !== "0.18.0" ||
195
- desired.installerPackage !==
196
- "@sellable/install@0.1.427-wip.phase143.20260727140500" ||
197
- desired.mcpPackage !== "@sellable/mcp@0.1.760-wip.phase143.20260727100513" ||
195
+ desired.installerPackage !== "@sellable/install@0.1.428" ||
196
+ desired.mcpPackage !==
197
+ "@sellable/mcp@0.1.760-wip.phase143.20260727100513" ||
198
198
  !Array.isArray(desired.toolInclude) ||
199
199
  desired.toolInclude.length === 0 ||
200
200
  desired.toolInclude.some((tool) => !/^[a-z][a-z0-9_]{0,127}$/.test(tool)) ||
@@ -25,8 +25,7 @@ import { fileURLToPath } from "node:url";
25
25
  import { deriveContainedProfileId } from "./profile-materializer.mjs";
26
26
 
27
27
  export const PROVISIONING_ACTION = "PROVISION_HERMES_PROFILE";
28
- export const PINNED_INSTALL_PACKAGE =
29
- "@sellable/install@0.1.427-wip.phase143.20260727140500";
28
+ export const PINNED_INSTALL_PACKAGE = "@sellable/install@0.1.428";
30
29
  export const PINNED_MCP_PACKAGE =
31
30
  "@sellable/mcp@0.1.760-wip.phase143.20260727100513";
32
31
 
@@ -613,8 +612,7 @@ function inspectProvisionedProfile({
613
612
  !matchesReadback(manifest, request) ||
614
613
  manifest.serviceCredentialReference !== serviceCredentialReference ||
615
614
  manifest.installerPackage !== PINNED_INSTALL_PACKAGE ||
616
- manifest.installerVersion !==
617
- "0.1.427-wip.phase143.20260727140500" ||
615
+ manifest.installerVersion !== "0.1.428" ||
618
616
  manifest.mcpPackage !== PINNED_MCP_PACKAGE ||
619
617
  manifest.credentialKeyVersion !== credentialKeyVersion ||
620
618
  !/^[a-f0-9]{16}$/.test(manifest.credentialFingerprint) ||
@@ -828,7 +826,7 @@ function successReceipt({
828
826
  subject: `agent-profile:${observed.profileId}`,
829
827
  cli: {
830
828
  installPackage: PINNED_INSTALL_PACKAGE,
831
- installVersion: "0.1.427-wip.phase143.20260727140500",
829
+ installVersion: "0.1.428",
832
830
  mcpPackage: PINNED_MCP_PACKAGE,
833
831
  command: "hermes profile bootstrap",
834
832
  },
@@ -876,7 +874,7 @@ function failure(code, stages, extra = {}, request = null) {
876
874
  : "agent-profile:unbound",
877
875
  cli: {
878
876
  installPackage: PINNED_INSTALL_PACKAGE,
879
- installVersion: "0.1.427-wip.phase143.20260727140500",
877
+ installVersion: "0.1.428",
880
878
  mcpPackage: PINNED_MCP_PACKAGE,
881
879
  command: "hermes profile bootstrap",
882
880
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.427-wip.phase143.20260727140500",
3
+ "version": "0.1.428",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code, Codex, and Hermes",
6
6
  "bin": {
@@ -76,7 +76,7 @@ get_subskill_asset({ subskillName: "refill-sends-workflow", assetPath: "core/flo
76
76
 
77
77
  Continue chunks until `hasMore:false`; require `workflow:"refill-sends-workflow"`
78
78
  and a COMPATIBLE version: same major (`v1`) and minor at or above the minimum
79
- `v1.8` — so `v1.8`, `v1.9`, `v1.10` all pass and `v2.x` does not. Report the
79
+ `v1.9` — so `v1.9`, `v1.10` pass while `v1.8` and `v2.x` do not. Report the
80
80
  verified version before D1. A missing, unparseable, wrong-major, or
81
81
  below-minimum version is `workflow_version_mismatch`: stop before
82
82
  `get_refill_target_plan` or mutation. Do NOT require exact string equality: the
@@ -1,24 +0,0 @@
1
- ---
2
- name: refill-sends-evergreen
3
- description: Deprecated alias for refill-sends-v2.
4
- visibility: public
5
- allowed-tools:
6
- - mcp__sellable__get_subskill_prompt
7
- ---
8
-
9
- # Refill Sends Evergreen
10
-
11
- Superseded by refill-sends-v2. The prompt name now redirects through
12
- `DEPRECATED_SUBSKILL_PROMPT_REPLACEMENTS`; do not call this deprecated prompt
13
- directly.
14
-
15
- Use `refill-sends-v2` instead:
16
-
17
- ```text
18
- get_subskill_prompt({ subskillName: "refill-sends-v2" })
19
- ```
20
-
21
- The alias must not strip exact `targetConfig`, server `runHandle`,
22
- `reportingContext`, canonical `refill_reporting.v2`, or an explicit
23
- `messageTemplateRevision`. It never infers revision authority from
24
- `forceRerun`.
@@ -1,207 +0,0 @@
1
- ---
2
- name: refill-sends-v2
3
- description: Execute refill sends v2 through the fenced evergreen refill loop, with dry-run and resume support.
4
- visibility: public
5
- allowed-tools:
6
- - mcp__sellable__refill_sends_v2
7
- - mcp__sellable__get_refill_plan_v2
8
- - mcp__sellable__get_subskill_prompt
9
- - mcp__sellable__get_subskill_asset
10
- - mcp__sellable__get_auth_status
11
- - mcp__sellable__get_active_workspace
12
- - mcp__sellable__list_workspaces
13
- - mcp__sellable__get_workspace
14
- ---
15
-
16
- # Refill Sends V2
17
-
18
- Use this command for refill requests such as "refill sends", "fill evergreen
19
- senders", "load everyone up", "run Damiano", or "show a dry run for this
20
- workspace".
21
-
22
- Host command names:
23
-
24
- - Claude Code: `/sellable:refill-sends-v2`
25
- - Codex: `$sellable:refill-sends-v2`
26
-
27
- `refill_sends_v2` is the execution surface. In real-run mode it starts or
28
- resumes a fenced refill run, reads a fresh packet, executes only the packet's
29
- named bounded work, verifies the result, and returns either a terminal report, a
30
- blocked report, or an in-progress resume handle. In dry-run mode it stays
31
- read-only and writes only a dry-run journal.
32
-
33
- ## Entry
34
-
35
- Resolve the explicit `workspaceId` from the request, automation config, or
36
- active workspace readback. Scheduled or autonomous usage must carry
37
- `workspaceId` on every tool call. If the workspace is missing or ambiguous, stop
38
- with `WORKSPACE_REQUIRED`; do not switch the shared active workspace.
39
-
40
- For a real refill run:
41
-
42
- ```text
43
- refill_sends_v2({ workspaceId, intent:"auto", senderIds?, approvalMode? })
44
- ```
45
-
46
- For read-only inspection:
47
-
48
- ```text
49
- refill_sends_v2({ workspaceId, dryRun:true, intent:"auto", senderIds? })
50
- ```
51
-
52
- To resume an in-progress run, pass the handle back exactly:
53
-
54
- ```text
55
- refill_sends_v2({ workspaceId, runHandle:{runId,fence}, targetConfig, reportingContext, messageTemplateRevision? })
56
- ```
57
-
58
- `targetConfig` and the server-issued `runHandle` are separate authorities. Keep
59
- both byte-for-byte through every continuation and takeover; never fold the
60
- rotating fence into target configuration.
61
-
62
- An approved copy change is reachable only through an explicit
63
- `messageTemplateRevision` object with `version:1`, `source:"user_approved"`,
64
- the approved `templateMarkdown`, `messageTemplateRevision` identity,
65
- `priorTemplateAuthorityDigest`, `nextTemplateAuthorityDigest`, 1–500 exact
66
- `cohortRowIds`, and `requestId`, `effectId`, and `revisionOperationId`. Pass it
67
- with the exact `targetConfig` and `reportingContext`; the command obtains or
68
- resumes the server run handle and lets the planner name
69
- `revise_message_template_and_rerun`. Missing or partial input means no revision.
70
- `forceRerun:true` on a queue operation never authorizes or implies a template
71
- change.
72
-
73
- After a committed and dispatched revision receipt, continue only with the
74
- planner-provided revision-derived `approve_messages` action. It must preserve
75
- the exact revision cohort as `rowSelector:{type:"rowIds",rowIds:[...]}` plus
76
- `approvalMode:"approve"`, the compiled readiness identity, and the canonical
77
- `reportingContext`, even when the ordinary sender lane is ineligible. Do not
78
- replace it with `queue_campaign_cells` on Approved cells; that path cannot mint
79
- the authoritative approval/lane-scope receipt. Require `laneScope` in the
80
- bounded preparation receipt before the lane is considered approved. A
81
- disconnected or zero-capacity sender still blocks scheduling and does not
82
- authorize reconnecting, campaign start, or direct send.
83
-
84
- If a stale handle loses the lease, the tool reports the holder status and the
85
- approximately 10 minute lockout window. Reinvoke with the current handle or wait
86
- for lease expiry; never guess a fence.
87
-
88
- The default `intent:"auto"` inspects `managed_waterfall`,
89
- `dashboard_evergreen`, and `active_campaign` lane sources. Report the lane
90
- source and lane chain as proof for every selected sender.
91
- Connection-only evergreen lanes are invite-only refill targets. When the packet
92
- or campaign proof shows exactly `["send_invite"]`, report and execute only
93
- `selectedLane:"send_invite"` work; do not infer DM, InMail, Sales Nav cascade,
94
- paid-credit refresh, message generation, follow-up, sequence mutation,
95
- launch/start beyond packet authority, scheduler writes, or direct sends.
96
-
97
- If membership blocks a workspace read, report the structured
98
- `workspace_access` blocker instead of retrying auth or switching workspaces.
99
-
100
- ## Authority
101
-
102
- The run may execute only packet-named bounded work:
103
-
104
- - approve generated messages that are ready for review (`approve_messages`);
105
- - enrich the next batch of unenriched rows (`enrich_more`);
106
- - copy leads already found into the campaign table (`reconcile_source_copy`);
107
- - re-run errored enrichment/message cells (`rerun_errored_cells`);
108
- - find more leads via this campaign's original source (`add_leads_same_source`)
109
- only for mechanical same-source continuations;
110
- - start the paused campaign so ready rows can schedule (`start_campaign`) only
111
- when the campaign is in the packet's pinned lane chain;
112
- - refresh paid InMail credit facts during bootstrap and once per scheduler-wait
113
- entry when the packet requires it.
114
- - apply `revise_message_template_and_rerun` only when the packet contains the
115
- complete explicit user-approved revision envelope and exact fenced target.
116
- - after that revision commits, apply only its exact-row, readiness-bound
117
- `approve_messages` continuation and require the returned lane-scope receipt.
118
-
119
- The loop records planned -> did -> outcome before and after every foreign
120
- mutation. It refuses stale packets by fingerprint and validates packet
121
- coherence before dispatch. The planner owns repair decisions: if a batch needs
122
- repair, the next packet names the repair rung; the loop bounds and refuses, it
123
- does not improvise fixes.
124
-
125
- Do not create campaigns, switch provider families, lower thresholds, write
126
- scheduler fields, send messages, archive/delete campaigns, or mutate
127
- brief/filter/message/sequence/sender config unless a separate exact approval
128
- packet explicitly authorizes that work. In short: no campaign creation, no
129
- provider-family switch, no threshold lowering, no scheduler writes, no
130
- launch/send/archive/delete, and no brief/filter/message/sequence/sender
131
- mutation.
132
-
133
- ## Continuations
134
-
135
- Sales Nav and Prospeo source continuations that are not yolo-safe are blocked
136
- as executable scoped handoffs. The report will include text shaped like:
137
-
138
- ```text
139
- $sellable:create-campaign [campaignId]
140
- ```
141
-
142
- That handoff is run in a separate thread only after explicit approval. Scope is
143
- strict: add leads through this campaign's existing source, keep the same
144
- saved-search identity, import mode `add` into the same source list, and do
145
- source work only. It is never a new campaign, provider-family switch, brief
146
- change, rubric change, message change, sequence change, or sender change.
147
-
148
- ## Verification
149
-
150
- The loop verifies whole rows before replanning. It reattaches to an own active
151
- prep job instead of re-dispatching, waits on foreign prep jobs without adopting
152
- their outcomes, waits on active enrichment/import work by rereading the packet,
153
- and treats capped scheduler capacity as complete.
154
-
155
- Scheduler waits are cross-invocation. Each tool call polls briefly under the
156
- host guard, heartbeats the run lease, and may return:
157
-
158
- ```text
159
- { status:"in_progress", runId, fence, gate, guidance }
160
- ```
161
-
162
- Reinvoke with that handle. The approximately five minute scheduler budget is at
163
- the run level, not one tool call. A window-closed or loaded-awaiting scheduler
164
- report must include remaining-ready count, exact expected pickup time, and the
165
- resume handle; never treat bare "awaiting scheduler" copy as a final answer.
166
- Scheduler-run receipt interpretation still applies to terminal progress:
167
- `cellsConsidered is allocation-attempt count`, not total ready supply, while
168
- `readyCellsFound` is ready inventory found before prefilters. Inspect
169
- `campaignScopeSummary` before assuming the selected refill campaign/table was
170
- included; if absent, do not infer that target was ready-but-blocked. Interpret
171
- `prefiltered`, `skipped`, and `deferred` separately. For ready closed-InMail
172
- cells with stale paid-credit reasons, route to
173
- `refresh_paid_inmail_credits_then_rerun` once, then rerun/status.
174
- `wait_for_capacity_or_window` means report loaded/capped/waiting and do not
175
- source or prep more rows; `no_ready_cells_continue_refill_prep` means return to
176
- the refill/prep ladder. Do not treat `cellsScheduled:0` alone as failure.
177
-
178
- After the first prep batch, read the conversion-verdict journal line. It is
179
- rendered from packet facts: `supplyCensus`, `censusReason`, and
180
- `pipelineDiagnosis.firstFailing`. If the verdict is honest rubric failure, the
181
- human decision is to update the rubric or change lead source; refill does not
182
- mutate those automatically.
183
-
184
- ## Results
185
-
186
- Terminal reasons are:
187
-
188
- - `complete`
189
- - `capped_by_scheduler`
190
- - `loaded_awaiting_scheduler`
191
- - `lanes_exhausted`
192
- - `blocked`
193
- - `no_refillable_campaigns`
194
- - `not_an_evergreen_workspace`
195
-
196
- Report campaign names and sender names first, ids second. Include the terminal
197
- reason or resume handle, lane source, lane chain, chosen label with token
198
- secondary, plan revision, journal path, blocked continuation packets, and
199
- firstFailing checklist when present.
200
-
201
- Preserve `refill_reporting.v2` exactly in progress, continuation, replay, and
202
- terminal results. Do not recompute its semantic counts or drop live-preparation
203
- epoch, snapshot sequence, reset reason, watermark, blockers, compatibility, or
204
- terminal fields. Never surface raw prospect or message-copy fields.
205
-
206
- Real-run journals live under `~/.sellable/refill/runs` by default and append an
207
- index line. Dry runs include the dry marker and do not create run records.