@pome-sh/cli 0.27.0 → 0.28.0

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "pome-sh",
3
- "version": "0.27.0",
4
- "git_sha": "112e066d008ebf62c5dc1176f39c87798d1c299b",
5
- "build_time": "2026-08-26T18:46:48.367Z"
3
+ "version": "0.28.0",
4
+ "git_sha": "fe45f413881e8c19ab370dd63e03fbf118ac8edb",
5
+ "build_time": "2026-08-26T19:10:23.010Z"
6
6
  }
@@ -1,6 +1,6 @@
1
- import { findManifestPath, readManifest } from './chunk-CXGMLUZ4.js';
1
+ import { findManifestPath, readManifest } from './chunk-QOMNBXMQ.js';
2
2
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
3
- import './chunk-BZO3YCJS.js';
3
+ import './chunk-D5PXUPG4.js';
4
4
  import { buildEgressAllowlist } from './chunk-CBFKZZBR.js';
5
5
  import './chunk-6KJC4BTO.js';
6
6
  import './chunk-SG6ZTIMT.js';
@@ -1,7 +1,7 @@
1
1
  import { gmailSeedSchema, defaultSeedState } from './chunk-3T5XN64P.js';
2
2
  import { linearSeedSchema, defaultSeedState as defaultSeedState$1 } from './chunk-G6GOCYIT.js';
3
3
  import { isTwinName, TWIN_REGISTRY } from './chunk-JE4H5ODK.js';
4
- import { criterionSchema, finalizeResponseSchema, HostedDiscardRefusedError, HostedOrchError, HostedAuthError, HostedQuotaError, submitResultResponseSchema, createEvalSessionResponseSchema, createSessionResponseSchema, sessionPublicSchema } from './chunk-BZO3YCJS.js';
4
+ import { criterionSchema, finalizeResponseSchema, HostedDiscardRefusedError, HostedOrchError, HostedAuthError, HostedQuotaError, submitResultResponseSchema, createEvalSessionResponseSchema, createSessionResponseSchema, sessionPublicSchema } from './chunk-D5PXUPG4.js';
5
5
  import { seedSchema, parseSeed, defaultSeedState as defaultSeedState$2 } from './chunk-HJX25USP.js';
6
6
  import { toTwinHttpEventRow } from './chunk-E665XWYU.js';
7
7
  import { redactEvent, redactSecrets } from './chunk-SG6ZTIMT.js';
@@ -1255,6 +1255,8 @@ function normalizeAgentSdk(value) {
1255
1255
 
1256
1256
  // ../packages/wire/dist/run-completeness.js
1257
1257
  var PRE_SATISFIED_REASON = "already_true_in_seed";
1258
+ var ADVISORY_SCORE_STATE = "advisory";
1259
+ var ABSTAINED_SCORE_STATE = "abstained";
1258
1260
 
1259
1261
  // src/hosted/evalResultView.ts
1260
1262
  function outcomeOf(result) {
@@ -1265,6 +1267,9 @@ function outcomeOf(result) {
1265
1267
  function isPreSatisfied(result) {
1266
1268
  return result.skipped && result.reason === PRE_SATISFIED_REASON;
1267
1269
  }
1270
+ function isNarrated(result) {
1271
+ return result.skipped && (result.score_state === ADVISORY_SCORE_STATE || result.score_state === ABSTAINED_SCORE_STATE);
1272
+ }
1268
1273
  function scoreStatus(score, passThreshold) {
1269
1274
  if (!score.evaluated || !score.can_pass) return "incomplete";
1270
1275
  return score.satisfaction >= passThreshold ? "pass" : "fail";
@@ -1296,12 +1301,16 @@ function criteriaWord(n) {
1296
1301
  }
1297
1302
  function evaluationCounts(score) {
1298
1303
  const evaluated = score.total_required;
1299
- const notEvaluated = score.skipped + score.errored - score.preSatisfied;
1304
+ const exempt = score.preSatisfied + score.advisory + score.abstained;
1305
+ const notEvaluated = score.skipped + score.errored - exempt;
1300
1306
  return {
1301
1307
  evaluated,
1302
1308
  notEvaluated,
1303
1309
  preSatisfied: score.preSatisfied,
1304
- total: evaluated + notEvaluated + score.preSatisfied
1310
+ // `total` counts every exemption, not just `preSatisfied`, so it still
1311
+ // names every criterion the run recorded — the reason `outcomeOf` keeps
1312
+ // narrator rows inside `skipped` rather than returning their state raw.
1313
+ total: evaluated + notEvaluated + exempt
1305
1314
  };
1306
1315
  }
1307
1316
  function scoreCountsSummary(score) {
@@ -1486,8 +1495,14 @@ function scoreFromFinalizeResponse(finalized) {
1486
1495
  const preSatisfied = results.filter(
1487
1496
  (r) => outcomeOf(r) === "skipped" && isPreSatisfied(r)
1488
1497
  ).length;
1498
+ const advisory = results.filter(
1499
+ (r) => isNarrated(r) && !isPreSatisfied(r) && r.score_state === ADVISORY_SCORE_STATE
1500
+ ).length;
1501
+ const abstained = results.filter(
1502
+ (r) => isNarrated(r) && !isPreSatisfied(r) && r.score_state === ABSTAINED_SCORE_STATE
1503
+ ).length;
1489
1504
  const totalRequired = passed + failed;
1490
- const unresolvedAbstentions = skipped - preSatisfied + errored;
1505
+ const unresolvedAbstentions = skipped - preSatisfied - advisory - abstained + errored;
1491
1506
  return {
1492
1507
  satisfaction: finalized.score,
1493
1508
  passed,
@@ -1495,6 +1510,8 @@ function scoreFromFinalizeResponse(finalized) {
1495
1510
  skipped,
1496
1511
  errored,
1497
1512
  preSatisfied,
1513
+ advisory,
1514
+ abstained,
1498
1515
  total_required: totalRequired,
1499
1516
  evaluated: hasCriteriaResults ? totalRequired > 0 : true,
1500
1517
  can_pass: hasCriteriaResults ? totalRequired > 0 && unresolvedAbstentions === 0 : true,
@@ -91,8 +91,40 @@ var baseCriterionResultSchema = z.object({
91
91
  passed: z.boolean(),
92
92
  skipped: z.boolean(),
93
93
  // true if [code] fell back to [model] but the judge was unreachable, etc.
94
- reason: z.string()
94
+ reason: z.string(),
95
95
  // human-readable evidence
96
+ // Why this row is out of the denominator, when `skipped` alone is too coarse.
97
+ // The two values that carry meaning here are `ADVISORY_SCORE_STATE` and
98
+ // `ABSTAINED_SCORE_STATE` (`@pome-sh/wire/run-completeness`), which the
99
+ // narrator stamps on a `[model]` row it read but had no authority to score.
100
+ //
101
+ // NOT NAMED `outcome`: `hosted/evalResultView.ts`'s display model has
102
+ // reserved that key on this same object for a disjoint vocabulary
103
+ // (`passed | failed | skipped | errored`) since long before the narrator, and
104
+ // reserved it for the CLOUD to fill. A cloud writing `advisory` into it would
105
+ // hand `outcomeOf` a value outside its own union and render an advisory row
106
+ // with the skipped glyph.
107
+ //
108
+ // ON THE BASE AND NOT ON ONE ARM, for the mirror image of the reason the arm
109
+ // order below is what it is: an advisory row carries no `confidence` /
110
+ // `judge_model`, so it fails the probabilistic arm and lands on the
111
+ // DETERMINISTIC one — whose `.extend({})` is a plain `z.object` and would
112
+ // strip an unknown key. Declared on one arm, the state would be discarded
113
+ // before any consumer could read it, and the run would keep reading
114
+ // INCOMPLETE with the exemption sitting there correct and dead.
115
+ //
116
+ // `z.string()` AND NOT THE CLOSED ENUM pome-cloud declares for the same
117
+ // field, because the two sides of it have opposite jobs. pome-cloud PRODUCES
118
+ // it and validates what it serves; the CLI CONSUMES it, and
119
+ // `finalizeResponseSchema` is deliberately a tolerant reader (its own comment
120
+ // says so: cloud may emit additive keys "that older/newer CLIs strip rather
121
+ // than reject"). A closed enum here would turn a cloud that adds a third
122
+ // score state into a hard parse failure of the ENTIRE /finalize response —
123
+ // an unreadable run instead of an unrecognised field. The closed vocabulary
124
+ // is applied by the PREDICATE that reads it (`isNarrated`), exactly as
125
+ // `reason` is a plain string and `PRE_SATISFIED_REASON` is a comparison, so
126
+ // an unrecognised spelling is not exempted from anything.
127
+ score_state: z.string().optional()
96
128
  });
97
129
  var deterministicCriterionResultSchema = baseCriterionResultSchema.extend({
98
130
  // [code] adds nothing further; criterion.type === "code" identifies it.
@@ -1,6 +1,6 @@
1
- import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-CTA54N4K.js';
2
- import { readManifest, normalizeManifestTwins } from './chunk-CXGMLUZ4.js';
3
- import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema } from './chunk-BZO3YCJS.js';
1
+ import { createHostedClient, perTwinReturnedByCloud, parseTaskFile, runAgentCommand, writeRunArtifactsCore, toTwinHttpEvent, redactJsonl, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, evaluationCounts } from './chunk-CWNRE2OU.js';
2
+ import { readManifest, normalizeManifestTwins } from './chunk-QOMNBXMQ.js';
3
+ import { MOUNTED_TWINS, HostedAuthError, HostedDiscardRefusedError, HostedQuotaError, HostedOrchError, HostedTrialError, agentResponseSchema } from './chunk-D5PXUPG4.js';
4
4
  import { redactSecrets, redactEvent } from './chunk-SG6ZTIMT.js';
5
5
  import { randomUUID, createHash } from 'node:crypto';
6
6
  import { rm, readFile, stat, mkdir, writeFile, chmod, mkdtemp, readdir, rename } from 'node:fs/promises';
@@ -1,4 +1,4 @@
1
- import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-CTA54N4K.js';
1
+ import { parseTaskFile, seedStateForTwin, runAgentCommand, writeRunArtifactsCore } from './chunk-CWNRE2OU.js';
2
2
  import { createRecorder, bootTwin } from './chunk-IK2F7ZA3.js';
3
3
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
4
4
  import { buildEgressAllowlist, readBlockedEgress } from './chunk-CBFKZZBR.js';
@@ -1,4 +1,4 @@
1
- import { HostedOrchError, manifestSchema, deriveAgentSlug, SLUG_RE } from './chunk-BZO3YCJS.js';
1
+ import { HostedOrchError, manifestSchema, deriveAgentSlug, SLUG_RE } from './chunk-D5PXUPG4.js';
2
2
  import { readFile, writeFile } from 'node:fs/promises';
3
3
  import { resolve, join, dirname } from 'node:path';
4
4
  import { stringify, parse } from 'yaml';
@@ -1,14 +1,14 @@
1
1
  import { newGroupId, reassuranceBox, twinReadyLine, trialsHeaderLine, trialLine, summaryLines, evaluatingLine, criterionPhrase } from './chunk-RGZBC7NF.js';
2
2
  import { DemoCapacityError, capacityLabel, parseCapacityMarker, capacityKindFrom } from './chunk-ZX4WNSZ5.js';
3
- import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-N74LP4QH.js';
4
- import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-CTA54N4K.js';
3
+ import { runTask, demoTaskPath, DEMO_TASK_NAME, DEMO_REPO } from './chunk-MOZU3NOM.js';
4
+ import { createHostedClient, parseTaskFile, uploadRunBlobs, scoreFromFinalizeResponse, scoreStatus, outcomeOf } from './chunk-CWNRE2OU.js';
5
5
  import './chunk-NW7HGA2K.js';
6
6
  import './chunk-3T5XN64P.js';
7
7
  import './chunk-G6GOCYIT.js';
8
8
  import { bootTwin } from './chunk-IK2F7ZA3.js';
9
9
  import './chunk-JE4H5ODK.js';
10
10
  import { getAvailablePort } from './chunk-XDU6TD4O.js';
11
- import { HostedQuotaError, HostedOrchError } from './chunk-BZO3YCJS.js';
11
+ import { HostedQuotaError, HostedOrchError } from './chunk-D5PXUPG4.js';
12
12
  import './chunk-CBFKZZBR.js';
13
13
  import './chunk-HJX25USP.js';
14
14
  import './chunk-E665XWYU.js';
@@ -1,12 +1,12 @@
1
1
  import { newGroupId, criterionPhrase } from './chunk-RGZBC7NF.js';
2
- import { runTaskHosted, resolveRunAgentIdentity } from './chunk-MQE6DKIK.js';
3
- import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-CTA54N4K.js';
2
+ import { runTaskHosted, resolveRunAgentIdentity } from './chunk-JW3DHRNX.js';
3
+ import { createHostedClient, parseTaskFile, outcomeOf } from './chunk-CWNRE2OU.js';
4
4
  import './chunk-NW7HGA2K.js';
5
5
  import './chunk-3T5XN64P.js';
6
6
  import './chunk-G6GOCYIT.js';
7
7
  import './chunk-JE4H5ODK.js';
8
- import './chunk-CXGMLUZ4.js';
9
- import { HostedQuotaError, HostedTrialError } from './chunk-BZO3YCJS.js';
8
+ import './chunk-QOMNBXMQ.js';
9
+ import { HostedQuotaError, HostedTrialError } from './chunk-D5PXUPG4.js';
10
10
  import './chunk-HJX25USP.js';
11
11
  import './chunk-E665XWYU.js';
12
12
  import './chunk-6KJC4BTO.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, SESSION_TWIN_NAMES, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-MQE6DKIK.js';
3
- import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-N74LP4QH.js';
4
- import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-CTA54N4K.js';
2
+ import { DEFAULT_CONTROL_PLANE_URL, DEFAULT_DASHBOARD_URL, clearLocalCredentials, friendlyHostedError, SESSION_TWIN_NAMES, runSessionCreate, runSessionList, runSessionStop, resolveCredentials, runTaskHosted, discoverRunSet, VERDICT_ARTIFACT_VERSION, persistCredentialsAfterLogin, DEFAULT_DOCS_SITE_ORIGIN, resolveSeams, resolveCachedAgentId, readLinkCache, postAgentResolver, writeLinkCache, ensurePomeGitignored } from '../../chunk-JW3DHRNX.js';
3
+ import { assetPath, runTask, resolvePackageRoot, DEMO_TASK_NAME, demoTaskPath } from '../../chunk-MOZU3NOM.js';
4
+ import { parseTaskFile, scoreStatus, runScoreLine, readLatestRun, readMetaSummary, outcomeOf, readConfigTwins, scoreCountsSummary, markerFor, criterionMarkerLabel, twinSkipSuffix, readCodeCriteria, createHostedClient, toTwinHttpEvent, redactJsonl, scoreFromFinalizeResponse, parseGitHubSeedState, uploadRunBlobs, isPreSatisfied } from '../../chunk-CWNRE2OU.js';
5
5
  import '../../chunk-NW7HGA2K.js';
6
6
  import { GMAIL_CHECKS } from '../../chunk-JM6VS62R.js';
7
7
  import '../../chunk-3T5XN64P.js';
@@ -9,9 +9,9 @@ import { LINEAR_CHECKS } from '../../chunk-XBT6ZLBG.js';
9
9
  import '../../chunk-G6GOCYIT.js';
10
10
  import '../../chunk-IK2F7ZA3.js';
11
11
  import { TWIN_NAME_LIST, isTwinName, createGitHubSmokeApp } from '../../chunk-JE4H5ODK.js';
12
- import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-CXGMLUZ4.js';
12
+ import { readManifest, writeManifest, MANIFEST_JSON, readRequiredManifest, normalizeManifestTwins } from '../../chunk-QOMNBXMQ.js';
13
13
  import '../../chunk-XDU6TD4O.js';
14
- import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-BZO3YCJS.js';
14
+ import { MOUNTED_TWINS, deriveAgentSlug, exitCodeFor, HostedUsageError, HostedOrchError, HostedAuthError, HostedQuotaError } from '../../chunk-D5PXUPG4.js';
15
15
  import '../../chunk-CBFKZZBR.js';
16
16
  import { TAPE_ASSERTABLE_TOOLS } from '../../chunk-C4BVTUA3.js';
17
17
  import { seedSchema } from '../../chunk-HJX25USP.js';
@@ -4652,7 +4652,7 @@ var DEFAULT_AGENT_COMMAND = `node ${DEFAULT_AGENT_FILE}`;
4652
4652
  var MANIFEST_SCHEMA_URL = "https://pome.sh/schemas/v1/pome.json";
4653
4653
  var MAX_UNREADABLE_PATHS_SHOWN = 5;
4654
4654
  function readPackageVersion() {
4655
- if ("0.27.0".length > 0) return "0.27.0";
4655
+ if ("0.28.0".length > 0) return "0.28.0";
4656
4656
  try {
4657
4657
  const here = dirname(fileURLToPath(import.meta.url));
4658
4658
  const candidates = [
@@ -5103,7 +5103,7 @@ function createProgram() {
5103
5103
  return;
5104
5104
  }
5105
5105
  {
5106
- const { runDoctorChecks } = await import('../../checks-QM7QOJ6U.js');
5106
+ const { runDoctorChecks } = await import('../../checks-XPLJ2MKP.js');
5107
5107
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5108
5108
  const doctorReport = await runDoctorChecks({ mode: useLocal ? "full" : "hosted" });
5109
5109
  if (!doctorReport.ok) {
@@ -5141,7 +5141,7 @@ function createProgram() {
5141
5141
  taskForRuns.config.runs
5142
5142
  );
5143
5143
  if (k > 1) {
5144
- const { runTrialGroup } = await import('../../runTrialGroup-V3HB57YI.js');
5144
+ const { runTrialGroup } = await import('../../runTrialGroup-TPDWP2LN.js');
5145
5145
  const fileForRerun = relative(process.cwd(), file);
5146
5146
  const rerunCommand = defaultTask ? options.trials !== void 0 ? `pome run -n ${k}` : "pome run" : `pome run ${fileForRerun && !fileForRerun.startsWith("..") ? fileForRerun : file} -n ${k}`;
5147
5147
  const groupResult = await runTrialGroup({
@@ -5235,7 +5235,7 @@ function createProgram() {
5235
5235
  process.exitCode = 5;
5236
5236
  return;
5237
5237
  }
5238
- const { runDemo } = await import('../../runDemo-O67ASC54.js');
5238
+ const { runDemo } = await import('../../runDemo-YY5F6FP2.js');
5239
5239
  const result = await runDemo({
5240
5240
  apiBase: opts.apiUrl.replace(/\/$/, ""),
5241
5241
  dashboardBase: process.env.POME_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL,
@@ -5253,7 +5253,7 @@ function createProgram() {
5253
5253
  program.command("doctor").description(
5254
5254
  "Check the agent\u2194twin wiring: pome.json (or pome.yaml) present + valid, the local twin boots + serves, requests routed to the twin (not a hardcoded production host), egress floor active. On failure prints one named cause (file:line where knowable) + one concrete fix and exits non-zero."
5255
5255
  ).action(async () => {
5256
- const { runDoctorChecks } = await import('../../checks-QM7QOJ6U.js');
5256
+ const { runDoctorChecks } = await import('../../checks-XPLJ2MKP.js');
5257
5257
  const { renderDoctorReport } = await import('../../render-ZQQ4UMNO.js');
5258
5258
  const report = await runDoctorChecks();
5259
5259
  for (const line of renderDoctorReport(report, { passNote: true })) console.error(line);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "Digital-twin testing for AI agents \u2014 run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",