Kept the local README (richer, describes the actual implementation)
over the stub's placeholder one-liner; the MIT LICENSE from the stub
merges in cleanly, matching the sibling rein repos.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Real ext.bwrap sandbox, real OpenRouter call (qwen/qwen-2.5-72b-instruct),
real 2-turn tool-calling loop, real verified commit. Credential reused
the OPENROUTER_API_KEY already in the environment via credentials.py's
env-var short-circuit -- no OpenBao round trip needed this time.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>