Skip to content

Commit 9e6b2c1

Browse files
committed
release: cut v1.3.9 — the gate that guards the gates, and opencode goes mechanical
Ships two things merged after 1.3.8: sage-config-gate (the enforcement self-escape security fix — an agent can no longer flip hard_enforcement off to walk through its own gates) and opencode Tier A (the enforcement adapter, C→A). Patch release — stays below 1.4, no attestation-expiry churn.
1 parent 501a992 commit 9e6b2c1

3 files changed

Lines changed: 30 additions & 2 deletions

File tree

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sage",
3-
"version": "1.3.8",
3+
"version": "1.3.9",
44
"description": "AI skills framework: UNDERSTAND → ENVISION → DELIVER. Mechanical process enforcement, 9 workflows, 12 core skills (+ installable packs), 5 agent personas.",
55
"author": {
66
"name": "xoai",

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,34 @@
22

33
All notable changes to Sage will be documented in this file.
44

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+
533
## [1.3.8] — the verify gate, and the edges of "make it code"
634

735
The third hook the weak-model campaign demanded — and the first whose proof

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.3.8
1+
1.3.9

0 commit comments

Comments
 (0)