gstack 1.91.143.0: docs-sync tests stop failing Claude's harmless joined reads

1 hour ago

gstack 1.91.143.0: the docs-sync eval cases stop failing when Claude joins or pipes a harmless read. One shared read-only command rule decides, and it is stricter about paths: everything stays inside the fixture home and .claude.json stays unreadable. Release notes: https://github.com/garrytan/gstack/blob/main/CHANGELOG.md#1911430---2026-10-18 Changelog: https://github.com/garrytan/gstack/blob/main/CHANGELOG.md Commits: https://github.com/garrytan/gstack/commits/main

Ask

Ask about this presentation

Answers are generated from this presentation.

Chapters

  1. 0:00Harmless reads
  2. 0:14One rule
  3. 0:29Stricter paths
  4. 0:43Your fixtures
Show transcript

Harmless reads

gstack logo

gstack’s docs-sync tests stop failing harmless joined reads

wc -l <SKILL.md>
used to fail the case
cat a; echo ----; cat b
used to fail the case
PR gate now: all 13 docs-sync cases pass on Fable 5.1
Harmless readsOne ruleStricter pathsYour fixtures
garrytan/gstack · CHANGELOG.md

gstack's docs-sync tests no longer fail a run when Claude joins or pipes a harmless read. A line count on a skill file, or two reads split by a semicolon, used to turn the gate red.

One rule

One shared rule decides whether a command line only reads

Accepts listed read tools: cat, grep, ls, wc, head, find and more, joined with ; && ||
Pipes may feed only a filter
Rejects redirects, substitutions, variables and write options. On Windows it accepts nothing.
Harmless readsOne ruleStricter pathsYour fixtures
garrytan/gstack · CHANGELOG.md

One shared rule now decides whether a command line only reads: common tools like cat, grep and head, joined on one line. Redirects, substitutions, variables and writes are refused, and on Windows it accepts nothing.

Stricter paths

Every path must stay inside the fixture home

pwd · ls · cat · stat
used to accept any path
.claude.json
unreadable: holds the API key
0
newly rejected, of 1,004 replayed commands from six gates
Harmless readsOne ruleStricter pathsYour fixtures
garrytan/gstack · CHANGELOG.md

The test also got stricter: every path must stay inside the fixture's home, and Claude's config file holding the API key stays unreadable. Zero of about a thousand replayed commands are newly rejected.

Your fixtures

Writing a fixture? Opt in when it isn’t about which reads happen

Fixtures whose contract is about which reads happen keep their narrow lists. In this release, only the docs-sync fixture opts in.
CHANGELOG.mdgstack release notes, “If you…”
Does Claude Code chain reads on one line in your runs, or one command per call?
Harmless readsOne ruleStricter pathsYour fixtures
garrytan/gstack · CHANGELOG.md

Writing a gstack fixture? Opt in unless its contract is about which reads happen; those fixtures keep their narrow lists. In your runs, does Claude Code chain reads on one line, or one command per call?