Commit Graph
16 Commits
Author SHA1 Message Date
mrcharles 05ec1a4142 events: verify, normalize, append-only store with provider-id dedup
Signature verification (gitea hex HMAC-SHA256 over the raw body via
constant-time hmac.Equal; redmine/discourse constant-time shared-secret
headers) with one generic ErrUnverified so rejects give attackers no
oracle. Tolerant normalization of the known Redmine/Discourse/Gitea
payload variants into one Event record (canonical subject ids, actor,
title, repo, sha256 payload digest) plus the DESIGN action mapping
(dispatch_turn / respond_turn / pipeline_step / ignore). Store: JSONL
under state dir, 0600, dedup keyed on provider event id (delivery
header, payload-digest fallback), index rebuilt at startup so replays
across restarts still dedup; torn tail lines skipped, not fatal.
2026-08-28 21:38:16 -05:00
mrcharles 164b14592b events: config surface for the webhook receiver
[events] listen/state_dir plus per-source secret refs (env:/file:/literal:)
for redmine, discourse and gitea webhooks. Defaults: :4100, state/events,
X-Redmine/X-Discourse-Webhook-Secret headers. Refs validate fail-fast; set
refs must be well-formed or config load names the [events.*] section.
2026-08-28 21:38:06 -05:00
mrcharles c6da05fac5 docs: rewrite README to the docs standard; polish docs/
README: verified quickstart (Docker builder, dry-run, live demo), mermaid
architecture, CLI/config/routing reference tables, status table from
REPORT.md, correct ukrrs repo URLs. docs/: Status front-matter lines on
all PORTING-NOTES (secrets notes now tracked). DESIGN: table of contents
with anchor links; sections untouched.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 21:10:04 -05:00
mrcharles ab29d8a948 DESIGN: budget + quota reality (flat-rate now, $200/mo after 09-22; flash-stretch routing) 2026-08-28 19:26:34 -05:00
mrcharles 9042f99ea6 REPORT: phase 2 status — skeleton works, gaps and next chunk listed
Records what the skeleton does (config, routing, single-shot loop, intake,
gated bash, REPORT writeback, test coverage), the one missing input for the
live MVP demo (HARNESS_LITELLM_KEY), the stubbed items (redmine notes,
budget gate, bw refs, streaming/resume, session persistence), and the
ordered phase 3 work.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 19:21:43 -05:00
mrcharles 62d3781d71 harness: single-shot conductor + CLI with MVP demo path
`harness once` runs one bounded iteration (intake -> routing -> bounded turn
-> REPORT) then exits, so callers chain it without a daemon. The bounded
turn loops request -> tool calls -> results up to max_rounds; gate denials
feed back to the model and are counted instead of failing the turn.
--dry-run prints the plan (task, resolved model, tool bounds) and makes zero
LLM calls; --demo runs the [demo] issue ("tell me about yourself" through
LiteLLM -> GLM self-description as the REPORT), the MVP acceptance bar.
Distinct exit codes for config/usage, intake, and llm failures. Ships
harness.toml.example (scope query, tier map, allow-lists); real configs are
gitignored. Loop tests run end-to-end against a scripted fake OpenAI server:
demo turn, dry-run zero-call, tool round-trip, denial counting, round limit,
and error-class mapping.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 19:21:04 -05:00
mrcharles aefa73aa90 harness: LiteLLM client, Redmine intake, REPORT writeback, gated bash tool
OpenAI-compatible chat client for the LiteLLM proxy (base_url normalization,
Bearer auth, retry/backoff on 429/5xx/transport, usage accounting) - stdlib
http only. Intake lists issues in scope from /issues.json with the task
class read from a configurable custom field. Writeback lands each turn as
REPORT-<vertical>-<task>-<ts>.md plus REPORT-latest.md (atomic rename) with
model/tier/token telemetry. The bash tool ports maki's permission semantics
without tree-sitter: segment-by-segment compound-command checks, deny beats
allow, word-boundary "cmd *" matching, $()/backtick/subshell denied, output
truncation, per-command timeout with process-group cleanup.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 19:20:57 -05:00
mrcharles 591d345371 harness: config layer + model routing v0 (tier map, no heuristics)
harness.toml loading via a stdlib-only TOML subset parser (tables, bare
keys, strings/ints/bools, multi-line arrays; anything richer fails loudly).
Secrets are refs only (env:/file:/literal:, bw: reserved) and are redacted
from every error path. Model routing v0: static class -> tier alias ->
concrete model map per the DESIGN model-selection layer; requests carry the
resolved concrete model and unknown classes fail hard so routing stays
auditable. Table-driven tests cover the parser, validation, key refs, and
routing decisions.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 19:20:51 -05:00
mrcharles a1623e141e Porting notes: maki (bash permission scopes, token reduction, subagent tiers)
Maps the maki reference to the harness build: tree-sitter scope extraction
and the 4-way rule matcher for the permission gate, index/tool_search token
reduction, weak/medium/strong subagent tiers with model clamping, and the
headless spawn model that the conductor loop follows. Gotchas preserved:
headless prompt==deny for complex bash, matcher suffix order, deny-exact vs
allow-broad asymmetry, symlink-aware path checks.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-08-28 19:20:47 -05:00
mrcharles b69d387203 DESIGN: MVP demo bar + model selection layer (tier map, LiteLLM aliases, auto-pick v1) 2026-08-28 18:58:49 -05:00
mrcharles a6068100d0 Porting notes: crush (MCP via go-sdk, session model, skip-list) 2026-08-28 18:56:20 -05:00
mrcharles 54c64b594b Add verbatim AGPLv3 LICENSE + README 2026-08-28 18:52:58 -05:00
mrcharles e53398ea36 DESIGN: Go-only toolchain policy; separate-CLI tooling architecture 2026-08-28 18:48:41 -05:00
mrcharles 162ecc38c5 DESIGN: verticals first-class, SoR-only interaction layer 2026-08-28 18:45:45 -05:00
mrcharles 518effbadc DESIGN: crush feature-parity target per Charles 2026-08-28 18:45:29 -05:00
mrcharles a0eb99b3fb MOPAC harness v0 spec: headless Go conductor loop, tool ports, LiteLLM-first 2026-08-28 18:43:23 -05:00