Skip to content

Releases: shaifulshabuj/teststop

v1.1.0

Choose a tag to compare

@shaifulshabuj shaifulshabuj released this 11 Jun 21:03

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 with TESTSTOP_MODEL.
    • stream: false, think: false, num_ctx: 32768 per 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() pings localhost:11434 with a 2s timeout for fast detection.
  • 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=claude or TESTSTOP_CLI=copilot. TESTSTOP_CLI=ollama forces ollama only.

    Quality tradeoff (measured, against waymark API project):

    Model Scenarios Time Notes
    qwen3.6:latest 29–31 ~3–4 min High specificity; IDOR, race conditions, token expiry
    gemma4:latest 52 ~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=claude remains 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 \xNN hex 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_ctx rationale, think: false approach, and JSON-suffix strategy.


v1.0.1

Choose a tag to compare

@shaifulshabuj shaifulshabuj released this 11 Jun 13:05

Fixed

  • claude CLI 2.1.x streaming format (internal/ai). claude 2.1.172 changed
    its --output-format json output from a single JSON object to a JSON array
    of streaming events
    . parseClaudeEnvelope failed 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-value Scenario — 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.

    parseClaudeEnvelope now handles both formats:

    • Single JSON object {…} — legacy path, unchanged.
    • JSON array […] — finds the last event where "type":"result" and returns
      its is_error / result fields. Error detection (rate-limit, auth, refusal)
      works correctly for both formats.

    ParseScenariosFromJSON also gains a hollow-batch guard: if every parsed
    scenario has an empty scenario_id AND title, 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.


v1.0.0

Choose a tag to compare

@shaifulshabuj shaifulshabuj released this 11 Jun 07:54

Added

  • .teststop/config.yaml support. The optional per-project config file is
    now real. Every key maps one-to-one onto an existing teststop run flag.
    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.yaml for the keys.

  • --ai-concurrency flag (default 1). Caps the number of concurrently
    running AI-mode scenario executions to prevent rate-limit exhaustion. Config
    key ai_concurrency; env TESTSTOP_RUN_AI_CONCURRENCY.

  • Structured AI error detection. The Claude adapter now calls
    claude --output-format json and parses the outer envelope, surfacing
    structured errors (rate-limit, auth failure, refusal) with context instead
    of raw stderr. Non-zero exits and envelope is_error: true both 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.go package comment declares the schema FROZEN at v1.0.
  • internal/cli test coverage raised from 28.9% → 51.6%.

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 08 Jun 10:24

Changelog

  • 30af62a Merge: AI infra errors skipped + neutral cwd (#44 findings 1 & 3)
  • 6cb391f fix: AI infra errors are skipped, not failures (#44 finding 1) + neutral cwd (finding 3)

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 07 Jun 18:11

Changelog

v0.3.0-rc.1

v0.3.0-rc.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Jun 18:06

Changelog

  • 009f867 Merge: predicted/executed reporting (#42) + concurrency exec mode (#43)
  • c24e915 feat: concurrency exec mode (#43) + predicted-vs-executed reporting (#42)
  • f2950f1 fix(executor): race winners are strictly 2xx; at-most-one passes

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 07 Jun 02:32

Changelog

  • 8f6df35 ci(docs): promote release tags to stable on manual docs deploy
  • bcc77d8 feat(cli): add version command and --version/-v flags

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 06 Jun 09:26

Changelog

  • 483b89e Merge feat/executor-v0.2: dynamic scenario execution (#29)
  • 72353de feat(executor): dynamic scenario execution against live systems (#29)
  • 065587e fix(executor): emit ExecutionResult duration in milliseconds

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 21 May 07:47

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