Changelog¶
Changelog¶
All notable changes to greatminds are documented here. Format follows Keep a Changelog loosely; versions follow SemVer once 1.0.0 ships.
1.3.2 — 2026-05-27¶
Followup cut after the 1.3.0 BREAKING stand-stream redesign + 1.3.1 emergency wake fix. Five verified tasks merged on local main; all empirically validated via real avatar SSH stand probes (no shape-only evidence).
Fixed¶
-
0258 — complete BREAKING removal of stand-stream runtime. CLI now rejects
--stream standand--kind stand_requestwith rc=2 +stream=stand removed in 1.3.0message;greatminds setupno longer scaffoldsstand_{requests,wip,done}/directories;coordd._build_inotify_dirsdrops the legacy queue watches; newgreatminds migrate-stand-historyCLI moves pre-1.3.0stand_done/*artifacts undercoordination/archive/stand-history/(idempotent, supports--dry-run). -
0268 —
_evaluate_gate_checkreads lease evidence first. Pre-fix, a lease-evidence-carrying task could seegate-checkreturnpassfrom the lease while_check_gate_for_stand_requiredreturnedmissingfrom the same task data (the latter only knew about removedstand_done/<id>.yamlfiles). Nowextract_lease_evidence_from_testsis probed first; the legacyfind_stand_evidencepath remains as a fall-through for any in-flight pre-migration tasks. -
0267 —
greatminds setupbakesautoMode.allow+ ops perms from schema canon.data/schema.yamlnow declares the fullclaude_settings.autoMode.allow(Bash(git push origin main:*)+--follow-tagsvariants) andclaude_settings.permissions.allow(ssh / scp / rsync / git revert) under one source of truth._build_settings_local_jsonpopulatesautoMode.allowfrom schema instead of a hardcoded list;_ensure_claude_settings_localadditively merges new canonical entries on existing fleets — the operator's own additions and Stop/UserPromptSubmit hooks are preserved; repeat runs reportunchanged. -
0269 — coordd inotify
.standevents route to STAND-KEEPER..standwas anINOTIFY_QUEUE_DIRSentry but not listed inschema.queues, so_owning_role_for_queue('.stand')returnedNoneand_route_queue_eventsilently dropped state.yaml writes. Schema now declares.standwithowner: STAND-KEEPER,writers: [STAND-KEEPER, TESTER, ARCHITECT-PLANNER, MAINTAINER],kind: state. Lease delivery latency drops from waiting on SK's own ScheduleWakeup tick to coordd-pushed viapress_enteron the input_sock. Thekind: statemarker keepswatchdog(active-only) andwake_check(terminal-only) iterations untouched. -
0271 —
greatminds stand leaseenforces per-task worktree at acquire. Pre-fix the only worktree enforcement was SK's runtime whitelist; the CLI accepted any--worktree, flipped state.yaml topreparing, and only SK rejected later with a self-modify reason, leaving an orphaned lease. Now schema declaresstand.resource.lease.worktree_constraint(pattern{project_dir}/.worktrees/{seq}[-slug],enforced_by: cli) andstand.py:_validate_lease_worktreerejects at acquire with rc=2 + named-rule errors: empty/None, main-tree (with paste-readygit worktree addrecipe), wrong parent, wrong basename. Relative paths resolve viaPath(...).resolve(strict=False). state.yaml is not mutated on reject.
1.3.1 — 2026-05-26¶
Emergency cut. Single fix: 0259 — coordd's chat-mode inotify wake now reaches the claude TUI input handler.
§9.1 self-blocker carve-out: the fix's deployment IS the
verification mechanism (gate_check on 0259 was irreducibly blocked
because SK couldn't deploy 0259 to verify itself — the broken wake
channel was the verification channel). Same pattern as the 1.2.6
cut. Empirical evidence recorded inline in 0259's tests block:
direct press_enter probe on READER returned ok=True with
input_sock channel + leaf SIGINT; end-to-end probe (filed
feature_inbox/9999.yaml → coordd inotify → press_enter →
input_sock → SIGINT to PLANNER's own Bash subprocess exit 130)
confirms the full chain.
Fixed¶
- 0259 coordd inotify wake uses
input_sockviapress_enter. Pre-0259, coordd's chat-mode wake (tmux_send_keys_wake) sent bracketed-paste text + Enter viatmux send-keys, but the TUI input handler on claude panes intermittently never received the submit (visible prompt, no turn-fire). Replaced withpress_enterwriting the wake payload to the role's pty-trackedinput_sockand SIGINTing the leaf=node descendant — same channel that DEV/OPERATOR keystrokes flow through. _send_enter.pyalignment withcoordd.WAKE_*constants (PLANNER follow-up)._WAKE_GAP_S0.2 → 0.35 (mirrorscoordd.WAKE_GAP_SECONDS, production-proven viapush_to_role)._KEY_TO_BYTES['Enter']b'\r'→b'\r\n'(mirrorscoordd.WAKE_ENTERCRLF; bare CR fails claude TUI submit detection intermittently).
Removed¶
coordd.tmux_send_keys_wakefunction and its_LAST_TMUX_NUDGErate-limit table +_read_event_wake_schemahelper. All chat-mode wakes now flow throughpress_enter.
Upgrade¶
pip install --upgrade greatminds==1.3.1
greatminds restart --bootstrap
1.3.0 — 2026-05-26¶
BREAKING. Stand-stream redesign: the legacy three-queue model
(stand_requests/ → stand_wip/ → stand_done/) is replaced by a
lease-based singleton stand resource backed by
coordination/.stand/state.yaml. Operators upgrading from 1.2.x must
drain any in-flight stand_requests/* and stand_wip/* before
pip install --upgrade greatminds==1.3.0; existing stand_done/*
files may stay as historical evidence.
Breaking¶
- Old stand queues removed.
stand_requests/,stand_wip/,stand_done/queue directories are no longer scaffolded bygreatminds setup. All transitions touching them are gone fromschema.yaml, along with thestandtask stream and four stand-stream validators incli/task.py. greatminds stand request/stand resultCLI removed. Replaced by the lease API below.greatminds task new --stream standraises with a pointer at the new CLI.gate_checkreads lease evidence exclusively. The backwards- compatibility fallback tofind_stand_evidence(stand_done scan) is gone. Pre-1.3.0 tasks without alease_idon their tests block returnmissing; refile via the lease API to verify.
Added¶
- Lease-based stand CLI:
greatminds stand lease --task <id> --worktree <path> --profile <enum>— request a lease; returns a UUIDlease_id. FIFO queue when the stand is busy.greatminds stand release --lease-id <id> --result pass|fail|partial— return the stand to free; result is a closed enum (no prose channel).greatminds stand ready --lease-id <id>— SK signals deploy complete; state preparing→ready; inbox-info to holder.greatminds stand down --reason …/stand up --reason …— halt/recovery; queue paused underdown.greatminds stand status— read-only state + queue + history- tail.coordination/.stand/state.yamlsingleton state file with fcntl-protected I/O. Four states (free/preparing/ready/down) and transitions encoded inschema.yaml stand.resource.coorddinotify on.stand/so SK reacts sub-second to state changes instead of polling.- Role canon (
STAND-KEEPER.md,TESTER.md,EXPLORER.md) rewritten for the lease lifecycle. SK input is structured-only (--task,--worktree,--profile); SK never seeswhat to testby design (information asymmetry forces TESTER ownership of probes). - Public docs: new
docs/concepts/stand-operations.mdpage,docs/concepts/stand-gate.mdupdated for lease evidence,mkdocs.ymlnav entry,docs/architecture/filesystem-layout.mdreflectscoordination/.stand/state.yaml.
Companion changes (1.2.x → 1.3.0 batch)¶
- Commit-drift closure (0228 / 0229 / 0233): TESTER own
functional_probes + tester_observations are now required on a
scope-driven schema gate;
gate_checkrecords a worktree fingerprint to distinguish committed vs in-flight overlays;greatminds stand request(now removed in 1.3.0) resolved target_commit fromevidence_for[0]'s impl block — superseded by lease--worktreesemantics. - 0236 + 0237 UserPromptSubmit hook + tmux send-keys split fix for chat-mode panes (PLANNER / MAINTAINER) no longer miss messages during USER topic-switches.
- 0238 new
docs/concepts/codex-profiles.mdpage covering the 0158 per-roleCODEX_HOMEmodel. - 0241 PLANNER role canon — propose-then-file default chat posture, codified.
- Bugfixes 0198 / 0202 / 0204 / 0235 + 13 doc tasks (0208 → 0220) cleared along the way.
Upgrade¶
pip install --upgrade greatminds==1.3.0
greatminds update # restarts daemon + agents
greatminds update auto-runs daemon install when the per-project
template unit is missing (0202), so legacy pre-0008 fleets upgrade
in a single step.
1.1.2 — 2026-05-21¶
Bug-fix release. Three regressions found in 1.1.0 real-world use, plus a critical wake-up channel regression introduced silently by the 1.0.0 umbrella-console-script migration. No new features.
Fixed¶
task append-block --body-fileoption missing. Dropped during the argparse→click conversion. The plan orchestrator and several agent prompts still passed it, breaking the orchestrator. Restored.coerce_valueblanket-split every--fieldvalue on commas, so any prose value (e.g.stand_reason="POST /node, then GET /health") was silently turned into a YAML list, and downstream validators choked. Now only fields explicitly inLIST_FIELDSare split on commas; all other fields stay strings even if they contain commas or colons.- click
multiple=Truedid not accept argparse-style space-separated values (--hosts X Yfailed with "Got unexpected extra argument (Y)"). New_split_multivaluecallback supports both forms:--hosts X --hosts Y(repeated flag, idiomatic click) AND--hosts X,Y(one flag, comma-separated).stand requestuses it consistently. greatminds-pty-launchconsole-script never existed in 1.0.0 umbrella migration —pyproject.tomlonly declaresgreatminds, soshutil.which("greatminds-pty-launch")always returnedNone, silently disabling pty wrapping. Result: every agent since 1.0.0 ran without the pty wrapper → noinput_sockin.agent_registry/ <role>.json→ coordd fell back to writing /dev/pts (slave side = display output, NOT input) → wake keystrokes never reached agents, who only ticked on their own ScheduleWakeup timer. start_agent now invokes pty_launch viapython -m greatminds.cli.pty_launch(same pattern as render-role).pty_launch.write_registrywas overwritingsession_idput there by start_agent's pre-pty registry write. Now it MERGES on top of any existing record so session_id (and any other downstream key) survives the pid/sock enrichment.- click strips
--from variadic args inpty_launch's click signature, breaking claude's--mcp-config <file> -- PROMPTcontract (claude's variadic--mcp-configconsumes the prompt as a config file). Thepython -m greatminds.cli.pty_launchdirect-exec path now bypasses click for argv parsing so--survives into the child's argv. The umbrellagreatminds pty-launchsubcommand path goes through click and remains affected — but that path is only used for diagnostics, not by start_agent.
Changed (internal — no behavioural change for users)¶
- Full click-native CLI rewrite per the
guardora_vflreference pattern. Dropped: - 9
SimpleNamespaceshims that wrapped legacycmd_X(args: argparse.Namespace)handlers from the argparse era. - 5
import argparsestatements (task.py,inbox.py,stand.py,coordd.py,start_agent.py). die(code, msg)global helper — replaced with directraise GreatMindsError(msg, exit_code=N)at every callsite. One exception class total (GreatMindsError(click.ClickException)), no subclass hierarchy.- Inter-module subprocess calls between
stand.py/plan.pyandtask.pyreplaced with direct Python function imports:create_task(),move_task(),append_block(). These are the library API; the click handlers are thin wrappers calling them, matching vfl'screate_node()/create_project()pattern.
Added¶
tests/test_task_field_coercion.py— pytest regression suite covering all three 1.1.0 bugs (20 tests, all passing). Tests:stand_reasonwith commas/colons stays string; LIST_FIELDS still split;--body-fileworks;--body @PATHworks; hosts comma-separated AND repeated-flag forms.core/errors.py— singleGreatMindsError(click.ClickException)type. Callers pass exit code at the raise site:raise GreatMindsError("bad value", exit_code=2).- CI: pytest runs against the installed wheel after the smoke loop.
1.1.0 — 2026-05-21¶
Breaking — canon docs translated to English; env-var namespace
renamed COORD_* → GREATMINDS_*; new --lang option for greatminds
setup controls the user-facing language each agent uses while keeping
internal artefacts (task files, journal, code) English.
Breaking¶
- All
COORD_*env vars renamed toGREATMINDS_*: COORD_PROJECT_DIR→GREATMINDS_PROJECT_DIRCOORD_CANON_DIR→GREATMINDS_CANON_DIRCOORD_ROLE→GREATMINDS_ROLECOORD_FORCE→GREATMINDS_FORCECOORD_FRESH→GREATMINDS_FRESHCOORD_REGISTRY_TOOL→GREATMINDS_REGISTRY_TOOLCOORD_START_AGENT_SAFE|NOTITLE|NOPTY→GREATMINDS_START_AGENT_*COORD_CURSOR_MEM_MAX|MEM_HIGH|CPU|MODEL→GREATMINDS_CURSOR_*COORD_POSTGRES_DSN→GREATMINDS_POSTGRES_DSN- Canon docs (
COORDINATE.md,command_START.yaml) translated from Russian to English. Pre-1.1.0 versions on PyPI (0.1.0, 0.1.1, 1.0.0) shipped Russian-only canon by mistake — yank them in favour of 1.1.0+.
Added¶
greatminds setup --lang <code>flag — records the agent user-facing language inPROJECT.mdas<GREATMINDS_LANG>. Any language a chat model speaks works (en,ru,zh,es,fr,ja, etc.). Default:en.- Common preamble in
command_START.yamlinstructs every agent to communicate with the USER in<GREATMINDS_LANG>while keeping internal artefacts (task YAML fields, journal entries, commit messages, file paths, inbox messages between roles, code) English regardless.
1.0.0 — 2026-05-21¶
Breaking release — the 19 separate greatminds-* entry-points
are consolidated into a single greatminds umbrella with subcommands
(click groups + flat commands). All canon docs and prompts now use
greatminds X syntax instead of bin/X.
Breaking¶
- Single entry-point
greatmindsreplaces the 0.1.x set of 19greatminds-*binaries. Migration: greatminds-task list verified→greatminds task list verifiedgreatminds-inbox send DEVELOPER --kind wake→greatminds inbox send DEVELOPER --kind wakegreatminds-stand request --request-type deploy …→greatminds stand request --request-type deploy …greatminds-coordd --verbose→greatminds coordd --verbosegreatminds-coord-launch --target tmux→greatminds launch --target tmuxgreatminds-coord-init→greatminds setup- (etc. — all 19 commands now subcommands of
greatminds) coord-init,coord-launch,coord-tmuxmodules removed; their functionality is ingreatminds setupandgreatminds launch.
Added¶
greatminds.core.env— adaptive Python-env detector covering 8 scenarios: pixi, uv, poetry, conda, plain venv, external-venv ($VIRTUAL_ENV), external-conda ($CONDA_DEFAULT_ENV), and system fallback.greatminds launchuses the detector to activate the project's env in each tmux window or VS Code task automatically — agent prompts can call baregreatminds Xwithout env-setup boilerplate.--venv /pathoverride ongreatminds launchfor explicit control when auto-detection isn't desired.greatminds setupextendscoord-initwith a clearer next-steps guide.- Click-native coloured output: cyan info / green success / red error / yellow warning across all subcommands.
Verified end-to-end¶
5 env-manager sandboxes (pixi, uv, poetry, conda, plain venv): each
runs greatminds setup + greatminds launch --target tmux,
attaches a window, executes greatminds --version from the
activated env — all five pass. Task lifecycle smoke (new → triage →
plan → dev) confirmed against a fresh project: 7+ journal
transitions, schema validation rejects malformed blocks, role
permissions enforced.
0.1.1 — 2026-05-20¶
Fixed¶
greatminds-coord-launchandgreatminds-coord-tmuxnow find a siblinggreatminds-start-agentin the same venv viaPath(sys.executable).parentBEFORE falling back toshutil.which. Previously they relied on PATH only, which broke when the user invoked the binary by full path (e.g../.venv/bin/greatminds-coord-launch) without sourcing the venv. Also:.resolve()is intentionally NOT called onsys.executablebecause uv-managed venvs symlink it to the underlying Python install — resolving would skip past the venv's bin dir entirely.- "each agent window has 'bin/start_agent
' pre-typed" message updated to print the actual resolved launcher name.
0.1.0 — 2026-05-20¶
First public release.
Added¶
- Python package
greatmindswith 19 console entry-points covering the full R8 pipeline: - Task management:
greatminds-task,greatminds-inbox,greatminds-stand,greatminds-plan,greatminds-migrate-task. - Pipeline introspection:
greatminds-gate-check,greatminds-wake-check,greatminds-watchdog,greatminds-intent-clean,greatminds-lint-tokens. - Hooks (Claude Code):
greatminds-stop-decide,greatminds-notify-journal. - Project bootstrap:
greatminds-coord-init. - Agent launcher / fleet:
greatminds-start-agent,greatminds-pty-launch,greatminds-render-role,greatminds-coordd,greatminds-coord-tmux,greatminds-coord-launch(tmux/vscode/cursor-ide targets). - Package data shipped under
greatminds.data:schema.yaml,command_START.yaml,COORDINATE.md,PROJECT_VARIABLES.md, 13 role specs underroles/, 8 layered Claude Code plugins underplugins/,mcp/canon.json(context7 + playwright), 3 codex profile-v2 configs undercodex/profiles/, queue templates undertemplates/. - Path resolution shared across all CLI modules via
greatminds.core: find_coord_dir(start=None, *, strict=True)— walks up from cwd or honours$COORD_PROJECT_DIR.find_canon_dir()—$COORD_CANON_DIRoverride orimportlib.resources.files("greatminds.data").caller_role(),die,now_iso,prog_name.- GitHub Actions CI building wheel on py 3.11/3.12/3.13, smoke-testing
every entry-point's
--help, validating packaged-data resolution, and runninggreatminds-coord-initon a fresh tmpdir.
Notes¶
- Apache-2.0 licensed.
coordd-install(Bash, systemd unit installer) and the stress-test scripts are not packaged in 0.1.0 — they will return as separate entry-points once their dependencies on systemd / heavy load generation are revisited.