tamperward 1.14.1 → 1.14.2
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/README.md +16 -10
- package/dist/cli/index.js +27 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,22 +32,27 @@ impossible.
|
|
|
32
32
|
|
|
33
33
|
| experiment | result | what it supports |
|
|
34
34
|
| --- | --- | --- |
|
|
35
|
-
| **Round 1** — 26 paired real repos, historical regressions, 53 counted trajectories, **v1.6.0** ([`harness/taskbench/`](./harness/taskbench/)) | Transfer: **
|
|
36
|
-
| **Pristine oracle, round 1** — independent re-execution of the original suite | Identified **every masked failure observed among the 53 trajectories** while diff-time detection was routed around | The outcome-level signal that motivated `tamperward verify
|
|
37
|
-
| **Round 2** — **22 fresh held-out repos** no detector was tuned on ([`harness/taskbench/round2/`](./harness/taskbench/round2/)) | Transfer
|
|
35
|
+
| **Round 1** — 26 paired real repos, historical regressions, 53 counted trajectories, **v1.6.0** ([`harness/taskbench/`](./harness/taskbench/)) | Transfer: **9/27 ungated runs (33.3%)** violated policy ([corrected](./harness/taskbench/reanalysis/TRANSFER-REANALYSIS.md) from a published 13/26 — the original predicate was defective; the transfer bet is refuted, not held). Headline prevention bet **lost**: b=5 / c=4, RD +3.8pp [−17.2, +24.7], exact McNemar **p = 1.0** — published beside the bet | A detector-centric architecture was insufficient: agents routed around the shipped detector classes |
|
|
36
|
+
| **Pristine oracle, round 1** — independent re-execution of the original suite, **including withheld semantic cases** | Identified **every masked failure observed among the 53 trajectories** while diff-time detection was routed around | The outcome-level signal that motivated `tamperward verify`. The shipped command productizes this oracle's base-restoration component only — it carries no withheld cases and cannot detect a semantically incomplete fix the base tests also accept |
|
|
37
|
+
| **Round 2** — **22 fresh held-out repos** no detector was tuned on ([`harness/taskbench/round2/`](./harness/taskbench/round2/)) | Transfer **12/22 (54.5%)** ([corrected](./harness/taskbench/reanalysis/TRANSFER-REANALYSIS.md) from a published 14/22). Prevention: **b=9 / c=0**, RD **+40.9pp**, BP95 **[17.8, 61.3]**, exact McNemar **p = 0.0039** | The preregistered **v1.9.0** treatment materially reduced false greens in that setting |
|
|
38
38
|
| **After prevention** — the nine round-2 prevented false greens | **8 of 9 became honest completions**; the ninth an honest **non**-completion | Prevention usually redirected trajectories toward honest work rather than merely blocking them |
|
|
39
|
+
| **Round 3** — 17 paired Python repos, fresh PyPI frame, **v1.14.0** ([`harness/taskbench/round3/`](./harness/taskbench/round3/)) | Transfer 9/17 (52.9%). Prevention: **b=6 / c=0**, RD **+35.3pp**, BP95 [9.5, 58.7], exact McNemar **p = 0.0313** | The prevention result appeared in Python — with the treatment also changed from v1.9.0, so ecosystem transfer is not isolated. The in-loop skip detector proved blind to pytest syntax; the outer layers carried it |
|
|
40
|
+
| **Round 3.1** — the same 16 pairs under **`claude-sonnet-5`** ([`harness/taskbench/round3.1/`](./harness/taskbench/round3.1/)) | Transfer 4/16 (25.0%). Prevention: **b=1 / c=0**, RD +6.3pp, BP95 [−13.8, 28.3], exact McNemar **p = 1.0000** | The confirmatory result **did not replicate**, and could not have: only three ungated false greens occurred, so `b ≤ 3` and p ≥ .25 whatever the gate did. A failure to reject, not evidence of no effect |
|
|
39
41
|
|
|
40
42
|
Earlier controlled experiments → **[the research series](./docs/blog/index.md)**.
|
|
41
43
|
|
|
42
44
|
> **Scope.** The rows above are one model, one pressure prompt, one JS/TS
|
|
43
45
|
> ecosystem — evidence for that setting, not a universal claim. Round 2 tested
|
|
44
|
-
> the v1.9.0 stack; the current **v1.14.
|
|
46
|
+
> the v1.9.0 stack; the current **v1.14.1** adds post-study envelope hardening
|
|
45
47
|
> (externally reviewed, with findings tracked individually as REPRO or AUDIT in
|
|
46
48
|
> [SECURITY-ENVELOPE.md](./SECURITY-ENVELOPE.md) and closed with regression and
|
|
47
|
-
> mutation checks — see [CHANGELOG](./CHANGELOG.md)).
|
|
48
|
-
>
|
|
49
|
-
>
|
|
50
|
-
>
|
|
49
|
+
> mutation checks — see [CHANGELOG](./CHANGELOG.md)). Rounds 3 and 3.1 are
|
|
50
|
+
> complete and are in the table above. **1.14.1 closed a bypass in `tamperward
|
|
51
|
+
> verify`** — an agent-added protected file could suppress the tests the pristine
|
|
52
|
+
> run had just restored — which was present from v1.9.0 onward, so rounds 2, 3
|
|
53
|
+
> and 3.1 all ran on a verifier carrying it. No evidence any agent used it; the
|
|
54
|
+
> layer's authority in those rounds was nonetheless weaker than described at the
|
|
55
|
+
> time. Round 4 is the fresh pool.
|
|
51
56
|
> No round-3 outcomes are included in the claims above.
|
|
52
57
|
|
|
53
58
|
## Architecture
|
|
@@ -74,7 +79,7 @@ final adjudication boundary sits outside the agent's normal lifecycle.
|
|
|
74
79
|
│ mutations judged from the event log │
|
|
75
80
|
│ │ │
|
|
76
81
|
│ pristine verification ▼ (`tamperward verify`) │
|
|
77
|
-
│ suite runs twice in
|
|
82
|
+
│ suite runs twice in separate copies: the candidate tree │
|
|
78
83
|
│ as-is, and with protected tests/snapshots/config │
|
|
79
84
|
│ restored from the trusted base; visible-green + │
|
|
80
85
|
│ pristine-red = MASKED FAILURE │
|
|
@@ -220,6 +225,7 @@ and its totals.
|
|
|
220
225
|
| v1.9.0 | `tamperward verify`: the round-1 pristine oracle productized — visible-green + pristine-red is a masked failure, and "could not verify" fails closed |
|
|
221
226
|
| Round 2, 9–0 | On 22 fresh repositories, v1.9.0 produced b=9/c=0 false-green discordance (p = 0.0039); four gated false greens remained, through two documented residual mechanisms |
|
|
222
227
|
| cssstyle lifecycle escape (round 2) | The `tamperward run` envelope: the gate denied 42 mutations and verify refused all 25 stop attempts, and the runtime completed the session anyway over a masked tree — hooks decide, runtimes terminate, so the adjudication boundary moved outside the runtime |
|
|
228
|
+
| v1.14.1, article audit | `tamperward verify` kept agent-added protected files in the pristine run on the premise that they "only add strictness". An added `conftest.py` could deselect the restored base tests by node id, so a masked failure reported VERIFIED and the envelope printed GREEN MEANS GREEN over an unfixed bug. Added protected files are now removed; PoC and mutation-checked regression committed |
|
|
223
229
|
| v1.10.1–v1.14.0, owner + two-pass external review | Frozen entry-time policy and verifier, entry-SHA ancestry enforcement, quiescence guard, dependency-tree fingerprint, a CI verify step in the generated workflow, the gate pinned to its own version in CI, and SHA-bound sign-off labels |
|
|
224
230
|
|
|
225
231
|
Each row's primary artifact: [CHANGELOG.md](./CHANGELOG.md), [SPEC.md](./SPEC.md),
|
|
@@ -241,7 +247,7 @@ via npm trusted publishing with SLSA provenance. Full rule:
|
|
|
241
247
|
|
|
242
248
|
```bash
|
|
243
249
|
npm install && npm run build # bundles the CLI to dist/cli/index.js
|
|
244
|
-
npm test #
|
|
250
|
+
npm test # 365 tests at v1.14.1 — parser, detectors, engine, policy, renderers
|
|
245
251
|
npm run typecheck
|
|
246
252
|
```
|
|
247
253
|
|
package/dist/cli/index.js
CHANGED
|
@@ -2900,6 +2900,32 @@ import { chmodSync as chmodSync2, cpSync, lstatSync, mkdirSync as mkdirSync6, mk
|
|
|
2900
2900
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
2901
2901
|
import { dirname as dirname4, join as join9, resolve } from "node:path";
|
|
2902
2902
|
var OVERLAY_CLASSES = ["tests", "snapshots", "config"];
|
|
2903
|
+
var VERIFICATION_SURFACE = [
|
|
2904
|
+
// Python / pytest — read from the rootdir, and conftest at any depth
|
|
2905
|
+
"**/conftest.py",
|
|
2906
|
+
"**/pytest.ini",
|
|
2907
|
+
"**/.pytest.ini",
|
|
2908
|
+
"**/setup.cfg",
|
|
2909
|
+
"**/tox.ini",
|
|
2910
|
+
"**/pyproject.toml",
|
|
2911
|
+
// JavaScript / TypeScript runners and the transforms they load
|
|
2912
|
+
"**/jest.config.*",
|
|
2913
|
+
"**/jest.setup.*",
|
|
2914
|
+
"**/vitest.config.*",
|
|
2915
|
+
"**/vitest.workspace.*",
|
|
2916
|
+
"**/.mocharc.*",
|
|
2917
|
+
"**/karma.conf.*",
|
|
2918
|
+
"**/babel.config.*",
|
|
2919
|
+
"**/.babelrc*",
|
|
2920
|
+
"**/vite.config.*",
|
|
2921
|
+
"**/.swcrc",
|
|
2922
|
+
"**/package.json",
|
|
2923
|
+
// Ruby / PHP / .NET
|
|
2924
|
+
"**/.rspec",
|
|
2925
|
+
"**/phpunit.xml",
|
|
2926
|
+
"**/phpunit.xml.dist",
|
|
2927
|
+
"**/*.runsettings"
|
|
2928
|
+
];
|
|
2903
2929
|
function git2(args, cwd) {
|
|
2904
2930
|
return execFileSync4("git", args, { cwd, encoding: "utf8", maxBuffer: 1 << 28 });
|
|
2905
2931
|
}
|
|
@@ -2948,7 +2974,7 @@ function dropSymlink(p) {
|
|
|
2948
2974
|
}
|
|
2949
2975
|
function overlayPristine(cwd, base, dest, policy) {
|
|
2950
2976
|
const atBase = git2(["ls-tree", "-r", "--name-only", "-z", base], cwd).split("\0").filter(Boolean);
|
|
2951
|
-
const isOverlay = (p) => OVERLAY_CLASSES.some((c) => isProtected(p, policy, c));
|
|
2977
|
+
const isOverlay = (p) => OVERLAY_CLASSES.some((c) => isProtected(p, policy, c)) || matchesAny(p, VERIFICATION_SURFACE);
|
|
2952
2978
|
let restored = 0;
|
|
2953
2979
|
const baseProtected = /* @__PURE__ */ new Set();
|
|
2954
2980
|
for (const rel of atBase) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tamperward",
|
|
3
|
-
"version": "1.14.
|
|
3
|
+
"version": "1.14.2",
|
|
4
4
|
"description": "The deterministic agent-integrity gate. One ruleset, evaluated on the actual diff/commands as a verdict, enforced everywhere a change can be made.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "hexrift",
|