instar 1.3.927 → 1.3.928

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.927",
3
+ "version": "1.3.928",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_doc": "Content-free INSTAR-Bench predictions mirror (benchmark-divergence-detector FD1). Counts, not just rates, so the prediction carries its own sampling uncertainty. Regenerate by re-running the battery against the CURRENT prompt templates and re-stamping benchedPromptHash.",
3
- "capturedAt": "2026-07-23T22:30:00.000Z",
3
+ "capturedAt": "2026-07-24T01:20:00.000Z",
4
4
  "tasks": {
5
5
  "tone-gate": {
6
6
  "perModel": {
@@ -28,6 +28,30 @@
28
28
  "benchedPromptSource": "src/core/MessagingToneGate.ts:TONE_GATE_PROMPT_TEMPLATE",
29
29
  "benchedPromptHash": "4ae0cf6b02663c21a695393727bd05662334f0d8f1a9d3e45d8d9b2141208d54",
30
30
  "capturedAt": "2026-07-23T22:30:00.000Z"
31
+ },
32
+ "zombie-classify": {
33
+ "perModel": {
34
+ "gpt-5.5": {
35
+ "passRate": 0.9,
36
+ "passes": 9,
37
+ "deterministic": 10
38
+ },
39
+ "gpt-5.4-mini": {
40
+ "passRate": 0.9,
41
+ "passes": 9,
42
+ "deterministic": 10
43
+ },
44
+ "gemini-2.5-flash": {
45
+ "passRate": 0.8333,
46
+ "passes": 5,
47
+ "deterministic": 6
48
+ }
49
+ },
50
+ "benchedPromptSource": "src/monitoring/ExternalHogClassifierPrompt.ts:EXTERNAL_HOG_CLASSIFIER_PROMPT_TEMPLATE",
51
+ "benchedPromptHash": "98b026dbe3ee48cab1403ef24218e9e24f6ea2b3d598c23e383bed4e894cbb56",
52
+ "capturedAt": "2026-07-24T01:20:00.000Z",
53
+ "scoredPopulation": "production-candidate only (10 of 17 cases). Excluded by design: 4 floor-excluded (never allowlist-matched, so no model is ever consulted about them), 1 invalid-unwinnable (renders byte-identical to another case with the opposite expected answer — a prompt defect, see ACT-1212), 2 contested-expectation (the models made the better argument and the expectation was withdrawn). Excluded cases are retained in the task file as evidence, not deleted.",
54
+ "note": "gemini-2.5-flash n=6 not 10: four calls errored during the run, and the shortfall is recorded rather than papered over — the detector is noise-aware and should treat this prediction as correspondingly weak."
31
55
  }
32
56
  }
33
57
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-07-24T01:38:30.603Z",
5
- "instarVersion": "1.3.927",
4
+ "generatedAt": "2026-07-24T04:02:28.049Z",
5
+ "instarVersion": "1.3.928",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -0,0 +1,38 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ The benchmark predictions mirror now carries a `zombie-classify` entry, so the Benchmark-Divergence Detector has something to compare against for the second of its two enrolled decision points. It had been reporting `precondition-failed` for that pair since enrollment — correctly, since no baseline existed. Half the enrolled surface was measuring nothing.
9
+
10
+ ## What to Tell Your User
11
+
12
+ Nothing to do. This is internal measurement plumbing — the detector is observe-only, dev-gated, dark on the fleet, and gates nothing.
13
+
14
+ ## Summary of New Capabilities
15
+
16
+ - `GET /benchmark-divergence` can now produce a real verdict for the external-hog kill/leave classifier instead of a standing `precondition-failed`.
17
+
18
+ ## Evidence
19
+
20
+ The baseline could not simply be re-run, because the existing case set was not testing the live decision.
21
+
22
+ **Prompt drift, and a shape change.** The benched template was 2029 chars against a live prompt of 1373. The old cases fed the model `pid`, `parentPid`, `cpuPercent` and `elapsed`. The live prompt carries seven derived booleans plus the matched allowlist class, and deliberately withholds the identity tuple — the model does not need it, and omitting it denies an injection payload a concrete target to name in its logged reason.
23
+
24
+ **Population mismatch.** Only an allowlist-matched candidate ever reaches a model: `identityFor` returns null otherwise and the scan tick surfaces the process without classifying it. Four of the eight original cases describe processes no model is ever consulted about.
25
+
26
+ The boundary is the allowlist match **alone**, not the whole floor — an easy thing to get wrong, and it was gotten wrong once during this work. `evaluateKillFloor` runs separately, and a kill requires `floor.permitted && verdict === 'kill'`. A candidate the floor will veto is still a real question put to a real model, and its answer still worth grading. Reading floor-veto as "never asked" would have silently deleted three legitimate cases.
27
+
28
+ **Two findings from the rebuilt set:**
29
+
30
+ One case is unpassable by construction. `buildClassifierPrompt` renders every boolean with `=== true`, so an *unknown* owner state and a *known-false* owner state both print `owner_app_running: false`. Two cases carrying opposite expected answers render byte-for-byte identical prompts. That is a defect in the prompt, not the models — logged as ACT-1212. It is harmless today: the floor vetoes an unknown required field outright (`field-unknown:ownerAppRunning`), so the model's answer there is never enacted. Which is precisely why it would never surface from outcomes.
31
+
32
+ All three models tested, across two families, recommend `kill` on a case whose fact block states plainly `sustained_high_cpu: false`. Also not enactable — the floor hard-vetoes on that exact fact. Also invisible from outcomes alone.
33
+
34
+ **Scored population** is the 10 `production-candidate` cases. Excluded and retained in the task file as evidence rather than deleted: 4 `floor-excluded` (no model consulted), 1 `invalid-unwinnable` (above), and 2 `contested-expectation` — cases authored expecting `leave` for argv describing work in flight, where every model answered `kill` and had the better argument, since reaching a kill requires an orphaned owner and a language server indexing for a closed editor is burning cores on results nobody will collect. Those expectations were withdrawn rather than scored; encoding them would have published a confident and false claim about model behaviour.
35
+
36
+ `gemini-2.5-flash` records `n=6` rather than 10 because four calls errored. Stamped as 6 rather than padded — the detector's noise-awareness only protects anything if the sample size it is given is true.
37
+
38
+ **Not changed:** the classifier prompt itself. Fixing the unknown-vs-false flattening alters the prompt hash and invalidates this baseline, so it belongs in its own gated change with its own re-stamp, not bundled here.