Releases: shaifulshabuj/teststop
Release list
v1.1.0
Added
-
ollama adapter — local-model backend (
internal/ai/ollamacli.go, closes #30).
teststop now ships a first-class ollama adapter that calls the ollama HTTP API at
localhost:11434. No subprocess, no API key, no account quota.- Default model:
qwen3.6:latest(36B Q4_K_M). Override withTESTSTOP_MODEL. stream: false,think: false,num_ctx: 32768per request.- Automatic
<think>…</think>block stripping for qwen3 models on older ollama builds. - JSON-only output constraint appended to the mandate for local models (local models are
less instruction-following than cloud models; cloud adapters are unaffected). IsOllamaAvailable()pingslocalhost:11434with a 2s timeout for fast detection.
- Default model:
-
Auto-detection precedence changed: ollama → claude → copilot.
TESTSTOP_CLI=auto(the default) now prefers ollama when the local server is reachable.
Cloud CLIs (claude, copilot) are still fully supported but opt-in:
TESTSTOP_CLI=claudeorTESTSTOP_CLI=copilot.TESTSTOP_CLI=ollamaforces ollama only.Quality tradeoff (measured, against waymark API project):
Model Scenarios Time Notes qwen3.6:latest29–31 ~3–4 min High specificity; IDOR, race conditions, token expiry gemma4:latest52 ~8 min Most thorough; covers auth, concurrency, edge inputs qwen3:4b— — Not viable; outputs reasoning prose, never generates JSON Scenario depth and edge-case creativity from local models are moderately lower than
claude's output. For production runs where quota is not a concern,
TESTSTOP_CLI=clauderemains the highest-quality choice. -
Resilient JSON parsing for local models (
ParseScenariosFromJSON). Local models
produce sloppier output than cloud CLIs. The parser now uses a three-pass strategy:
(1) direct unmarshal; (2) extract[…]from prose-wrapped output (qwen3:4b pattern —
reasoning before JSON); (3) sanitize invalid JSON escape sequences then retry (gemma4
pattern — emits\xNNhex notation which is not valid JSON). Cloud adapter output
is unaffected (pass 1 always succeeds for claude/copilot). -
Design document (
docs/design/ollama-adapter.md). Records the HTTP-vs-CLI decision,
num_ctxrationale,think: falseapproach, and JSON-suffix strategy.
v1.0.1
Fixed
-
claude CLI 2.1.x streaming format (
internal/ai). claude 2.1.172 changed
its--output-format jsonoutput from a single JSON object to a JSON array
of streaming events.parseClaudeEnvelopefailed to unmarshal the array into
a struct, triggering the legacy fallback which fed the raw event array to
ParseScenariosFromJSON. The parser then silently unmarshaled each event object
(with no matching field names) into a zero-valueScenario— yielding batches
of hollow structs with empty title, steps, priority, and confidence_area. Exit
code was 1 ("review needed") rather than an error, so the defect was silent.parseClaudeEnvelopenow handles both formats:- Single JSON object
{…}— legacy path, unchanged. - JSON array
[…]— finds the last event where"type":"result"and returns
itsis_error/resultfields. Error detection (rate-limit, auth, refusal)
works correctly for both formats.
ParseScenariosFromJSONalso gains a hollow-batch guard: if every parsed
scenario has an emptyscenario_idANDtitle, an explicit error is returned
instead of the silent zero-value batch. This is defense-in-depth that fires even
if the envelope parsing falls back to raw output. - Single JSON object
v1.0.0
Added
-
.teststop/config.yamlsupport. The optional per-project config file is
now real. Every key maps one-to-one onto an existingteststop runflag.
Settings resolve with precedence config file <TESTSTOP_RUN_*env var <
explicit CLI flag. A missing file is not an error; malformed YAML or an
unknown key fails loudly. See.teststop/config.example.yamlfor the keys. -
--ai-concurrencyflag (default1). Caps the number of concurrently
running AI-mode scenario executions to prevent rate-limit exhaustion. Config
keyai_concurrency; envTESTSTOP_RUN_AI_CONCURRENCY. -
Structured AI error detection. The Claude adapter now calls
claude --output-format jsonand parses the outer envelope, surfacing
structured errors (rate-limit, auth failure, refusal) with context instead
of raw stderr. Non-zero exits and envelopeis_error: trueboth map to
informative error messages. -
E2E pipeline test (
test/e2e/). A full reader → mandate → adapter →
memory → reporter → exit-code integration test using a fake-claude fixture
script. Runs without real tokens; skippable via-short. -
v1.0 contracts frozen (
CONTRACTS.md). Exit codes, scenario JSON schema,
run output envelope, memory file format, and environment variables are
declared stable. Breaking changes require a major version bump. -
examples/waymark-demo/. Replayable demo artifact: 52-scenario run
against the waymark MCP middleware repo, with the captured JSON report,
Markdown summary, the mandate used, and replay instructions.
Changed
pkg/scenario/types.gopackage comment declares the schema FROZEN at v1.0.internal/clitest coverage raised from 28.9% → 51.6%.
v0.3.1
v0.3.0
v0.3.0-rc.1
v0.2.1
v0.2.0
v0.1.0
Changelog
- 1f0a3b4 feat(TASK-20260521-102217): bootstrap teststop build to compilable all-tests-green state
- b969e3b feat(phase/0): project infrastructure — go module, scaffold, README, MANDATE
- 23f2f83 feat(phase/1): foundation — scenario types + Cobra CLI scaffold
- f348af7 feat: add Apple Container isolated dev environment for coding agents
- 279aa78 feat: add Claude Code agentic infrastructure for autonomous development
- 64440da feat: implement phases 2-7 — full teststop v0.1 pipeline
- c800121 fix: replace API/SDK design with CLI-based AI adapter throughout
- 039b1ab refactor: remove reader and reporter packages