|
1 | 1 | # Changelog |
2 | 2 |
|
| 3 | +## [1.57.6.0] - 2026-06-07 |
| 4 | + |
| 5 | +## **Eight community-filed bugs fixed in one wave, four of them security guards that were quietly failing open.** |
| 6 | +## **Your redaction gate now catches modern OpenAI keys, and `/ship`'s adversarial review stops choking on your own security tests.** |
| 7 | + |
| 8 | +This is a fix wave. The throughline: guards that reported success while doing nothing. |
| 9 | +The secret-redaction gate that every `/spec`, `/ship`, `/cso`, and `/document-*` run |
| 10 | +passes through was blind to modern `sk-proj-`/`sk-svcacct-`/`sk-admin-` OpenAI keys and |
| 11 | +silently dropped its size cap on a bad flag. The cross-project learnings trust gate was |
| 12 | +an allowlist on paper and a denylist in code, so untrusted rows leaked between projects. |
| 13 | +The destructive-action classifier waved through "rotate the database password." Each one |
| 14 | +looked like it was protecting you. None of them were. All four now fail closed, with |
| 15 | +tests that pin the exact case that used to slip by. Three more fixes clear silent |
| 16 | +crashes and skipped reviewers, and `/ship`'s adversarial pass no longer trips Anthropic's |
| 17 | +usage policy when it reads your repo's own attack-payload fixtures. |
| 18 | + |
| 19 | +### The numbers that matter |
| 20 | + |
| 21 | +Reproduce with `bun test test/redact-engine.test.ts test/gstack-learnings-search.test.ts test/one-way-doors.test.ts test/diff-scope.test.ts test/brain-cache-roundtrip.test.ts`. |
| 22 | + |
| 23 | +| Guard / path | Before | After | |
| 24 | +|---|---|---| |
| 25 | +| `sk-proj-`/`sk-svcacct-`/`sk-admin-` OpenAI keys | zero findings (HIGH fails open) | blocked, with prose false-positive guards | |
| 26 | +| `gstack-redact --max-bytes <garbage>` | NaN silently disables the size cap | rejected at the CLI; engine backstop holds | |
| 27 | +| Cross-project learnings with no `trusted` field | imported (denylist bug) | excluded (true allowlist) | |
| 28 | +| "rotate the database password" | classified two-way (auto-approvable) | classified one-way (always asks) | |
| 29 | +| `.mjs/.cjs/.mts/.cts`-only PRs | backend reviewer skipped | backend reviewer runs | |
| 30 | +| `_meta.json` missing `last_refresh` | brain-cache crashes (TypeError) | degrades to a cold cache | |
| 31 | +| Safety-skill hooks on Claude Code 2.1.162 | every Edit/Write errored | hooks resolve and run | |
| 32 | +| `/ship` adversarial review over security fixtures | denied by usage policy | runs, fixtures read in summary mode | |
| 33 | + |
| 34 | +The redaction one is the sharpest: a project/service-account/admin OpenAI key pasted |
| 35 | +into a spec or PR body used to sail straight through the gate. Now it blocks, and the |
| 36 | +calibration is pinned so hyphenated prose like "the sk-learning-rate schedule" does not |
| 37 | +false-positive and wedge your ship. |
| 38 | + |
| 39 | +### What this means for you |
| 40 | + |
| 41 | +If you rely on the redaction guard or the cross-project learnings gate, they now do what |
| 42 | +the docs always said. If you run `/ship` on a repo that tests its own security guards, |
| 43 | +adversarial review stops dying on contact with your fixtures. And if you are on Claude |
| 44 | +Code 2.1.162, `/guard`, `/freeze`, and `/careful` work again instead of erroring on every |
| 45 | +edit. Upgrade and re-run anything that touched these paths. |
| 46 | + |
| 47 | +### Itemized changes |
| 48 | + |
| 49 | +#### Fixed |
| 50 | +- **Redaction misses modern OpenAI keys (#1868).** `openai.key` (HIGH/block) used a |
| 51 | + contiguous-alphanumeric pattern that stopped at the first `-`/`_`, so base64url-bodied |
| 52 | + `sk-proj-`/`sk-svcacct-`/`sk-admin-` keys produced no finding and failed open through |
| 53 | + every redaction sink. Replaced with explicit bare-vs-prefixed alternation; added |
| 54 | + positive and false-positive tests. Reported by @jbetala7. |
| 55 | +- **Redaction size cap fails open on a bad flag (#1824).** A malformed `--max-bytes` |
| 56 | + parsed to `NaN`, and `byteLen > NaN` is always false, silently disabling the |
| 57 | + fail-closed oversize guard; a negative value blocked everything. The CLI now rejects |
| 58 | + non-integer / non-positive values, and the engine falls back to the default cap as a |
| 59 | + backstop. Reported by @jbetala7. |
| 60 | +- **Cross-project learnings trust gate leaked (#1745).** `gstack-learnings-search |
| 61 | + --cross-project` is documented as an allowlist but was coded as `trusted === false`, |
| 62 | + admitting any row missing the `trusted` field. Flipped to `trusted !== true`. Reported |
| 63 | + by @jbetala7. |
| 64 | +- **Destructive-action classifier missed "rotate ... password" (#1839).** The `rotate` |
| 65 | + keyword pattern omitted `password` while its `revoke`/`reset` siblings included it, so |
| 66 | + the most common credential-rotation phrasing classified as a reversible two-way |
| 67 | + question. Added `password` to the alternation. |
| 68 | +- **Review Army skipped backend reviewer on ESM/CJS PRs (#1810).** `gstack-diff-scope` |
| 69 | + matched only `*.ts|*.js`; a PR touching only `.mjs/.cjs/.mts/.cts` reported no backend |
| 70 | + scope. Added the four module extensions. Reported by @jbetala7. |
| 71 | +- **Brain-cache crash on a partial `_meta.json` (#1879).** `loadMeta` returned parsed |
| 72 | + JSON verbatim; a file missing `last_refresh` crashed three consumers with a TypeError. |
| 73 | + Added an object-shape guard and map normalization; missing schema/endpoint identity now |
| 74 | + forces a safe rebuild rather than trusting a stale file. Reported by @jbetala7. |
| 75 | +- **Safety-skill hooks broken on Claude Code 2.1.162 (#1871).** `guard`, `freeze`, and |
| 76 | + `careful` frontmatter hooks used `${CLAUDE_SKILL_DIR}`, which CC 2.1.162 no longer |
| 77 | + populates, so every Edit/Write/Bash errored. Anchored the hook commands to the |
| 78 | + installed checkout path. Reported by @omariani-howdy. |
| 79 | +- **`/ship` adversarial review denied on own security fixtures (#1899).** The Claude |
| 80 | + adversarial subagent reasoned "like an attacker" over the full diff; when the diff |
| 81 | + included the repo's own attack-payload regression fixtures, Anthropic's real-time |
| 82 | + usage-policy safeguards denied the call. The subagent now carries authorized-defensive |
| 83 | + -testing framing and reads fixture/test files in summary mode (no raw payload bytes), |
| 84 | + stating so explicitly. Reported by @bmajewski. |
| 85 | + |
| 86 | +#### For contributors |
| 87 | +- `#1882` (skills hardcode `~/.claude/skills/gstack/`, breaking non-`gstack` install |
| 88 | + dirs) is filed as the top item in `TODOS.md`. It was scoped out of this wave once it |
| 89 | + proved to be a host-config/preamble change touching all 52 skills, distinct from the |
| 90 | + `#1871` hook fix it was originally paired with. |
| 91 | + |
3 | 92 | ## [1.57.5.0] - 2026-06-07 |
4 | 93 |
|
5 | 94 | ## **Your agent now keeps its decisions, not just its code.** |
|
0 commit comments