|
2 | 2 |
|
3 | 3 | All notable changes to Sage will be documented in this file. |
4 | 4 |
|
| 5 | +## [1.3.9] — the gate that guards the gates, and opencode goes mechanical |
| 6 | + |
| 7 | +Two things merged after 1.3.8 that users should have: a security fix, and a |
| 8 | +platform that stopped being prose. |
| 9 | + |
| 10 | +- **`sage-config-gate` — an agent can no longer disable its own enforcement.** |
| 11 | + Found by the opencode port probe: every gate reads `hard_enforcement` from |
| 12 | + `.sage/config.yaml`, a file the gated agent can edit — so a blocked agent could |
| 13 | + set `hard_enforcement: false` and walk through every gate (spec, tdd, secrets, |
| 14 | + verify, bookkeeping). Reproduced against the real spec-gate. The meta-gate |
| 15 | + blocks an agent Edit/Write/MultiEdit (and the obvious Bash redirect/sed |
| 16 | + evasions) that would reduce any gate's effective-enabled state while |
| 17 | + enforcement is on. No opt-out — the guard IS hard enforcement; a human disables |
| 18 | + it in their own editor, which never hits PreToolUse. Hook tests C1–C9; E15 |
| 19 | + proves it end to end (told to disable enforcement + do real work, the switch |
| 20 | + survives 3/3 and the work lands). Honest residual: a sufficiently exotic Bash |
| 21 | + rewrite can still evade the coarse Bash matcher; the Edit/Write path is |
| 22 | + airtight. |
| 23 | +- **opencode → Tier A.** `sage init` (opencode) now ships an enforcement adapter |
| 24 | + (`.opencode/plugin/sage.js`) that bridges opencode's plugin API to Sage's |
| 25 | + platform-agnostic gates: `tool.execute.before` vetoes (throw on exit 2), |
| 26 | + `tool.execute.after` records. Capabilities attested with an instrumented |
| 27 | + transcript (veto blocks an edit; the `task` tool dispatches an independent |
| 28 | + reviewer; hooks fire INSIDE the subagent, so it is not an escape hatch), and |
| 29 | + the shipped adapter is tested deterministically against the real gates |
| 30 | + (`setup/adapter-test.mjs`, 5/5) — independent of opencode's model backend. The |
| 31 | + contract derives C→A. codex stays Tier C (its hooks never provably fired). |
| 32 | + |
5 | 33 | ## [1.3.8] — the verify gate, and the edges of "make it code" |
6 | 34 |
|
7 | 35 | The third hook the weak-model campaign demanded — and the first whose proof |
|
0 commit comments