skalpel 4.0.32 → 4.0.34

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.
Files changed (3) hide show
  1. package/card.mjs +7 -4
  2. package/install.mjs +2 -3
  3. package/package.json +1 -1
package/card.mjs CHANGED
@@ -66,7 +66,10 @@ export function isGenuineCatch(row) {
66
66
  const failed = row.outcome === "GENUINE_FAIL" || row.pass_fail === "FAIL";
67
67
  // A real catch must carry the two things the card indicts the agent with: what it claimed, and the
68
68
  // proof that contradicts it. A row missing either can't be rendered honestly, so it isn't a catch.
69
- return failed && !!row.proof_command && !!row.claim_text;
69
+ // Ship-status catches (category:"ship", outcome SHIP_FAIL) record the check under probe_command, not
70
+ // proof_command — accept either so a genuine "you said deployed, it's 404" catch is not invisible.
71
+ const command = row.proof_command || row.probe_command;
72
+ return failed && !!command && !!row.claim_text;
70
73
  }
71
74
 
72
75
  // readCatches() → all genuine-catch rows in the shadow log, oldest→newest as written. Fail-open: any
@@ -147,7 +150,7 @@ function stamp(ts) {
147
150
  // ---------- (3a) plain-text card (no ANSI — the shareable artifact) ----------
148
151
  export function renderPlainCard(row) {
149
152
  const claim = clean(row.claim_text, 200) || "it's done";
150
- const proof = clean(row.proof_command, 200) || "its own proof";
153
+ const proof = clean(row.proof_command || row.probe_command, 200) || "its own proof";
151
154
  const evidence = clean(row.evidence, 200);
152
155
  const L = [];
153
156
  L.push("🔬 skalpel — verified catch");
@@ -172,7 +175,7 @@ export function renderPlainCard(row) {
172
175
  // ---------- (3b) markdown card (Slack / PR / X) ----------
173
176
  export function renderMarkdownCard(row) {
174
177
  const claim = clean(row.claim_text, 200) || "it's done";
175
- const proof = clean(row.proof_command, 200) || "its own proof";
178
+ const proof = clean(row.proof_command || row.probe_command, 200) || "its own proof";
176
179
  const evidence = clean(row.evidence, 200);
177
180
  const FENCE = "```";
178
181
  const L = [];
@@ -198,7 +201,7 @@ export function renderMarkdownCard(row) {
198
201
  // ---------- (3c) styled terminal card ----------
199
202
  function renderTerminalCard(row) {
200
203
  const claim = clean(row.claim_text, 200) || "it's done";
201
- const proof = clean(row.proof_command, 200) || "its own proof";
204
+ const proof = clean(row.proof_command || row.probe_command, 200) || "its own proof";
202
205
  const evidence = clean(row.evidence, 180);
203
206
  const L = [];
204
207
  L.push("");
package/install.mjs CHANGED
@@ -54,14 +54,13 @@ function stageHookRuntime() {
54
54
  // a hook entrypoint staged without a module it imports — the exact 0.3.12–0.3.16 bug shape.
55
55
  copyFileSync(join(PKG_DIR, "insights.mjs"), join(HOOKS_DIR, "insights.mjs")); // hooks import ./insights.mjs
56
56
  copyFileSync(join(PKG_DIR, "reveal.mjs"), join(HOOKS_DIR, "reveal.mjs")); // both hooks import ./reveal.mjs
57
- copyFileSync(join(PKG_DIR, "transcript.mjs"), join(HOOKS_DIR, "transcript.mjs")); // skalpel-hook.mjs + skalpel-statusline.mjs import ./transcript.mjs (tailLines)
57
+ copyFileSync(join(PKG_DIR, "transcript.mjs"), join(HOOKS_DIR, "transcript.mjs")); // skalpel-hook + skalpel-statusline + verify-shadow + anchor-shadow import ./transcript.mjs (tailLines)
58
58
  copyFileSync(join(PKG_DIR, "skalpel-hook.mjs"), HOOK_FILE);
59
- copyFileSync(join(PKG_DIR, "transcript.mjs"), join(HOOKS_DIR, "transcript.mjs")); // skalpel-hook imports ./transcript.mjs (tailLines)
60
59
  copyFileSync(join(PKG_DIR, "skalpel-hook-session.mjs"), SESSION_FILE);
61
60
  copyFileSync(join(PKG_DIR, "incremental-ingest.mjs"), join(HOOKS_DIR, "incremental-ingest.mjs"));
62
61
  copyFileSync(join(PKG_DIR, "skalpel-hook-session-end.mjs"), SESSION_END_FILE);
63
62
  copyFileSync(join(PKG_DIR, "skalpel-statusline.mjs"), STATUSLINE_FILE);
64
- copyFileSync(join(PKG_DIR, "transcript.mjs"), join(HOOKS_DIR, "transcript.mjs")); // hooks import ./transcript.mjs (bounded tail read)
63
+ copyFileSync(join(PKG_DIR, "anchor-shadow.mjs"), join(HOOKS_DIR, "anchor-shadow.mjs")); // verify-shadow.mjs (staged worker) imports ./anchor-shadow.mjs probe primitives; staged BEFORE verify-shadow.mjs
65
64
  copyFileSync(join(PKG_DIR, "verify-shadow.mjs"), join(HOOKS_DIR, "verify-shadow.mjs")); // claim-verification SHADOW worker (spawned by skalpel-hook.mjs)
66
65
  copyFileSync(join(PKG_DIR, "auth.mjs"), join(HOOKS_DIR, "auth.mjs")); // hooks import ./auth.mjs
67
66
  copyFileSync(join(PKG_DIR, "metrics.mjs"), join(HOOKS_DIR, "metrics.mjs")); // hooks import ./metrics.mjs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skalpel",
3
- "version": "4.0.32",
3
+ "version": "4.0.34",
4
4
  "description": "Behavioral graph for AI-assisted coding — learns how you work and steers Claude Code + Codex in real time.",
5
5
  "type": "module",
6
6
  "bin": {