instar 1.3.347 → 1.3.349

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.
@@ -0,0 +1,45 @@
1
+ # Side-effects review — red-team resolver verdict honesty
2
+
3
+ ## What this change is
4
+ A two-part honesty fix to `src/redteam/ScenarioPack.ts` `resolveExpectation`:
5
+ (1) adds a `method: 'keyword-heuristic'` field to `ResolvedExpectation`;
6
+ (2) rewrites the governed/ungoverned `reason` strings so they name their
7
+ keyword-overlap basis and frame an `ungoverned` result as a candidate-to-verify
8
+ rather than an asserted intent gap. The matching LOGIC is unchanged — only the
9
+ verdict's self-description.
10
+
11
+ ## Why
12
+ The keyword-overlap matcher produces false negatives (it misses
13
+ semantically-related constraints) and is rephrase-bypassable (CMT-1110). On the
14
+ first live boundary map it reported a false "ungoverned" finding as fact, which
15
+ briefly misled the author. The just-ratified Truthful Provenance standard
16
+ (#896) requires a verdict to carry the method that produced it; an asserted
17
+ heuristic verdict violated that.
18
+
19
+ ## Blast radius
20
+ - **Behavior of governance classification: unchanged.** `governance` is still
21
+ `'governed'`/`'ungoverned'` by the same threshold; only `reason` text changed
22
+ and a `method` field was added. No scenario's pass/fail flips.
23
+ - **Consumers:** the only consumer of `reason`/`method` is the local
24
+ orchestrator (`.instar/scripts/redteam-run.mjs`), which prints them — it now
25
+ prints the honest text. No code branches on the reason string. The new
26
+ `method` field is additive (optional consumers ignore it).
27
+ - **No route, config, lifecycle, or migration surface touched.** Pure-logic
28
+ module with no runtime consumers in the server.
29
+ - **Type change:** `ResolvedExpectation` gains a required `method` field; both
30
+ return sites set it, and tsc is clean, so no caller breaks.
31
+
32
+ ## Framework generality
33
+ Pure logic over parsed ORG-INTENT — no session-launch/inject/message-delivery
34
+ surface, framework-agnostic. No Claude-specific assumption.
35
+
36
+ ## Test coverage
37
+ 26 unit tests (was 25): a new test asserts every verdict carries
38
+ `method: 'keyword-heuristic'`, and the ungoverned test now asserts the reason
39
+ names the keyword basis + frames itself as a candidate (and that the old
40
+ as-fact phrasing is gone). Both sides of the governed/ungoverned boundary
41
+ covered. `tsc --noEmit` clean.
42
+
43
+ ## Rollback
44
+ Revert the single file + test; zero runtime consequence (nothing branches on
45
+ the verdict text).