Skip to content

Releases: PMSLLC/gophermind.com

gophermind v0.10.0

Choose a tag to compare

@jbrahy jbrahy released this 21 Oct 13:34

Added

  • /project now runs the v2 planner and executor in one command. gophermind project <brief> (and /project <brief> in the TUI) runs the preflight, plans the brief and builds it. Unattended runs take Clarify recommendations and confirm the understanding by rule, recording confirmed_by: unattended and its hash. A failed preflight exits 6 with a numbered list of what a human must provide. --graded marks a single graded attempt. The project report carries a node-class table. scripts/build-dev-binary.sh builds the version-stamped dev binary.
  • Parallel leaves. executor.workers (1 to 8, default 1) and gophermind brief run --workers n run the leaves of one level at once, each in a private copy of the repository. Landing order is fixed by leaf id and the work branch stays a linear history. With 1 nothing changes.
  • A revise stage. When a leaf has used its whole model ladder, or answers CONTRACT_PROBLEM, the planner rewrites the node (description, contract text, tests, groups) and the build goes on from the rewrite, bounded by defaults.max_revisions. A changed signature or depends_on is flagged to a person, not rewritten. Rewrites and decisions are kept in _state/revisions/ and decisions/rv-*.md. The revise: section of gophermind.yaml (mode, model_tier, context, rewrite_tests, max_tokens, max_refusals) configures the rewrite.
  • gophermind brief plan and gophermind brief resume. gophermind brief plan <brief.md> and gophermind brief resume <run-id> take a brief through Load, Clarify, Contract, Decompose, Coverage, Approve and Test-writer (the run id is the brief's id), with --yes, --gate terminal|file, --fake <fixture-dir> (canned replies, no settings, network or model) and --allow-public; exit 3 means the run is waiting on a human, and plan refuses a run folder that already holds stage output and points at resume.
  • gophermind brief status, coverage, calls and report. gophermind brief status, coverage, calls and report [--json] <run-id> print each stage and what the run waits for (plus executor lines: status, waves done, leaves verified, blocked leaves), which nodes and tests cover each requirement, the model-call ledger (provider, model, tokens, duration, outcome; it records only sizes and SHA-256 hashes of prompts and replies, never their text), and a run's report.
  • gophermind.yaml is written with defaults on first use. <config dir>/gophermind.yaml is written with defaults the first time plan runs: providers (OpenAI-compatible, base_url, visibility, max_concurrent, api_key_secret naming a vault entry), models listing provider/model fallback chains per tier (strong, standard, any), privacy.mode (need_to_know lets public providers see single functions only, or private_only), rate_limits cooldowns and backoff, defaults and human.mode.
  • The executor: and toolchain: sections of gophermind.yaml. The executor: section (fix_attempts, repair_rounds, acceptance_repair_rounds, test_timeout_seconds, acceptance_timeout_seconds, stale_claim_seconds, output_cap_bytes, heartbeat_seconds, max_run_minutes (default 720), go_mod_cache, sandbox, proxy.listen, proxy.log, artifacts on or off and artifact_max_bytes for the scrubbed replies and check output saved under attempts/ and _state/replies/) and a toolchain: section whose PATH is the only toolchain setting a file holds (the executor adds HOME, GOCACHE, GOMODCACHE, GOPATH and TMPDIR itself; a build sees nothing from the parent environment); every number must be positive and an explicit zero retry count is rejected.
  • New keys under defaults:. clarify_max_calls (default 4), clarify_max_questions (default 30, 1 to 1000), enrich_batch_size (default 4, 1 to 32) and route_by_node_tier (default true); an explicit 0 is refused.
  • reasoning_effort per provider, with truncated and empty replies handled. A provider may set reasoning_effort (none, low, medium or high; the mini defaults to none) for thinking models that answer in a reasoning field; a truncated reply is retried once with a doubled token budget (capped at 16384) and an empty reply is a typed failure, both before failing over to the next model.
  • base_url_fallbacks, private-network checks and per-provider timeouts. A provider entry may list base_url_fallbacks, tried in order at preflight and at the start of a run when base_url does not answer; a private provider's base_url and fallbacks must be private-network hosts (loopback, RFC 1918, 100.64/10, link-local, IPv6 ULA, .local, .internal, .lan) and a public provider's must be public. Per-provider call_timeout_seconds overrides defaults.call_timeout and rate_limits.cooldown_after_timeout_seconds (default 60) cools down a chain entry whose call timed out; provider calls never follow redirects and ignore the proxy environment. The default mini entry gains the VPN fallback http://10.8.0.6:11434/v1 and a 1500 second call timeout.
  • Human gates. With --gate file (or human.mode: file) the planner writes QUESTIONS.md and APPROVAL.md into the run folder and exits 3 until they are filled in, --gate terminal asks in the terminal, and an approval is bound to the plan's hash, which covers function signatures, file paths and depends_on, so editing any of them after approval invalidates it.
  • Clarify in rounds, with a fact probe and a Confirm gate. Clarify runs in rounds after a fact probe of the target repo (go.mod, directory listing, exported Go names only, no commands run); every question carries a recommendation and accept takes it in the terminal or in QUESTIONS.md, then a Confirm gate asks the person to approve the planner's understanding (y/N in the terminal, or approve/reject: <reason> in UNDERSTANDING.md in file mode) before planning continues.
  • gophermind brief answer. gophermind brief answer <run-id> <question-id> <new answer...> changes a settled answer and restarts the planner from the stage that used it (the whole Contract stage, or one component's plan); run gophermind brief resume afterwards.
  • Coverage. Every top-level bullet under ## Constraints and ## Acceptance and every ### under ## Features is a requirement; gaps go back to the model for up to defaults.max_coverage_rounds, and if any remain the run stops with exit 1, lists them, and nothing is approved.
  • The contract stage works within small model windows. The outline is built in resumable passes (a shared pass, then batches of features), every contract prompt is sized to the smallest model in the chain (with a prompt_size event), a reply cut at the token limit is treated as a truncation and retried, dangling references and missing contract fields are repaired in bounded passes instead of ending the run, ids are normalised into one namespace where the first emission wins, and errors never quote more than a bounded id.
  • The contract stage plans an entry point. A brief that names a command to run or describes a CLI tool or server gets a cmd/<binary-name> package, every main package must declare func main(), a warning is emitted when either is still missing after a retry, and security.untrusted_inputs accepts the process-level sources os.Args, os.Stdin, os.Environ, os.Getenv and flag.Args.
  • The test writer is stricter and compile-checks what it accepts. The test writer refuses tests that import anything outside the standard library, the module and the contract packages, writes files crash-safely, never writes through a symlink, stops rather than overwrite a test file it did not write, and compile-checks each accepted test file against the contract stubs at plan time; compile refusals name only predeclared, standard library or contract-declared types and functions, and Go syntax errors report line and column.
  • The approval plan shows node groups and revision notices. The plan a person approves has a Node groups section (not-applicable counts per group, trust boundaries per component, nodes no requirement names, Enrich warnings, assumptions and open questions, and a note when Enrich has not run or facts were unavailable) and shows a revision notice when the planner rewrote nodes.
  • Acceptance root tests are held to a quality gate. The coverage stage flags tests that never exercise the built binary as acceptance_vacuous and asks the model to repair them, the planner refuses commands that cannot fail for the right reason (masked_failure, success_echo, placeholder, undefined_variable, curl_unasserted, jq_unasserted, print_only), a weak test left after the fill rounds stops the plan before approval, APPROVAL.md gains a Quality column, narrative acceptance bullets get a Go test acceptance/<id>_test.go run against a serve declaration kept in coverage.json, plain go test commands are judged with go test -json, and at Wave 0 each server-exercising root test must fail against the stubs or the run stops with acceptance_not_red.
  • Five new example briefs. gophermind-osx/examples/briefs gains 04-csvstat, 05-retryx, 06-hookrelay, 07-ledger-sync and 08-taskboard, between them exercising every frontmatter option; all validate with no scan warnings.
  • gophermind brief run builds an approved plan end to end. gophermind brief run <run-id> runs a preflight, Wave 0 (types, stubs, the deps step, a scan, the red check and one commit), a leaf loop with a fix-then-next-model ladder and failure classes, waves with integration checks that attribute a failure to the leaves that caused it, a bounded repair loop that reopens only the attributed leaves, and a final landing, printing one status line per event on stderr. With landing: commit the build works on the branch gm/<brief-id> with one exact-path commit per leaf and an empty final commit car...
Read more

v0.9.0

Choose a tag to compare

@jbrahy jbrahy released this 29 Sep 23:59

Added

  • /project plans a brief into a tree on disk. /project <name> <brief-file> now reads the brief in bounded chunks, one fresh-context model call per chunk, so a long brief no longer has to fit one context window. Pass sizes are derived from the model's context window. The tree on disk is the state, so an interrupted run resumes where it stopped and refuses to resume against a changed brief.
  • A question round. While planning, the model asks instead of guessing. /questions walks you through them, you can change an answer later, and only the steps that answer invalidated are re-planned. Open questions block approval.
  • Approve and export. Approving the plan verifies it first and takes a run lock, then writes the legacy ROADMAP.md, assignments.json, SPEC.md and PROJECT.md that /project-execute reads.
  • gophermind brief, the foundations of the v2 brief-to-build feature: brief validate <brief.md> checks a brief's frontmatter against an embedded schema and its required sections (exit 2 for an invalid brief), brief vault set|list keeps secrets in an age-encrypted vault, and brief tree check <run-dir> validates a task tree (cycles, waves, structure). A brief can declare non-secret env variables with defaults; a name in both secrets and env, a name declared twice, or a name the harness reserves (HTTP_PROXY, HTTPS_PROXY, NO_PROXY, GOPHERMIND_NODE, PATH, HOME, GOCACHE, GOMODCACHE, GOPATH, TMPDIR) is rejected. Undeclared secret-looking names produce warnings only. The planner and executor for v2 are not part of this release.
  • gophermind-osx: approve and deny buttons with an auto-approve checkbox, Return sends and replies continue the session, live progress for a running turn, Start Breakdown wired to the live connection, and working Sessions and Model panels.

Changed

  • /project no longer runs the old interview; it plans from the brief you give it.

Fixed

  • A session's working directory was ignored by the server, so work ran in the server's own root. Sessions now run in the folder they were created with. gophermind-osx passes the chosen folder.
  • The model's context could be overrun. A single read_file is capped at 32 KB, TrimToBudget now actually trims a tool-heavy turn, and the agent adopts the context window a server states when it rejects a request, then retries.
  • gophermind-osx: answers rendered twice, the 30 second request timeout killed event streams, tool approvals were never delivered, the transcript was unreadable in one appearance, scrolling landed on text that was not drawn, the Settings panel could not be scrolled to its bottom, and the signed app could not launch because it linked a library from a path other Macs do not have. libui.dylib is now bundled and signed with the app.
  • gophermind brief and the plan tree hardening found in review: node references are confined to ids so a model-written tree cannot write outside its directory, piped multi-line secrets are stored whole, the vault file is synced to disk before it replaces the old one, and the run-directory git exclude works inside git worktrees.

v0.8.0

Choose a tag to compare

@jbrahy jbrahy released this 19 Sep 04:57

Added

  • gophermind-osx — a native macOS desktop app built on libui-ng, a lighter-weight alternative to the Wails-based desktop app for people who just want a window: connection manager (local/remote/multi-tunnel, gocloak OAuth2, Keychain-backed credentials), a chat transcript with streaming, an approval tracker with a Y/N/timeout flow, a collapsible right panel, the model catalogue picker, full session-list CRUD, a pipeline panel with breakdown-seed and live task status, and a settings panel for backends/model preferences/skills/cache. Ships as a signed, dock-icon-bearing .app bundle with the server binary embedded in Resources; settings persist under ~/.gophermind and survive upgrades and reinstalls. The menu bar gets a real status item too — a gopher-head glyph (not placeholder text), a File > Examples menu pointing at sample pipeline briefs, and the window launches maximized by default.
  • Run a session on another machine. The desktop app can now point a session at a remote gophermind serve instead of its own embedded one, so the work happens on a server while the window stays local. Backends are configured in ~/.gophermind/backends.json; the file does not exist by default and the app behaves exactly as before without one. Which machine a session runs on is shown in the status bar and, crucially, inside every approval prompt: a gated command approved in the window may execute on a server that hosts everything else, so it must never be ambiguous which box a prompt is about.
  • A session list across every backend, so an existing conversation on a remote box can be resumed rather than always starting fresh. One unreachable backend costs only its own rows. Sessions can be renamed or deleted from the list, and now auto-name themselves from the first user message instead of staying "Untitled."
  • Skill sources. internal/skills installs capability packs from a GitHub repository and injects only the ones switched on, managed from a panel in the desktop settings. Nothing fetched is enabled by arriving on disk: adding a source makes its content reviewable, and switching any of it on is a separate decision. Sources pin a commit rather than track a branch, because a repository can be rewritten after it was reviewed. A pack committed to a repo's own .gophermind/skills stays always on, which is the consent CLAUDE.md already carries.
  • humanize tool — rewrites prose to remove AI writing tells, using the vendored blader/humanizer skill as its system prompt. It is a tool rather than an injected skill so its ~7k tokens of guidance cost nothing until it is called.
  • Vendored skill packs for tdd, code review and bug diagnosis, from mattpocock/skills (MIT).
  • Each session gets its own working directory on the server (/serve), rather than sharing one process-wide root.
  • /project can seed its interview from a brief file — /project <name> <path-to-brief> reads the file and asks questions that fill its gaps instead of starting cold. Sample briefs (a CLI tool, a REST API, a menu-bar app) ship for both the desktop app's Pick Brief... button and the CLI/TUI (examples/phase-flow/briefs/). /project's own generated plan now asks for depends_on/is_contract up front, matching what the wave-based executor (0.7.0) already knows how to run.
  • /project-execute shows live per-task tool activity as it runs — each task's tool calls/results stream to the transcript prefixed with the task id, instead of only appearing after the whole task finishes. It also carries the same <phaseflow-context> preamble (resolved config, roadmap progress) every interactive /phase step already gets, and a Ctrl-C mid-run now reports a tally of what finished before the cancel instead of a bare "cancelled." /config can change the speed-tier model live, without a restart.
  • A 429 from the model provider now falls through to the next candidate model instead of failing the whole turn.
  • Verbose debug mode showing every event with readable, unescaped formatting; a status bar that says what a turn is doing and for how long.

Fixed

  • gophermind-osx would crash on launch outside of open — main() never pinned the process to its start-up OS thread, so a blocking HTTP call during backend connect could resume the main goroutine on a different thread than Cocoa's, and the first AppKit call afterward (creating the menu-bar status item) crashed with "NSWindow should only be instantiated on the main thread!"
  • gophermind-osx: local mode no longer lets the spawned server default its root to the current working directory; window edge margin, bundled-server-binary lookup, and panel captions corrected.
  • DELETE /session mapped every error to 404, including a real disk failure deleting an existing session, not just "the session doesn't exist." Now distinguished via a session.ErrNotFound sentinel; a genuine failure reports 500.
  • HMAC signature verification ran on bodyless GET/DELETE session requests. Signing an always-empty body isn't weaker protection, it's a broken one: the resulting signature is a fixed value for a given secret, replayable on any other GET/DELETE afterward. HMAC now only applies to POST/PATCH, where there's an actual payload to protect.
  • iOS: pull-to-refresh silently did nothing when the session list was empty (.refreshable needs a scrollable container, and the empty state had none); a second approval push for the session already open pushed a duplicate nav layer instead of updating it.
  • Conversation history no longer grows unbounded (trimmed to prevent stale errors from accumulating); the context window widened to 50 messages with an explicit turn-completion marker; a tool call now aborts after 3+ consecutive failures or once its result stops changing between retries, instead of looping.
  • An empty skill catalogue serialized as null instead of [], which broke the settings panel.
  • A contract-flagged task in wave 0 could be dropped by AssignWaves; the run report now sees pre-revision attempts it previously lost; a contract flag stops the run rather than just failing the pass.
  • Several model-attribution bugs: two paths misreported which model actually served a turn; the free-usage odometer metered the configured model rather than the one that ran; a corrupt model-settings file was swallowed instead of reported; the exclusion list wasn't applied to the model already in use.

Security

  • SSE error events are sanitized to prevent injection via error message content.
  • The shell safety check now properly parses redirect targets (a redirect to /dev/null was previously misclassified as unsafe); GIT_* environment variables are stripped from both shell tools' environments so an inherited GIT_DIR can't redirect a git subprocess.
  • A skill source URL whose path escaped the skill cache is rejected before install, both at the source-id derivation step and with a second check on the final destination.

v0.7.1

Choose a tag to compare

@jbrahy jbrahy released this 12 Sep 05:41

Changelog

  • a802fa3 docs: close out 0.7.0 in the changelog and record 0.7.1
  • e2ae342 fix(packaging): use the non-deprecated depends_on form in the cask template
  • 4e2fb8a fix(desktop): stamp the real version and build date into the app bundle
  • d30905d fix(deploy): derive the dev version from the tag instead of hardcoding it

v0.7.0

Choose a tag to compare

@jbrahy jbrahy released this 11 Sep 22:41

Changelog

  • 22f980e feat(release): ship the desktop app signed, notarized and stapled
  • 013ab45 docs(site): add the desktop app and model picker to the feature list
  • 07d30b9 Merge branch 'feat/model-picker' into main
  • 99ad9fc Merge branch 'main' into feat/model-picker
  • f139821 docs: record this branch's work in the changelog
  • 28954cc feat(freellm): meter every turn, not only the CLI's one-shot path
  • b01ff77 feat: wire wave assignment and the revision breaker into the run loop
  • 5a559c7 fix(modelcat): report a corrupt settings file instead of swallowing it
  • 813a3a4 fix(freellm): stop a failed odometer read from destroying the reading
  • c4769d3 fix(phaseflow): keep a contract task in wave 0 through AssignWaves
  • f19f613 feat(serve): make the pipeline dashboard actually live
  • f26622f test(phaseflow): make the Save-vs-Update guard actually exercise Save
  • 49a9007 fix(modelcat): apply the exclusion list to the model already in use
  • 285ea73 fix(desktop): give each session turn its own client for its own model
  • 8ac4599 test(desktop): pin that concurrent turns keep their own model
  • 478d11f fix(modelcat): stop LoadSettings failing open on an unreadable file
  • c488249 fix(tui): stop rendering a contract flag as a success
  • 1481317 fix(desktop): refuse gated tool calls on the one-shot run routes
  • f847688 fix(serve): let Ctrl-C reach the graceful shutdown path
  • bcaadf6 fix(phaseflow): let a contract flag stop the run, not just the pass
  • 4644b19 fix(desktop): stop typed text from deciding a pending approval
  • 56bed65 fix(llm,orchestrate): stop two paths that misreport which model ran
  • 5c4ed57 fix(phaseflow): hold a wave slot until the task's side effects are on disk
  • 39f7716 fix(orchestrate): keep candidate models on the endpoint that can serve them
  • 351d339 fix(freellm): meter each model against its own published quota
  • cda17ce fix(serve): escape the dashboard's text last, and add a CSP
  • d34549b security(tools): strip GIT_* from both shell tools' environments
  • f07fddb fix(phaseflow): keep pre-revision attempts so the run report can see them
  • b345d50 feat(serve): add the live pipeline dashboard at GET /pipeline
  • 38b1f39 feat(serve): add pipeline state and live event routes
  • 7fca813 feat(phaseflow): add end-of-run model performance summary
  • 98ad142 fix(orchestrate): give each task agent its own client, not a shared one
  • 8b50df5 feat(orchestrate): add LLMReviser, an LLM-backed phaseflow.Reviser
  • ea38984 feat(phaseflow): wire the revision circuit breaker into the run loop
  • dce3293 feat(phaseflow): add the Reviser seam and ApplyRevision
  • 5d89780 docs: plan pipeline piece 5, live view and run summary
  • 6bc6b98 docs: plan pipeline piece 4, the revision circuit breaker
  • 5a73801 refactor(phaseflow): report attempts through a callback, not a shared field
  • ba89363 feat(phaseflow): add the contract flag and Task.IsContract
  • 40851bd feat(phaseflow): run each wave's tasks concurrently, bounded by a limit
  • 368d76b feat(phaseflow): add AssignWaves, a pure DependsOn -> wave computation
  • e8c2a77 docs: plan pipeline piece 3, waves and parallel execution
  • 2cf599e fix(phaseflow,tui): stop reporting an exhausted task as a success
  • 2aa9370 feat(phaseflow,orchestrate): persist attempts and wire model-picker fallback
  • 8b16bc4 fix(phaseflow): keep round retries away from needs_revision/escalated tasks
  • 680c1c9 feat(phaseflow): add FallbackRunner for sequential per-task model fallback
  • 0430cc5 docs: plan pipeline piece 2, per-task model fallback
  • 694ec78 fix(phaseflow): lock Save too, so it cannot clobber a concurrent Update
  • e544d20 feat(phaseflow): add wave, dependency, candidate-model and attempt history fields to Task
  • 65b22a8 fix(phaseflow): make the assignments store concurrency-safe
  • f5a6d6c refactor(lockfile): extract the file-claim pattern for reuse
  • d50597f docs: plan pipeline piece 1, task model and a safe store
  • d0e1b65 docs: design for the contract-first task runner pipeline
  • 41a67e0 feat(desktop-ui): model picker dropdown and settings panel
  • d2cadb1 feat(desktop): apply the model picker's policy before each turn
  • 055e02f feat(modelcat): add Next, the pure model selection policy
  • 6ee7ed5 fix(modelcat): do not derive a model link from a routing variant
  • a1620f7 feat(serve): expose the model catalogue and settings over HTTP
  • 8b38e6a feat(modelcat): assemble the model catalogue
  • dcca922 feat(modelcat): settings store for model preference and links
  • 2e7828d docs: plan model picker phase 3, selection policy and UI
  • d602cc2 docs: plan model picker phase 2, catalogue and settings API
  • befdfc1 fix(freellm): meter the model that served the turn, not the configured one
  • 50d42a8 feat(freellm): per-model trip meters, and record the model per turn
  • f288041 feat(freellm): meter usage per model, additively
  • 1ff718b test(freellm): pin odometer backward compatibility before adding per-model
  • 2ea12e8 docs: plan model picker phase 1, per-model metering
  • 42ca4b3 fix(release): disable winget/scoop, document the ambiguous-identity trap
  • d52655a fix(release): notarize before publishing, not after
  • 6f5a9fc docs: custom model and provider URLs, and one settings object
  • 8df6266 docs: make every model-picker judgment call a setting
  • 7bb9543 docs: spec the model picker, per-model metering and proactive cycling
  • 53b3b93 fix: stop inherited GIT_DIR from redirecting git subprocesses
  • 872a517 feat(desktop): wire real human approval into the embedded server
  • 0f46363 security: drop the author email from desktop/wails.json
  • 6cc97e3 fix(desktop): allow the WebView's real origin so the app can reach its server
  • c7616b8 fix(desktop): stop the 5-minute startup hang, fall back to a free LLM provider
  • 26650bd feat(desktop): scaffold the Wails shell with an embedded serve instance and a working Chat screen
  • 3037b7f refactor(serve): split NewMux from Serve, add graceful shutdown
  • a58985f refactor(serve): move the HTTP serve layer to internal/serve
  • 1269ce6 docs: plan the internal/serve extraction (desktop app Phase 0)

v0.6.0

Choose a tag to compare

@jbrahy jbrahy released this 11 Sep 05:27

Changelog

  • c180f2d docs: changelog for v0.6.0
  • 487387b fix: stop inherited GIT_DIR from redirecting git subprocesses
  • 22fb889 Merge branch 'feat/free-llm-providers' into main
  • f7bd1e4 fix: final-gate fix wave for feat/free-llm-providers (7 items)
  • 1dad20d feat: sync script, generated provider docs, and affiliate policy
  • 87176fc fix(freellm): mark free-llm7 unsupported, no anon model supports tools
  • 1da94ee feat(tui): attribute the active model to its free provider
  • 3d2b276 fix: let free providers complete a turn via an explicit ChatPath
  • ce0f5d4 feat: record free usage into the odometer
  • 7e99e87 feat(cli): add gophermind free (list, show, check, usage)
  • 9733ddd feat(config): resolve free-* profiles from the vendored registry
  • ec76c00 feat(freellm): probe an endpoint's model list
  • 004e09d feat(freellm): provider attribution with enforced referral disclosure
  • 0c30cfb feat(freellm): trip meters derived from the odometer event ring
  • f25c752 docs: correct the odometer's monotonicity claim in the spec
  • 0435f9b feat(freellm): monotonic free-usage odometer with event ring
  • 5c21d47 feat(freellm): parse upstream rate limits into structured quotas
  • e151eb7 feat(freellm): compatibility table with upstream drift guard
  • ea19953 feat(freellm): vendor and parse the free-provider registry
  • a02136a docs: implementation plan for free LLM providers
  • 9ff5150 docs: trip meters derive from own event ring, not usagelog
  • 56faa37 docs: spec GopherMind desktop application (Wails v2)
  • 27dc99d docs: spec free-usage odometer and per-quota trip meters
  • 1c7f6ff docs: spec free LLM provider registry and model attribution
  • 545e638 docs: fix two dead links in the README
  • f2d465d feat(tools): add invalidate_fact for facts auto-supersede cannot catch
  • 0672a0a feat(tools): remembering a fact retires the older phrasings of it
  • 0d58118 feat(embed): give vectors a validity window and skip retired ones in TopK
  • 33e3ea6 security: scrub PII from tracked files (server IP, Team ID, email, path)
  • 3b1a616 fix(tools): write_xlsx — mkdir parents, 0644 perms, reject dup sheet names & non-scalar cells
  • 91f979d feat(tools): wire write_xlsx into the toolset and gate it
  • 71a3732 feat(tools): add write_xlsx tool for multi-sheet Excel output
  • 03a60ac chore: gitignore .worktrees/ for isolated feature work
  • 40c49a9 docs(plan): implementation plan for write_xlsx tool
  • 27913f2 docs(spec): design for write_xlsx tool (agent-callable, multi-sheet)
  • eca08f5 fix(llm): widen retry window to survive transient LAN blackouts
  • 50c3de1 feat(site): landing page for gophermind.com on GitHub Pages
  • 5dd3a55 fix(readme): replace the banner art with the TUI gopher
  • e70846b feat(release): one-command public release to GitHub, Homebrew, and npm
  • 465ffa2 feat(mcp): connect gophermind to third-party MCP servers
  • d85fa46 docs(mcp): design spec for an MCP client in gophermind
  • 4a3b595 fix(tools): stop sourcing the login profile on every run_shell call
  • 5117b7b feat(cli): add gophermind autocomplete with shell detection
  • c772da6 feat(tui): flash the screen inverse when gophermind is waiting on you
  • 2a1038d fix(agent,tui): repair mis-escaped tool arguments; honor /exit in every state
  • b36fa67 feat(config): move the global config to ~/.gophermind/config.json
  • 8d241fe fix(tui): wrap transcript lines and stop the input box growing a stray row
  • 802410b feat(scripts): add gophermind-setup-link pairing link generator
  • 1308058 docs(plans): rewrite the port plan as a sized execution backlog
  • d036467 docs(plans): review the Hermes/OpenClaw port plan against source
  • 3bbdabc docs(plans): refresh Hermes/OpenClaw analysis against 2026-07-29 sources
  • 1fe9add fix(orchestrate): let policy and the audit chain reach unattended task agents
  • cfc3a14 docs(plans): Hermes/OpenClaw feature analysis and gophermind port plan
  • 6c3d2be merge: RAG/memory injection in serve, repo-scale indexing, iOS test output
  • c134dee fix(ios): keep xcodebuild's unfiltered output when the test run fails
  • 090f6c1 feat(retrieval): inject RAG/memory in serve, and make indexing survive real repos
  • 9059871 docs(examples): worked PhaseFlow project spec under examples/phase-flow
  • 873c3db feat(secaudit): security bug-hunt command for any repo
  • 6dae7e5 docs(design): secaudit security bug-hunt spec
  • b96296f feat(deploy): fail-closed test gate that runs automatically before every deploy
  • f81a5ff test(tui): cover the /index and /optimize command handlers
  • 5db1496 feat(sessions): rename and delete sessions from the iPhone
  • a81c90b feat(execute): refresh CONTEXT.md per task and feed it to the next one
  • 727c06a fix(tui): stop Alt+Enter from inserting a newline by default
  • 454875b feat(project): prepopulate interview answers from repo context
  • 083da3a fix(project): stop showing the raw interview JSON to the user
  • 8109bb2 feat(optimize): profile-based .env tuning, /index and /optimize, auto-index on load
  • c4d1ebc feat(index): static code index (INDEX.md), index tool, per-task refresh
  • 2286ef8 feat(project): one-question interview, PROJECT.md spec block, TDD tasks
  • 15a0594 feat(phaseflow): PROJECT.md spec block + bounded retry rounds
  • 93485d7 docs(design): /project autonomy spec (one-question interview, PROJECT.md block, TDD tasks, retry rounds)
  • d175ad9 fix(agent): abort a turn when the model stops making progress
  • f8c4006 feat(tui): recall previous prompts with Up/Down
  • f6c7f8c feat(banner): give the gopher exaggerated buck teeth
  • 9720d5a Merge branch 'feat/llm-timeout' into main
  • 4086842 feat(config): honor GOPHERMIND_LLM_TIMEOUT on LLM completion requests
  • eab96c5 Merge branch 'feat/go-pher-it-logo' into main
  • 13fe59d feat(design): add "Go Pher It" SVG wordmark (light + dark)
  • 6019975 fix(banner): center "GO PHER IT" tagline under the gopher art
  • f82c143 feat(banner): show "GO PHER IT" tagline under the gopher at startup
  • 3454c1d feat(banner): add "GO PHER IT" ASCII tagline wordmark
  • 9d2e853 docs(plan): implementation plan for "Go Pher It" logo
  • b7da0fd docs(design): spec for "Go Pher It" logo (ASCII banner, SVG wordmark, raster)
  • 5d4fb08 feat: per-session MODE (coding/conversational/personas) + config visibility
  • fed68e6 feat: per-session model selection (server + iOS)
  • 391d96e build(ios): add 'make ios-deploy' + ios/deploy.sh (auto-detects device, offline-signs)
  • 5cf8ab9 build(ios): add 'make ios-test' + ios/test.sh (auto-picks a simulator)
  • 5e2e82f test(ios): scrub real serve-token prefix from pairing test (public repo)
  • f44142e feat: session-history replay (server endpoint + iOS render)
  • 3b8f2ec fix(ios): SSE frames never parsed — bytes.lines drops the blank delimiters
  • cff547e fix(ios): show session ID (repo name) in the list, not the seed-prompt title
  • 8b9ef28 feat(ios): one-tap setup via gophermind://setup link + QR pairing
  • 12177c5 fix(ios): tolerate Go nanosecond timestamps + add Connection Debug page
  • 4e069d8...
Read more

v0.4.0

Choose a tag to compare

@jbrahy jbrahy released this 13 Jul 20:11

Changelog

  • 6380400 docs: cut CHANGELOG 0.4.0 (intro + config wizard)
  • 0257fff feat(intro): short animated gopher intro before the TUI
  • b9c08c0 feat(tui): finish the interactive /config wizard
  • ca38bc9 docs: new full-body gopher header art in README

v0.3.0

Choose a tag to compare

@jbrahy jbrahy released this 12 Jul 20:43

Changelog

  • 09b0e0f Merge pull request #1 from jbrahy/feat/phaseflow-integration
  • e35c521 docs: cut CHANGELOG 0.3.0 for the PhaseFlow release
  • 0fe3457 fix(phaseflow): flip the leftmost checkbox, not a marker in the description
  • aa2eccb fix(phaseflow): patch review findings (path traversal, error handling, privacy)
  • b8c3a2c docs: add PROJECT.md conventions; gitignore local session state
  • 8c6c8e2 docs: document phase done/sync/archive and full command surface
  • 5babd29 docs(phaseflow): sharpen code comments to explain intent, not restate code
  • ebdd370 feat(phaseflow): port deterministic state & milestone bookkeeping to Go
  • 66dff35 feat(phaseflow): make the full embedded command surface runnable
  • b27fdca docs: document PhaseFlow integration (README, CHANGELOG, CREDITS)
  • 9c20516 feat(phaseflow): wire /phase TUI slash command
  • dba61a1 feat(phaseflow): wire gophermind phase CLI subcommand
  • be40993 feat(phaseflow): command engine (init, status, next, step prompts)
  • 67ebb94 feat(phaseflow): embed vendored PhaseFlow command/agent/template assets
  • 052f145 feat(phaseflow): native state model, roadmap parser, and config
  • 3663538 docs: sync README/CHANGELOG/CONTRIBUTING/RELEASING with v0.2.0

v0.2.0

Choose a tag to compare

@jbrahy jbrahy released this 11 Jul 08:44

Changelog

  • db0d93f style: gofmt the batch-4 additions
  • 38f3cba fix(security): contain LSP file path (traversal) (AK#81)
  • 6160466 feat(tools): read_parquet columnar-file reader (AD#17)
  • 037c2be feat(ui): fleet status view (AJ#75)
  • 766d246 feat(tools): sandboxed WASM tool runner (AL#94)
  • 8a78cc4 feat(lsp): Language Server client + find_definition (AK#81)
  • 4d104cb fix(security): harden db_query read-only + DSN allowlist (AD#11)
  • 155979e feat(agent): resumable step execution (AE#29)
  • 3ca19cd feat(agent): reflexion loop (AE#27)
  • 902a1a4 feat(project): extractive context compression (AF#39)
  • 784f661 feat(abtest): multi-model scoreboard + leaderboard (AF#32)
  • 0fa7f2d feat(tools): read-only multi-engine SQL (Postgres/MySQL) (AD#11)
  • 1bc339b feat(tools): container-exec + netns shell isolation (AI#61, AI#62)
  • e9985d1 feat(oauth): device authorization grant flow (AH#54)
  • 177f0b0 fix(security): VS Code extension ignores workspace binary override (AK#83)
  • c4c34e4 feat(cli): event-driven --watch trigger (AH#57)
  • 766bc1c feat(agent): task-graph planner/executor (AE#22)
  • 66f55b0 feat(setup): wizard prompts for integration credentials (AK#89)
  • 6f58350 feat(cli): --every recurring scheduler (AH#56)
  • 78ab058 feat(editors): thin VS Code + Neovim clients (AK#83)
  • 4061394 feat(update): checksum-verified self-upgrade (AL#97)
  • 558e109 build: reproducible builds (-trimpath) + SBOM (AL#98)
  • 4f5016c build: deb/rpm/apk + scoop + winget packaging (AL#96)
  • ebb4479 feat(bundle): shareable config bundles (AL#95)
  • 803a3b4 feat(tools): hybrid_search (BM25 + vector fusion) (AC#8)
  • d856e54 feat(session): shared remote store push/pull (AG#45)
  • ac891ce feat(tools): plugin marketplace install (AL#92)
  • d1274c9 feat(benchmark): standardized task set + timed harness (AL#100)
  • 6708539 feat(telemetry): opt-in, local-only usage counters (AL#99)
  • cb2f16e feat(tools): out-of-process plugin SDK (AL#91)
  • 844c14e feat(mcp): expose tools as an MCP server (AL#93)
  • 1e57e67 feat(ui): fuzzy command palette (AK#85)
  • 6b2ebbe feat(trace): dependency-free span tracing (AJ#71)
  • 644f359 feat(ui): markdown/code syntax highlighting (AK#86)
  • c9e5e77 feat(ui): colorized unified-diff renderer (AK#82)
  • 3600732 feat(agent): debate/consensus mode (AE#21)
  • ebc3024 feat(tools): episodic memory (AE#25)
  • 595631f feat(agent): heuristic tool-use critic (AE#23)
  • 3f3ce68 feat(agent): subtask budget allocation helper (AE#28)
  • 240fb88 feat(cli): cost-aware model routing (AE#26)
  • f7d5b51 feat(ab): prompt regression gate via --min-score (AF#34)
  • 92581e2 feat(safety): audit log shipping to a collector (AI#66)
  • 636828f feat(abtest): pluggable LLM-judge scorer (AF#33)
  • 41076b4 feat(safety): secrets-file resolution for tokens (AI#63)
  • 19995b6 fix(security): RBAC fails closed on unknown role (AI#64 follow-up)
  • ecbe653 feat(tools): read-only Jira tool (AH#53)
  • 51e81a3 feat(tools): docs_lookup with per-version caching (AC#4)
  • da502af feat(prompt): answer-with-citations when web search is enabled (AC#6)
  • 4347ee5 feat(safety): approval timeout auto-deny (AI#70)
  • d47d84d feat(safety): role-based access control for tools (AI#64)
  • 7bce884 feat(tools): Slack/Discord notifier (AH#52)
  • 17862d4 feat(tools): read-only GitHub API tool (AH#51)
  • 48e1ffe fix(security): serve sibling-path parity + SSE injection + migration sandbox
  • 9c133ec feat(tools): migration_dryrun schema-diff preview (AD#14)
  • 8e4dd78 feat(serve): SSE streaming endpoint /run/stream (AH#58)
  • 943364c feat(tools): global profile memory across repos (AG#49)
  • b327a4b feat(serve): Prometheus /metrics endpoint (AJ#72)
  • 8622829 feat(tools): embedding re-ranking of web_search results (AC#5)
  • 3e80dfc feat(prompt): named prompt registry with versioning (AF#31)
  • 3b04766 feat(test): golden snapshot helper + default-prompt golden (AF#40)
  • a3463c2 feat(session): turn-by-turn replay viewer (AG#46)
  • 36e89d4 feat(agent): auto-checkpoint before gated mutations (AG#44)
  • 3fde18d feat(usage): cumulative budget alerts (AJ#74)
  • 3f3f9c7 feat(usage): cost dashboard via usage report (AJ#73)
  • 387e093 feat(embed): incremental index updates via git (AC#7)
  • 71d3b5e feat(embed): retrieval_eval hit@k scoring (AC#10)
  • 129cfae feat(tools): knowledge packs via import_pack (AC#9)
  • ee91708 feat(tools): long-term vector memory (AG#41)
  • cad189d feat(agent): RAG context injection from the semantic index (AC#3)
  • cf091c1 feat(tools): embed_index + semantic_search over a local vector store (AC#1)
  • 5227028 feat(embed): OpenAI-compatible embeddings provider + vector similarity (AC#2)
  • b3cd9a7 feat(fewshot): task-relevant few-shot example bank (AF#36)
  • b066959 feat(safety): prompt-injection defense for fetched content (AI#68)
  • c8056bc feat(tools): detect_anomalies outlier detection (AJ#80)
  • fefbce4 feat(report): --report writes self-contained HTML run report (AJ#79)
  • 5b2f8c6 feat(llm): slow-request tracing middleware (AJ#77)
  • a17cbbd feat(agent): self-consistency sampling (AE#24)
  • 83c2192 feat(session): per-tag GC retention (AG#50)
  • 4fade2a fix(tools): make apply_patch truly atomic with rollback (AK#84)
  • 30dc81f feat(session): merge branched sessions (AG#42)
  • 7ad7892 feat(session): redacted export (AG#47)
  • ccc69a7 feat(tools): openapi_ops spec operation lister (AH#60)
  • bdc787f feat(llm): JSON HTTP request logging (AJ#76)
  • 208e754 feat(doctor): doctor fix auto-remediation (AK#87)
  • d6eba88 feat(llm): record/replay transport for hermetic tests (AE#30)
  • 6e06070 feat(cli): --dry-run previews mutating tool calls (AK#90)
  • 84ff078 feat(tools): seed_data INSERT generator from schema (AD#19)
  • aa6ae87 feat(persona): custom persona scaffolder + resolution (AF#35)
  • 8164399 feat(safety): policy-as-code test harness (AI#67)
  • f318a0a feat(safety): HMAC-signed audit log (AI#65)
  • 0fb883e feat(serve): per-caller rate limiting (AH#59)
  • fd8f91e feat(serve): HMAC payload verification (AH#55)
  • 4138922 feat(cli): shell completion generator (AK#88)
  • 96277ba feat(serve): /healthz and /readyz probes (AJ#78)
  • 2e81527 feat(tools): data-egress classifier for http_request (AI#69)
  • fd19c4f feat(session): full-text search across saved sessions (AG#43)
  • 7d8f975 feat(session): tags + filtered listing (AG#48)
  • fe5dc60 feat(schema): built-in schema library for --schema @name (AF#38)
  • 6c3d374 feat(prompt): per-section token accounting + prompt-tokens cmd (AF#37)
  • 8577b08 feat(tools): opt-in sql_query result cache (AD#20)
  • b906406 feat(tools): log_metrics time-bucketed log counts (AD#18)
  • 0dc0999 feat(tools): data_transform for CSV/JSONL filter/group/aggregate (AD#15)
  • 993949a feat(to...
Read more

v0.1.0

Choose a tag to compare

@jbrahy jbrahy released this 09 Jul 09:53

Changelog

  • c8a7aae fix(release): drop signs block; notarize published macOS archive in Makefile
  • c3b6d3c fix(release): notarize signs step produces no .sig (output: false)
  • e1f503d feat(dist): npm package + Linux/Windows release builds
  • ddc0ffa feat: --version flag (conformance) + OpenCoven PR draft
  • d202178 feat(print): system-prompt append, permission-mode, and OpenCoven manifest (SP3+SP4)
  • 48ac9fa feat(print): session persistence with --session-id and --resume (OpenCoven SP2)
  • 87d765f feat(print): Claude-Code-compatible stream-json protocol (OpenCoven SP1)
  • 98ac6c4 docs: add a real README and CONTRIBUTING guide
  • 2261894 feat(startup): show a fortune, version, and recent changes under the gopher
  • 76e38a3 fix(release): auto-source GITHUB_TOKEN from gh and require signing vars
  • d0d643c chore(gitignore): never commit credentials.md or signing keys
  • 57bb852 fix(release): make signing skip cleanly on credential-free snapshots
  • 12c3f39 chore: remove scratch cmd/hello hello-world
  • b81c27a docs: add backlogs, prompt-system plan, and session notes
  • bd5ccc1 feat(config): first-run setup wizard, global config, and no baked-in endpoint
  • bb1d8dc feat(release): signed+notarized Homebrew release pipeline and version command
  • a00207f feat(tui): stop OSC-11 background-query leak and add gopher banner
  • 4749760 chore: ignore the compiled gophermind binary
  • 73d9f8d docs(security): queue streaming-cancellation entry for deploy
  • a9f66aa feat(stream): polish mid-stream cancellation across llm, agent, and TUI
  • fce2394 feat(llm): request/response middleware hooks for the HTTP client
  • e475577 feat(llm): optional mutual-TLS and custom-CA for secure internal endpoints
  • 3d76201 feat(agent): add JSONL transcript export of full message history
  • bfec093 feat(sampling): per-request temperature/top-p override via config and /temp TUI command
  • 75b8eba feat(llm): fallback model chain for graceful degradation
  • 47cd95c feat(llm): probe model capabilities (context window, tool support, max output)
  • fc83a95 feat(llm): response caching by prompt hash with TTL
  • d3e3471 feat(llm): automatic retry with bounded exponential backoff
  • 330470c feat(config): named provider profiles selectable by --profile
  • 418a4da feat(llm): streaming token usage & cost meter
  • 14bc566 docs(security): coordination note — cwd done, remaining items owned by live fleet
  • dc39f38 docs(security): audit log, report, and staged deploy queue
  • 0a49387 fix(safety): close sandbox escapes — symlink containment, search arg injection, deny-list bypass
  • 61f8d63 feat(tui): full-screen alt-screen layout with scrollable viewport
  • 9281594 chore: add bin/build.sh to build and launch gophermind
  • dd4858f fix(cli): guard args[1:] so bare invocation doesn't panic
  • 8b25eaa feat(tui): commit finished output to scrollback; teatest e2e
  • 4ce4129 feat(tui): launch TUI for interactive mode; TTY guard; drop line REPL
  • dafa2a7 feat(tui): Bubble Tea interactive session (model, update, view, run)
  • b9f0749 feat(agent): stream prose as token events; add Reset
  • 4f549f8 feat(llm): streaming completions with tool-call reassembly
  • dbc34b0 docs: TUI implementation plan
  • 8c8a1d1 docs: TUI design spec (Claude Code-style interface)
  • 4ebfa1d feat: gophermind agentic coding harness baseline
  • e4adcc5 chore(small-feature): auto-commit after workflow-template
  • da30e25 docs: create roadmap (9 phases)
  • 3715313 docs: define v1 requirements
  • 7a0fbff docs: complete project research
  • e6fceaa chore: add project config
  • ce89b0d docs: initialize project
  • ccaf136 first commit