Payload
{
"ref": "refs/heads/jp/fix-max-iterations",
"before": "0000000000000000000000000000000000000000",
"after": "522b7f9e7d0ab78f007f7321b10bef1fe38566ea",
"repository": {
"id": 1209959628,
"node_id": "R_kgDOSB6EzA",
"name": "nixmac",
"full_name": "darkmatter/nixmac",
"private": false,
"owner": {
"name": "darkmatter",
"email": "hello@dm.sh",
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/darkmatter",
"html_url": "https://github.com/darkmatter",
"followers_url": "https://api.github.com/users/darkmatter/followers",
"following_url": "https://api.github.com/users/darkmatter/following{/other_user}",
"gists_url": "https://api.github.com/users/darkmatter/gists{/gist_id}",
"starred_url": "https://api.github.com/users/darkmatter/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/darkmatter/subscriptions",
"organizations_url": "https://api.github.com/users/darkmatter/orgs",
"repos_url": "https://api.github.com/users/darkmatter/repos",
"events_url": "https://api.github.com/users/darkmatter/events{/privacy}",
"received_events_url": "https://api.github.com/users/darkmatter/received_events",
"type": "Organization",
"user_view_type": "public",
"site_admin": false
},
"html_url": "https://github.com/darkmatter/nixmac",
"description": "Home manager and nix-darwin that understands plain English",
"fork": false,
"url": "https://api.github.com/repos/darkmatter/nixmac",
"forks_url": "https://api.github.com/repos/darkmatter/nixmac/forks",
"keys_url": "https://api.github.com/repos/darkmatter/nixmac/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/darkmatter/nixmac/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/darkmatter/nixmac/teams",
"hooks_url": "https://api.github.com/repos/darkmatter/nixmac/hooks",
"issue_events_url": "https://api.github.com/repos/darkmatter/nixmac/issues/events{/number}",
"events_url": "https://api.github.com/repos/darkmatter/nixmac/events",
"assignees_url": "https://api.github.com/repos/darkmatter/nixmac/assignees{/user}",
"branches_url": "https://api.github.com/repos/darkmatter/nixmac/branches{/branch}",
"tags_url": "https://api.github.com/repos/darkmatter/nixmac/tags",
"blobs_url": "https://api.github.com/repos/darkmatter/nixmac/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/darkmatter/nixmac/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/darkmatter/nixmac/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/darkmatter/nixmac/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/darkmatter/nixmac/statuses/{sha}",
"languages_url": "https://api.github.com/repos/darkmatter/nixmac/languages",
"stargazers_url": "https://api.github.com/repos/darkmatter/nixmac/stargazers",
"contributors_url": "https://api.github.com/repos/darkmatter/nixmac/contributors",
"subscribers_url": "https://api.github.com/repos/darkmatter/nixmac/subscribers",
"subscription_url": "https://api.github.com/repos/darkmatter/nixmac/subscription",
"commits_url": "https://api.github.com/repos/darkmatter/nixmac/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/darkmatter/nixmac/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/darkmatter/nixmac/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/darkmatter/nixmac/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/darkmatter/nixmac/contents/{+path}",
"compare_url": "https://api.github.com/repos/darkmatter/nixmac/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/darkmatter/nixmac/merges",
"archive_url": "https://api.github.com/repos/darkmatter/nixmac/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/darkmatter/nixmac/downloads",
"issues_url": "https://api.github.com/repos/darkmatter/nixmac/issues{/number}",
"pulls_url": "https://api.github.com/repos/darkmatter/nixmac/pulls{/number}",
"milestones_url": "https://api.github.com/repos/darkmatter/nixmac/milestones{/number}",
"notifications_url": "https://api.github.com/repos/darkmatter/nixmac/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/darkmatter/nixmac/labels{/name}",
"releases_url": "https://api.github.com/repos/darkmatter/nixmac/releases{/id}",
"deployments_url": "https://api.github.com/repos/darkmatter/nixmac/deployments",
"created_at": 1776127033,
"updated_at": "2026-06-10T15:32:59Z",
"pushed_at": 1781141098,
"git_url": "git://github.com/darkmatter/nixmac.git",
"ssh_url": "git@github.com:darkmatter/nixmac.git",
"clone_url": "https://github.com/darkmatter/nixmac.git",
"svn_url": "https://github.com/darkmatter/nixmac",
"homepage": "https://nixmac.com",
"size": 681650,
"stargazers_count": 5,
"watchers_count": 5,
"language": "Rust",
"has_issues": true,
"has_projects": false,
"has_downloads": true,
"has_wiki": false,
"has_pages": false,
"has_discussions": false,
"forks_count": 1,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 86,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"has_pull_requests": true,
"pull_request_creation_policy": "all",
"topics": [
"home-manager",
"nix",
"nix-darwin",
"nix-flake",
"opencode"
],
"visibility": "public",
"forks": 1,
"open_issues": 86,
"watchers": 5,
"default_branch": "develop",
"stargazers": 5,
"master_branch": "develop",
"organization": "darkmatter",
"custom_properties": {}
},
"pusher": {
"name": "arximboldi",
"email": "juanpe@sinusoid.es"
},
"forced": false,
"organization": {
"login": "darkmatter",
"id": 17834193,
"node_id": "MDEyOk9yZ2FuaXphdGlvbjE3ODM0MTkz",
"url": "https://api.github.com/orgs/darkmatter",
"repos_url": "https://api.github.com/orgs/darkmatter/repos",
"events_url": "https://api.github.com/orgs/darkmatter/events",
"hooks_url": "https://api.github.com/orgs/darkmatter/hooks",
"issues_url": "https://api.github.com/orgs/darkmatter/issues",
"members_url": "https://api.github.com/orgs/darkmatter/members{/member}",
"public_members_url": "https://api.github.com/orgs/darkmatter/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/17834193?v=4",
"description": ""
},
"enterprise": {
"id": 469843,
"slug": "darkmatter",
"name": "darkmatter",
"node_id": "E_kgDOAAcrUw",
"avatar_url": "https://avatars.githubusercontent.com/b/469843?v=4",
"description": "",
"website_url": "darkmatter.io",
"html_url": "https://github.com/enterprises/darkmatter",
"created_at": "2025-09-07T16:01:00Z",
"updated_at": "2026-06-07T16:53:26Z"
},
"sender": {
"login": "arximboldi",
"id": 4521138,
"node_id": "MDQ6VXNlcjQ1MjExMzg=",
"avatar_url": "https://avatars.githubusercontent.com/u/4521138?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/arximboldi",
"html_url": "https://github.com/arximboldi",
"followers_url": "https://api.github.com/users/arximboldi/followers",
"following_url": "https://api.github.com/users/arximboldi/following{/other_user}",
"gists_url": "https://api.github.com/users/arximboldi/gists{/gist_id}",
"starred_url": "https://api.github.com/users/arximboldi/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/arximboldi/subscriptions",
"organizations_url": "https://api.github.com/users/arximboldi/orgs",
"repos_url": "https://api.github.com/users/arximboldi/repos",
"events_url": "https://api.github.com/users/arximboldi/events{/privacy}",
"received_events_url": "https://api.github.com/users/arximboldi/received_events",
"type": "User",
"user_view_type": "public",
"site_admin": false
},
"installation": {
"id": 131074261,
"node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTMxMDc0MjYx"
},
"created": true,
"deleted": false,
"base_ref": null,
"compare": "https://github.com/darkmatter/nixmac/compare/1688b484c430^...522b7f9e7d0a",
"commits": [
{
"id": "1688b484c4308a906f02ced565c1e0a36172aa7a",
"tree_id": "fafcf9721e9d226ea1498adff41bc462e4af300e",
"distinct": true,
"message": "Revert \"refactor: remove max_iterations from evolution config and UI (#325)\"\n\nThis reverts commit 9a017e9c4e6c5dbf8e013631398eb32227bcdc11.",
"timestamp": "2026-06-11T02:58:12+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/1688b484c4308a906f02ced565c1e0a36172aa7a",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T02:58:12+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T02:58:12+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/configurable-derive/src/attrs.rs",
"apps/native/src-tauri/src/cli.rs",
"apps/native/src-tauri/src/commands/settings_io.rs",
"apps/native/src-tauri/src/commands/ui_prefs.rs",
"apps/native/src-tauri/src/evolve/config.rs",
"apps/native/src-tauri/src/evolve/mod.rs",
"apps/native/src-tauri/src/evolve/tools.rs",
"apps/native/src-tauri/src/main.rs",
"apps/native/src-tauri/src/shared_types/prefs.rs",
"apps/native/src-tauri/src/storage/configurable_scope.rs",
"apps/native/src-tauri/src/storage/store.rs",
"apps/native/src/components/ui/tabs.stories.tsx",
"apps/native/src/components/widget/settings/__snapshots__/auto-config-field.stories.tsx.snap",
"apps/native/src/components/widget/settings/__snapshots__/auto-tuning-section.stories.tsx.snap",
"apps/native/src/components/widget/settings/auto-config-field.stories.tsx",
"apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
"apps/native/src/ipc/api.test.ts",
"apps/native/src/ipc/types.ts",
"apps/native/src/lib/constants.ts"
]
},
{
"id": "3eda1881c5d8762928b950a7e11cd272d2b63a17",
"tree_id": "5a8d8312b566c161599723e1b173d08f5050713b",
"distinct": true,
"message": "evolve: add TokenBudget limit kind + consolidate read path\n\nAdds the TokenBudget variant to EvolutionLimitKind (with matching\nattempts_label/prompt/stop_summary arms and a small format_token_count\nhelper) so the next commit can wire up the loop guard.\n\nAlso consolidates the max_token_budget read: the evolve loop now\ndestructures it from EvolutionLimits::load alongside\nmax_build_attempts and (post-#325-revert) max_iterations, instead of\ncalling store::get_max_token_budget separately. To keep UI writes via\nstore::set_max_token_budget routed through the same source of truth,\nthe store getter/setter are made Slice-aware (mirroring the existing\nget_max_iterations / get_max_build_attempts pattern), with a fallback\nto the legacy tauri-plugin-store path when the Slice isn't registered.\n\nNo behavior change in the loop yet; enforcement lands in the next\ncommit.",
"timestamp": "2026-06-11T03:01:34+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/3eda1881c5d8762928b950a7e11cd272d2b63a17",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:01:34+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:01:34+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/src/evolve/mod.rs",
"apps/native/src-tauri/src/storage/store.rs"
]
},
{
"id": "ad9e9bc9b025f6309280051d5bf0339e00b60a6a",
"tree_id": "76f86cb3a558623ffe435de1c803b99439b61f2e",
"distinct": true,
"message": "evolve: enforce max_token_budget in the agent loop\n\nAdds the missing comparison: after each API response, if total_tokens\nhas reached max_token_budget, ask the user whether to continue\n(interactive) or stop (non-interactive). On continue, extend the\nbudget by the original amount, mirroring the BuildAttempts UX. On\nstop, hand off to finish_after_limit_stop.\n\nPR #325 removed max_iterations on the premise that max_token_budget\nalready enforced a session bound. It didn't — the value was loaded,\nlogged, and emitted to the UI progress bar, but never compared\nagainst total_tokens to terminate the loop. This closes that gap.\n\nProviders that don't return usage (Ollama, some CLI providers)\nsidestep this guard entirely; the restored MaxIterations check\ncovers those.",
"timestamp": "2026-06-11T03:02:48+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/ad9e9bc9b025f6309280051d5bf0339e00b60a6a",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:02:48+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:02:48+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/src/evolve/mod.rs"
]
},
{
"id": "0db4b0cbcd56154e358d3ac3bc909ed83b825ef8",
"tree_id": "34815d532bbc3d85fc8ba3ff8481859d190a0f6f",
"distinct": true,
"message": "evolve: distinguish limit-hit completions with EvolutionState::LimitReached\n\nAdds a new EvolutionState variant for runs that finish_after_limit_stop\nterminates. Before this, hitting any safety guard\n(NoProgress / MaxIterations / BuildAttempts / TokenBudget) ended the run\nas Conversational or Generated depending on whether edits had been made,\nmaking it impossible for downstream consumers (notably the eval harness)\nto tell \"the agent decided it was done\" from \"we cut it off\".\n\nfinish_after_limit_stop now sets state to LimitReached unconditionally.\nTypeScript binding regenerated via specta.\n\nEval harness scoring will need a companion update on the nixmac-web\nside to grade LimitReached separately.",
"timestamp": "2026-06-11T03:13:01+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/0db4b0cbcd56154e358d3ac3bc909ed83b825ef8",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:13:01+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:13:01+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/src/evolve/mod.rs",
"apps/native/src-tauri/src/shared_types/evolve.rs",
"apps/native/src/ipc/types.ts"
]
},
{
"id": "522b7f9e7d0ab78f007f7321b10bef1fe38566ea",
"tree_id": "1b4e3cfbce027dee283bcfbe7a3c53303843aaba",
"distinct": true,
"message": "evolve: distinguish LimitReached in CLI and desktop completion UX\n\nTwo cosmetic gaps left behind by the structural LimitReached work:\n\n- cli.rs printed \"Evolution completed successfully\" on any non-\n conversational success, including runs the loop cut off. Now\n matches against the state and prints a stopped-for-safety message\n in the LimitReached arm.\n\n- use-evolve.ts toasted ✓ \"Evolution complete\" with the success\n variant for every non-error result. Now branches on the new\n state: a ⏸ \"Evolution stopped (safety limit reached)\" toast.info\n fires for LimitReached so the user can tell their run was cut\n off without reading the telemetry. The partial change map is\n still mirrored — limit-reached runs can contain useful edits the\n user may want to review or follow up on.\n\nAdds a use-evolve.test.ts case for the new path.",
"timestamp": "2026-06-11T03:22:08+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/522b7f9e7d0ab78f007f7321b10bef1fe38566ea",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:22:08+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:22:08+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/src/cli.rs",
"apps/native/src/hooks/use-evolve.test.ts",
"apps/native/src/hooks/use-evolve.ts"
]
}
],
"head_commit": {
"id": "522b7f9e7d0ab78f007f7321b10bef1fe38566ea",
"tree_id": "1b4e3cfbce027dee283bcfbe7a3c53303843aaba",
"distinct": true,
"message": "evolve: distinguish LimitReached in CLI and desktop completion UX\n\nTwo cosmetic gaps left behind by the structural LimitReached work:\n\n- cli.rs printed \"Evolution completed successfully\" on any non-\n conversational success, including runs the loop cut off. Now\n matches against the state and prints a stopped-for-safety message\n in the LimitReached arm.\n\n- use-evolve.ts toasted ✓ \"Evolution complete\" with the success\n variant for every non-error result. Now branches on the new\n state: a ⏸ \"Evolution stopped (safety limit reached)\" toast.info\n fires for LimitReached so the user can tell their run was cut\n off without reading the telemetry. The partial change map is\n still mirrored — limit-reached runs can contain useful edits the\n user may want to review or follow up on.\n\nAdds a use-evolve.test.ts case for the new path.",
"timestamp": "2026-06-11T03:22:08+02:00",
"url": "https://github.com/darkmatter/nixmac/commit/522b7f9e7d0ab78f007f7321b10bef1fe38566ea",
"author": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:22:08+02:00",
"username": "arximboldi"
},
"committer": {
"name": "Juan Pedro Bolívar Puente",
"email": "raskolnikov@gnu.org",
"date": "2026-06-11T03:22:08+02:00",
"username": "arximboldi"
},
"added": [],
"removed": [],
"modified": [
"apps/native/src-tauri/src/cli.rs",
"apps/native/src/hooks/use-evolve.test.ts",
"apps/native/src/hooks/use-evolve.ts"
]
}
}