Implements T01-T04:
- tools.py: green-commit-only-equivalent tool surface (read/write/edit/
glob/grep + git status/diff/log/add+commit), path-traversal guarded.
- openrouter_client.py: own minimal chat-completions client — llm-connect's
OpenRouterAdapter takes a single prompt string and never surfaces
tool_calls, so it can't drive a multi-turn tool-calling loop without a
breaking change to its frozen Core ABC. llm-connect stays an optional
dependency (pyproject.toml), not load-bearing.
- loop.py: plan -> tool call -> observe -> repeat, budget- and
turn-bounded, tool errors reported back to the model instead of
crashing the loop.
- credentials.py: own OpenBao AppRole/ambient-token acquisition, per
glas-harness ADR-002 (Option B) — glas-harness does not broker this.
- runner.py/hub.py: commit-verified success criterion + State Hub
progress/token reporting, mirroring rein-aharness's model.
26 tests, all mocked at the httpx/subprocess boundary — no real
OpenRouter or OpenBao calls made. T05 (Forgejo repo creation) stays
open, deferred to the operator.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Agentic tool-use harness for current open-weight models via OpenRouter/
llm-connect, as an alternative to frontier-model-vendor harnesses
(Claude Code, Grok CLI, Codex/GPT CLI). Chartered by glas-harness
ADR-001. Local scaffold only, no Forgejo remote yet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>