Darkmatter · github-bot stage: prod
preview@internal.darkmatter
Events received
85448
Ignored
85404
Jobs dispatched
45

Event 0e51c48a…

← All events

Event

Delivery
0e51c48a-5f04-11f1-910d-f7d08c8d24f4
Event
push
Action
Received
2026-06-03T04:24:07.427Z
Signature
valid
Parsed
yes
Sender
czxtm
Repo
darkmatter/nixmac
Status
ignored — unsupported_event

Headers

{
  "accept": "*/*",
  "accept-encoding": "gzip, br",
  "cf-connecting-ip": "140.82.115.109",
  "cf-ipcountry": "US",
  "cf-ray": "a05bed2658d9e629",
  "cf-visitor": "{\"scheme\":\"https\"}",
  "connection": "Keep-Alive",
  "content-length": "179089",
  "content-type": "application/json",
  "host": "github-bot.darkmatter.io",
  "user-agent": "GitHub-Hookshot/933e3d3",
  "x-forwarded-proto": "https",
  "x-github-delivery": "0e51c48a-5f04-11f1-910d-f7d08c8d24f4",
  "x-github-event": "push",
  "x-github-hook-id": "628737947",
  "x-github-hook-installation-target-id": "3663660",
  "x-github-hook-installation-target-type": "integration",
  "x-real-ip": "140.82.115.109"
}

Payload

{
  "ref": "refs/heads/rebase-main",
  "before": "6104f7c2c3cf73f2d8afcb401e17e793ee08ce7b",
  "after": "a6d951c0ee1a899e6721260049c391cf177b3267",
  "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-03T01:26:53Z",
    "pushed_at": 1780460644,
    "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": 679208,
    "stargazers_count": 5,
    "watchers_count": 5,
    "language": "Rust",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": false,
    "has_discussions": false,
    "forks_count": 1,
    "mirror_url": null,
    "archived": false,
    "disabled": false,
    "open_issues_count": 66,
    "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": 66,
    "watchers": 5,
    "default_branch": "develop",
    "stargazers": 5,
    "master_branch": "develop",
    "organization": "darkmatter",
    "custom_properties": {}
  },
  "pusher": {
    "name": "czxtm",
    "email": "1325802+czxtm@users.noreply.github.com"
  },
  "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-05-09T15:34:55Z"
  },
  "sender": {
    "login": "czxtm",
    "id": 1325802,
    "node_id": "MDQ6VXNlcjEzMjU4MDI=",
    "avatar_url": "https://avatars.githubusercontent.com/u/1325802?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/czxtm",
    "html_url": "https://github.com/czxtm",
    "followers_url": "https://api.github.com/users/czxtm/followers",
    "following_url": "https://api.github.com/users/czxtm/following{/other_user}",
    "gists_url": "https://api.github.com/users/czxtm/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/czxtm/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/czxtm/subscriptions",
    "organizations_url": "https://api.github.com/users/czxtm/orgs",
    "repos_url": "https://api.github.com/users/czxtm/repos",
    "events_url": "https://api.github.com/users/czxtm/events{/privacy}",
    "received_events_url": "https://api.github.com/users/czxtm/received_events",
    "type": "User",
    "user_view_type": "public",
    "site_admin": false
  },
  "installation": {
    "id": 131074261,
    "node_id": "MDIzOkludGVncmF0aW9uSW5zdGFsbGF0aW9uMTMxMDc0MjYx"
  },
  "created": false,
  "deleted": false,
  "base_ref": null,
  "compare": "https://github.com/darkmatter/nixmac/compare/6104f7c2c3cf...a6d951c0ee1a",
  "commits": [
    {
      "id": "3823f4531c0338a341dcbd78ce033897d2b3196e",
      "tree_id": "7ec0338a26d9411d55f4cb23c5f83066eded9a25",
      "distinct": false,
      "message": "Update base branch (#198)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
      "timestamp": "2026-05-24T19:12:55-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/3823f4531c0338a341dcbd78ce033897d2b3196e",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-05-24T19:12:55-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-24T19:12:55-07:00",
        "username": "web-flow"
      },
      "added": [
        ".github/workflows/nightly-release.yaml",
        "ops/scripts/release/affected-paths.mjs",
        "ops/scripts/release/nightly-release.sh"
      ],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        "apps/native/.gitignore",
        "apps/native/src/lib/env.ts",
        "ops/scripts/release/compute-version.sh"
      ]
    },
    {
      "id": "f55a5acb407676e2e45f55974c79f7dfee9fd81a",
      "tree_id": "37821d17748ea37b75fbd21271bfdbcc0cf954ea",
      "distinct": false,
      "message": "refactor: update prompt messages to clarify actions for untracked items (#189)\n\n* refactor: update prompt messages to clarify actions for untracked items\n\n* refactor: fix a couple of snapshot prompts and re-update all snaps",
      "timestamp": "2026-05-25T02:09:08Z",
      "url": "https://github.com/darkmatter/nixmac/commit/f55a5acb407676e2e45f55974c79f7dfee9fd81a",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-25T10:09:08+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T02:09:08Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src/components/widget/filesystem/__snapshots__/seed-display.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/seed-prompt.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/seed-display.stories.tsx",
        "apps/native/src/components/widget/filesystem/seed-prompt.ts"
      ]
    },
    {
      "id": "afaea88c7d4ece679aa85d2e1b8d748eb33e1675",
      "tree_id": "c5a431ca1350171c73c474e13b61c6afff022fac",
      "distinct": false,
      "message": "feat: show stats about evolution duration IN TOAST (#197)\n\n* feat: show duration in terminal after evolution complete\n\n* fix(evolution-telemetry): show duration in toast after evolution, in addition to in console\n\n---------\n\nCo-authored-by: Juan Pedro Bolívar Puente <raskolnikov@gnu.org>",
      "timestamp": "2026-05-25T02:18:50Z",
      "url": "https://github.com/darkmatter/nixmac/commit/afaea88c7d4ece679aa85d2e1b8d748eb33e1675",
      "author": {
        "name": "Cas Linden",
        "email": "83954807+CasLinden@users.noreply.github.com",
        "date": "2026-05-25T11:18:50+09:00",
        "username": "CasLinden"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T02:18:50Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src/hooks/use-evolve.ts",
        "apps/native/src/lib/utils.ts",
        "apps/native/src/stores/widget-store.impl.ts"
      ]
    },
    {
      "id": "3f7df8e45436a78a71afb96fa23fc2179a5cac08",
      "tree_id": "fc49472fbfe45e33f544adb8d0c8ac1da8c98482",
      "distinct": false,
      "message": "feat(evolve): don't automatically send all messages to agent on every turn, implement framework for related optimizations (#180)\n\n* feat(evolve): implement memory strategy for evolution messages and enhance message retention\n\n* feat(logging): implement chat log recording for Ollama and OpenAI providers\n\n* feat(evolve): enhance message retention strategy with deduplication and filtering logic; fix apparent bad merge in shared.ts\n\n* feat(evolve): bypass all filtering in the default retention setting\n\n* Use env guard consistently\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* feat(logging): put back completion log dir env var behavior\n\n* fix(evolution): update message filtering logic to use indexed iteration (fix issue with think pruning) and improve retention strategy handling\n\n* refactor(evolution): update filter_evolution_messages to return EvolutionMessage and fix a couple code review issues with how those are handled\n\n* fix: update default memory strategy to None for unknown configurations\n\n* refactor: update logging for evolution iterations and adjust test for unknown memory strategy\n\n* feat: move format_duration_secs to utils and add new unit tests\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-25T03:38:42Z",
      "url": "https://github.com/darkmatter/nixmac/commit/3f7df8e45436a78a71afb96fa23fc2179a5cac08",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-25T11:38:42+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T03:38:42Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/ai/providers/ollama.rs",
        "apps/native/src-tauri/src/ai/providers/openai.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/evolve/providers/ollama.rs",
        "apps/native/src-tauri/src/evolve/providers/openai.rs",
        "apps/native/src-tauri/src/evolve/search_docs.rs",
        "apps/native/src-tauri/src/evolve/utils.rs",
        "apps/native/src-tauri/src/state/completion_log.rs"
      ]
    },
    {
      "id": "19d1f19853e21a254dd195b36b2f2671faaca729",
      "tree_id": "d3514d1a1321be76a9bcf86d82da11f402177f51",
      "distinct": false,
      "message": "Raise log summarizer completion budget (#200)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Raise log summarizer completion budget\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Fix prompt input API import after conflict merge\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-25T03:49:59Z",
      "url": "https://github.com/darkmatter/nixmac/commit/19d1f19853e21a254dd195b36b2f2671faaca729",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-25T03:49:59Z",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T03:49:59Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        "apps/native/src-tauri/src/ai/log_summarizer.rs",
        "apps/native/src/lib/env.ts"
      ]
    },
    {
      "id": "f49dc76d487d0831ecf15e9f38c559a124612bee",
      "tree_id": "c052ca46a74a62f628571f8d3fb4fd5c76789ff7",
      "distinct": false,
      "message": "build: add tauri-wd to devenv shell (#193)",
      "timestamp": "2026-05-25T05:30:54Z",
      "url": "https://github.com/darkmatter/nixmac/commit/f49dc76d487d0831ecf15e9f38c559a124612bee",
      "author": {
        "name": "Juanpe Bolívar",
        "email": "raskolnikov@gnu.org",
        "date": "2026-05-25T07:30:54+02:00",
        "username": "arximboldi"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T05:30:54Z",
        "username": "web-flow"
      },
      "added": [
        "nix/pkgs/tauri-wd.nix"
      ],
      "removed": [],
      "modified": [
        "apps/native/e2e-tauri/README.md",
        "nix/dev.nix",
        "nix/e2e/default.nix"
      ]
    },
    {
      "id": "1d7f5273537beb127b5dc33147fec714ca30af74",
      "tree_id": "f209072c9f08eb39d5e15f2f449ba43446741dd4",
      "distinct": false,
      "message": "fix: refactor config directory handling to support different git repository root (#184)\n\n* fix: refactor config directory handling to support different git repository root\n\n- Updated a lot of utility functions to accept and utilize the git repository root instead of the config directory.\n- Renamed `format_config_dir_context` to `format_repo_view_context` for clarity.\n- Adjusted file operations to ensure they respect the git repository structure, which is the new escape boundary.\n- Implemented caching for the git repository root in the store.\n- Updated tests to validate behavior with respect to the new repository structure.\n- Prompt engineering to get the agent to send the correct paths more reliably, including a new format for the subtree snapshot that gets rid of the ascii art which the agent struggles more with.\n\n* fix: AI code review comments\n\n* fix: more code review comments\n\n* fix: validate repo-relative path in git file diff reads\n\nAgent-Logs-Url: https://github.com/darkmatter/nixmac/sessions/80ae992b-8909-4b1c-82fe-ce6da6602ce5\n\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\n\n* Use path operations for max depth calculation\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* fix: bad auto-merge\n\n* fix: unnecessary debug log\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
      "timestamp": "2026-05-25T06:15:16Z",
      "url": "https://github.com/darkmatter/nixmac/commit/1d7f5273537beb127b5dc33147fec714ca30af74",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-25T14:15:16+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T06:15:16Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/prompts/system.md",
        "apps/native/src-tauri/src/commands/git.rs",
        "apps/native/src-tauri/src/evolve/config_dir_context.rs",
        "apps/native/src-tauri/src/evolve/file_ops.rs",
        "apps/native/src-tauri/src/evolve/lifecycle.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/evolve/search_code.rs",
        "apps/native/src-tauri/src/evolve/tools.rs",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/rebuild/finalize_apply.rs",
        "apps/native/src-tauri/src/rebuild/rollback.rs",
        "apps/native/src-tauri/src/storage/store.rs"
      ]
    },
    {
      "id": "8504aaa8619301a1bf69e99d986d9b91a2701a2f",
      "tree_id": "038556b60eabd7c9fe083c4d52bf1f83e41f4b45",
      "distinct": false,
      "message": "fix: update hard-coded data for system defaults \"track\" feature (#190)\n\n* fix: update hard-coded data for system defaults \"track\" feature\n\nA lot of them were wrong/misleading to the agent.\n\nAlso improved the coverage of the nix-darwin docs.\n\n* fix: correct attribute for sound feedback setting in system defaults\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-25T06:23:14Z",
      "url": "https://github.com/darkmatter/nixmac/commit/8504aaa8619301a1bf69e99d986d9b91a2701a2f",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-25T14:23:14+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T06:23:14Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/resources/nix-darwin-docs.json",
        "apps/native/src/components/widget/filesystem/__snapshots__/file-list.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/seed-display.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/seed-prompt.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/untracked-card.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/data.ts",
        "apps/native/src/components/widget/filesystem/seed-display.stories.tsx",
        "apps/native/src/components/widget/filesystem/seed-prompt.ts",
        "apps/native/src/components/widget/overlays/__snapshots__/rebuild-overlay-panel.stories.tsx.snap",
        "scripts/update-nix-darwin-docs.py"
      ]
    },
    {
      "id": "d0f6e7d32fc04aa447150609e2e79aa8f61933c1",
      "tree_id": "2288b7791e4cf7e71bf6ce1600f2bb25af8ef1fc",
      "distinct": false,
      "message": "fix: update edit-nix-file UI functions to operate relative to the git repository (#204)",
      "timestamp": "2026-05-25T15:22:35Z",
      "url": "https://github.com/darkmatter/nixmac/commit/d0f6e7d32fc04aa447150609e2e79aa8f61933c1",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-25T23:22:35+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-25T15:22:35Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/editor/mod.rs"
      ]
    },
    {
      "id": "e7bf6aa6cd7702323ac836ed835298a9c3a0a96b",
      "tree_id": "71eb8805c3cec0a98267797936427904f2b075fa",
      "distinct": false,
      "message": "fix(build): use cargoHash to avoid crates.io 403s (#218)",
      "timestamp": "2026-05-28T22:29:21Z",
      "url": "https://github.com/darkmatter/nixmac/commit/e7bf6aa6cd7702323ac836ed835298a9c3a0a96b",
      "author": {
        "name": "Cas Linden",
        "email": "83954807+CasLinden@users.noreply.github.com",
        "date": "2026-05-29T07:29:21+09:00",
        "username": "CasLinden"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-28T22:29:21Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "nix/pkgs/tauri-wd.nix"
      ]
    },
    {
      "id": "76ad8805cbd9f455e6ffa30b13329a9fbfb9e207",
      "tree_id": "9c1c4e46a90b59d0f891b62aa5c8340b02ce9b30",
      "distinct": false,
      "message": "Add tart package and script to run commands in target VM (#196)\n\n* feat(wdio): control timeouts\n\n* feat(tart-script): run specified command in VM for specified image\n\n* feat(devenv): add pkgs.tart",
      "timestamp": "2026-05-29T01:57:31Z",
      "url": "https://github.com/darkmatter/nixmac/commit/76ad8805cbd9f455e6ffa30b13329a9fbfb9e207",
      "author": {
        "name": "Cas Linden",
        "email": "83954807+CasLinden@users.noreply.github.com",
        "date": "2026-05-29T10:57:31+09:00",
        "username": "CasLinden"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-29T01:57:31Z",
        "username": "web-flow"
      },
      "added": [
        "scripts/tart-run.sh"
      ],
      "removed": [],
      "modified": [
        "apps/native/e2e-tauri/wdio.conf.base.mjs",
        "nix/dev.nix"
      ]
    },
    {
      "id": "93daf823066e739ec0dc10daf90bca1e129630b3",
      "tree_id": "f85c9a4ec2f7093ea1410da6febe20d80275effc",
      "distinct": false,
      "message": "Remove redundant comment in CODEOWNERS",
      "timestamp": "2026-05-30T23:25:48-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/93daf823066e739ec0dc10daf90bca1e129630b3",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-05-30T23:25:48-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-30T23:25:48-07:00",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "CODEOWNERS"
      ]
    },
    {
      "id": "9b679e820c985897653acd4f75019fc817a5e6c5",
      "tree_id": "f2577569fa5cd3015da1e1cc0729c833b0b6f6a1",
      "distinct": false,
      "message": "feat: introduce git2 for faster read-only Git operations; add profiling support (#238)\n\n* feat: introduce git2 for faster read-only Git operations; add profiling support\n\n* Fix type in readme\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-31T08:06:27Z",
      "url": "https://github.com/darkmatter/nixmac/commit/9b679e820c985897653acd4f75019fc817a5e6c5",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-31T16:06:27+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T08:06:27Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src-tauri/src/git/query.rs"
      ],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "Cargo.toml",
        "README.md",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/git/mod.rs",
        "apps/native/src-tauri/src/storage/store.rs"
      ]
    },
    {
      "id": "2bd353fbe1dd48da22df83c8c3d3f208a4857857",
      "tree_id": "64c1a99913d23dd972f0879dea9c465e597a004d",
      "distinct": false,
      "message": "fix: generate Specta bindings via build script (#235)\n\n* fix: correct paths for specta-generated ts files\n\n* fix(build): use cargoHash to avoid crates.io 403s (#218)\n\n---------\n\nCo-authored-by: Cas Linden <83954807+CasLinden@users.noreply.github.com>",
      "timestamp": "2026-05-31T08:10:26Z",
      "url": "https://github.com/darkmatter/nixmac/commit/2bd353fbe1dd48da22df83c8c3d3f208a4857857",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-31T16:10:26+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T08:10:26Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/scripts/tauri-dev.sh"
      ]
    },
    {
      "id": "478de569e0c4a90ce030be13426eaf6da8a90e93",
      "tree_id": "03a62074f07399e19bfe10f54b69cab5e4d3799a",
      "distinct": false,
      "message": "feat: optional preview feedback before sending (#213)\n\n* feat: optional preview feedback before sending\n\n- Updated FeedbackMetadata to use Evolution type for evolution_log_content instead of escaped JSON.\n- Introduced preview functionality in FeedbackDialog for feedback payload before submission.\n\n* fix: simplify feedback submission code; improve error handling\n\n* refactor(feedback): make preview feedback a separate action button, not boolean option",
      "timestamp": "2026-05-31T08:11:25Z",
      "url": "https://github.com/darkmatter/nixmac/commit/478de569e0c4a90ce030be13426eaf6da8a90e93",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-31T16:11:25+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T08:11:25Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/examples/specta_gen_ts.rs",
        "apps/native/src-tauri/src/evolve/file_ops.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/evolve/tools.rs",
        "apps/native/src-tauri/src/evolve/types.rs",
        "apps/native/src-tauri/src/feedback.rs",
        "apps/native/src-tauri/src/shared_types/evolve.rs",
        "apps/native/src-tauri/src/shared_types/feedback.rs",
        "apps/native/src/components/widget/feedback/feedback-dialog.tsx",
        "apps/native/src/ipc/types.ts",
        "apps/native/src/types/feedback.ts"
      ]
    },
    {
      "id": "d8a51a005d68b4ec9dad71912727680143d26f77",
      "tree_id": "2878fe1b6671f761edf7b545855ebd8625bb0afa",
      "distinct": false,
      "message": "Fix setup host persistence and permission skip hardening (#183)\n\n* fix: harden onboarding and permission checks\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test: mock widget store in setup-step unit test\n\nAvoid importing the real useWidgetStore during collection, which\npulls in env.ts and fails before tests run.\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: Cas Linden <83954807+CasLinden@users.noreply.github.com>",
      "timestamp": "2026-05-31T08:46:05Z",
      "url": "https://github.com/darkmatter/nixmac/commit/d8a51a005d68b4ec9dad71912727680143d26f77",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T01:46:05-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T08:46:05Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src/components/widget/steps/setup-step.test.tsx"
      ],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/system/permissions.rs",
        "apps/native/src/components/widget/steps/setup-step.tsx"
      ]
    },
    {
      "id": "fbf87e74e51d6a99acc03abbe216194a92d5c4e4",
      "tree_id": "d1bb31b7defaf074736e6b2fef0284d10f3808fb",
      "distinct": false,
      "message": "Fix dirty evolve warning and rollback rebuild state (#191)\n\n* fix: guard dirty evolve and rollback rebuild state\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test: isolate rollback and prompt tests from env schema\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* fix: restore native env compile path\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test: restore native validation checks\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test: stabilize directory picker host assertion\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* chore: do not reintroduce rejected beginevolve warning\n\n* Fix test TypeScript build errors\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: CasLinden <cas_linden@msn.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
      "timestamp": "2026-05-31T14:12:00Z",
      "url": "https://github.com/darkmatter/nixmac/commit/fbf87e74e51d6a99acc03abbe216194a92d5c4e4",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T07:12:00-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T14:12:00Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src/hooks/use-rollback.test.ts"
      ],
      "removed": [],
      "modified": [
        "apps/native/src/components/widget/controls/directory-picker.test.tsx",
        "apps/native/src/components/widget/promptinput/prompt-input.tsx",
        "apps/native/src/hooks/use-rollback.ts"
      ]
    },
    {
      "id": "cc5aa2745f6405bcaffebcaa5f1b6591b5dd4d53",
      "tree_id": "4c2e61a95e98c4a19dae104f8c40f6aecc13428a",
      "distinct": false,
      "message": "Add org-level review guidance to Copilot onboarding instructions (#205)\n\n* Add .github/copilot-instructions.md for cloud agent onboarding\n\nAgent-Logs-Url: https://github.com/darkmatter/nixmac/sessions/b74c5d51-271c-43f7-bc21-8ace98589c2f\n\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\n\n* Mention org-wide skills guidance in copilot instructions\n\nAgent-Logs-Url: https://github.com/darkmatter/nixmac/sessions/84c8b753-5bc9-4b9f-b3a1-5f7249b90886\n\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-31T13:26:40-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/cc5aa2745f6405bcaffebcaa5f1b6591b5dd4d53",
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "date": "2026-05-31T13:26:40-07:00",
        "username": "Copilot"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T13:26:40-07:00",
        "username": "web-flow"
      },
      "added": [
        ".github/copilot-instructions.md"
      ],
      "removed": [],
      "modified": []
    },
    {
      "id": "c2dfc57e68709c32f912a34a3c2dcc4fe15d89ae",
      "tree_id": "91fd5bb263c50241abd0deac9293e6effeb0c2c2",
      "distinct": false,
      "message": "Fix evolve backup on unborn HEAD (#219)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): skip evolve backup without HEAD\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-31T13:28:38-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/c2dfc57e68709c32f912a34a3c2dcc4fe15d89ae",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T13:28:38-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T13:28:38-07:00",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/git/exec.rs"
      ]
    },
    {
      "id": "e8043d6ac0b80106a0a288b18c053a874bcd9d84",
      "tree_id": "e9ffb0269d56d5cfaf07b8cb3c95dc8e5cc59377",
      "distinct": false,
      "message": "Fix release permission skip flag bypass (#156)\n\n* fix: gate permission skip flags to debug builds\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Fix permission skip helper cfg conflict\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: CasLinden <cas_linden@msn.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-05-31T20:18:40Z",
      "url": "https://github.com/darkmatter/nixmac/commit/e8043d6ac0b80106a0a288b18c053a874bcd9d84",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T20:18:40Z",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T20:18:40Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/system/permissions.rs"
      ]
    },
    {
      "id": "1a1b95b5060f8c41c4eb3fd27911f2f515284c6f",
      "tree_id": "360b352d118396482a4f193b8779e63af22373a8",
      "distinct": false,
      "message": "Revert \"fix(build): use cargoHash to avoid crates.io 403s (#218)\" (#258)\n\nThis reverts commit e7bf6aa6cd7702323ac836ed835298a9c3a0a96b.",
      "timestamp": "2026-05-31T16:25:52-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/1a1b95b5060f8c41c4eb3fd27911f2f515284c6f",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-05-31T16:25:52-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T16:25:52-07:00",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "nix/pkgs/tauri-wd.nix"
      ]
    },
    {
      "id": "5b033f90258cb37f0b67af9e0f3bbaf8ab315244",
      "tree_id": "b87f0d803c54e9fc1898cb1fe11c72c74c7c4e75",
      "distinct": false,
      "message": "Migrate workflows to Blacksmith (#259)\n\nCo-authored-by: blacksmith-sh[bot] <157653362+blacksmith-sh[bot]@users.noreply.github.com>",
      "timestamp": "2026-05-31T19:15:28-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/5b033f90258cb37f0b67af9e0f3bbaf8ab315244",
      "author": {
        "name": "blacksmith-sh[bot]",
        "email": "157653362+blacksmith-sh[bot]@users.noreply.github.com",
        "date": "2026-05-31T19:15:28-07:00",
        "username": "blacksmith-sh[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-05-31T19:15:28-07:00",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/workflows/build.yaml",
        ".github/workflows/computer-use-e2e.yml",
        ".github/workflows/danger.yml",
        ".github/workflows/e2e.yml",
        ".github/workflows/nightly-release.yaml",
        ".github/workflows/peekaboo-e2e.yml",
        ".github/workflows/storybook.yaml"
      ]
    },
    {
      "id": "69a5f878cf46a847f650e5e3716669aca25fee0d",
      "tree_id": "3e9308d962123f43200a1628d1c7465fefabeffb",
      "distinct": false,
      "message": "Add visible Save button to nix editor (#203)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* Add visible nix editor save button\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-01T06:10:17Z",
      "url": "https://github.com/darkmatter/nixmac/commit/69a5f878cf46a847f650e5e3716669aca25fee0d",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T23:10:17-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-01T06:10:17Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src/components/nix-editor/index.test.tsx"
      ],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        "apps/native/src/components/nix-editor/index.tsx"
      ]
    },
    {
      "id": "1b50987ad8491af6a4a0a883ed36a0473dd0d855",
      "tree_id": "a494c8374bf9b62a8ebbeb532d8ce767c738cfe2",
      "distinct": false,
      "message": "refactor: migrate git init, status, and basic diff to git2, including using objects more than strings/parsing. (#274)\n\n* refactor: migrate git init, status, and basic diff to git2, including using objects more than strings/parsing.\n\n- Moved repository initialization and validation functions to a new `init.rs` module.\n- Updated `status` function to utilize structured diff handling via git2.\n- Enhanced `commit_diff` to return structured file diffs via git2 for better change representation and perf.\n- Removed redundant and obsolete functions and tests related to previous diff handling.\n- Improved change type mapping and added tests for new functionality.\n- Updated various modules to reflect changes in the git query structure.\n- Try to maintain public API compat as much as possible to (hopefully) avoid breaking a lot of complex stuff in the summarization pipeline.\n\n* fix: remove extraneous origin markers\n\n* fix: extraneous crap around the hunk headers\n\n* fix: copilot review comments\n\n* fix: enable showing untracked content in default diff options",
      "timestamp": "2026-06-02T08:36:42Z",
      "url": "https://github.com/darkmatter/nixmac/commit/1b50987ad8491af6a4a0a883ed36a0473dd0d855",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-06-02T16:36:42+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T08:36:42Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src-tauri/src/git/init.rs"
      ],
      "removed": [],
      "modified": [
        ".github/copilot-instructions.md",
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/commands/git.rs",
        "apps/native/src-tauri/src/git/changes_from_diff.rs",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/git/mod.rs",
        "apps/native/src-tauri/src/git/query.rs",
        "apps/native/src-tauri/src/history/get_history.rs",
        "apps/native/src-tauri/src/managed_edits/managed_edit.rs",
        "apps/native/src-tauri/src/shared_types/git.rs",
        "apps/native/src-tauri/src/summarize/mod.rs",
        "apps/native/src-tauri/src/summarize/pipelines/history.rs"
      ]
    },
    {
      "id": "c9709856e77302e9087f7e4e32f6b7f4e7cbfd36",
      "tree_id": "e42c441ba8eae7f606e65c302581a9444da59d72",
      "distinct": false,
      "message": "fix(ENG-277): remove bootstrap directory check that blocked crash recovery (#194)\n\n* fix(ENG-277): remove over-strict bootstrap directory check that blocked retries\n\nThe is_dir_safe_for_bootstrap guard rejected any directory containing\nfiles beyond .git, which meant a crash mid-copy left the config dir\nin an unrecoverable state — nixmac itself had created partial template\nfiles, then its own check refused to proceed on restart.\n\nThe check is not needed: ensure_config_dir_exists manages a dedicated\nnixmac directory, copy_template_dir naturally overwrites existing files,\nand the flake.nix existence check at the top of bootstrap() already\nhandles the \"user brought their own config\" case.\n\nhttps://claude.ai/code/session_018Guk2ZgprctXWZtFg4Gvch\n\n* Fix Linux test build after develop merge\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T02:17:38-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/c9709856e77302e9087f7e4e32f6b7f4e7cbfd36",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T02:17:38-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T02:17:38-07:00",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/peek.rs"
      ]
    },
    {
      "id": "db6480b2ce4bd484a296b95fc667e11ab74b2a17",
      "tree_id": "283d9df6ddabdf59fc0990556803d36e4e6243e3",
      "distinct": false,
      "message": "Fix evolve prompt state loss and dirty-change race (#209)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): preserve evolve review state\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test(native): cover dirty evolve prompt resolution\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* fix(native): remove unused manual evolve call\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* chore: do not reintroduce rejected beginevolve warning\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: CasLinden <cas_linden@msn.com>",
      "timestamp": "2026-06-02T09:19:18Z",
      "url": "https://github.com/darkmatter/nixmac/commit/db6480b2ce4bd484a296b95fc667e11ab74b2a17",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-06-02T02:19:18-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T09:19:18Z",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src/hooks/use-evolve.test.ts"
      ],
      "removed": [],
      "modified": [
        "apps/native/src/hooks/use-evolve.ts",
        "apps/native/src/lib/env.ts"
      ]
    },
    {
      "id": "2fd6e6b39f041759ae91c467e69ffcadd97ba4be",
      "tree_id": "03a608a0e9c6a0395d6b5577f0ef73128028ce5a",
      "distinct": false,
      "message": "feat(native): #[derive(Configurable)] for hot-reloadable dev settings (PoC)\n\nIntroduces a proc-macro that eliminates the 6-file boilerplate currently\nrequired for every store-backed setting. A new knob today touches:\nstorage/store.rs (getter+setter), shared_types/prefs.rs (UiPrefs +\nUiPrefsUpdate fields), commands/ui_prefs.rs (read+write branches), TS\nbindings, and UI forms — ~25 LOC across 6 files. With this derive, a new\nknob is one struct field.\n\nPoC scope — EvolutionLimits only:\n\n  #[derive(Configurable)]\n  #[config(store_path = \"settings.json\")]\n  pub struct EvolutionLimits {\n      #[config(default = 25, key = \"maxIterations\")]\n      pub max_iterations: usize,\n      #[config(default = 5, key = \"maxBuildAttempts\")]\n      pub max_build_attempts: usize,\n  }\n\nThe derive generates `EvolutionLimits::load(app) -> Result<Self>` that\nreads each field from tauri-plugin-store with the per-field default\nfallback. Reads happen on every call, so edits via dev settings take\neffect on next agent run (hot-reload).\n\nTwo new workspace crates:\n- configurable/         — runtime trait + read_field() helper\n- configurable-derive/  — proc-macro\n\nBug fix included: evolve/mod.rs:1467 was logging\nDEFAULT_MAX_BUILD_ATTEMPTS (the const) instead of the configured value\n— exactly the drift this derive is designed to prevent. Threaded\nmax_build_attempts into process_tool_result().\n\nUiPrefs / UiPrefsUpdate / ui_set_prefs left untouched on purpose — full\nmigration is tracked under nixmac-e53 with one sub-issue per category.\n\nCloses: nixmac-8ka\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
      "timestamp": "2026-06-02T02:57:25-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/2fd6e6b39f041759ae91c467e69ffcadd97ba4be",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-24T19:53:11-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T02:57:25-07:00",
        "username": "czxtm"
      },
      "added": [
        "apps/native/src-tauri/configurable-derive/Cargo.toml",
        "apps/native/src-tauri/configurable-derive/src/lib.rs",
        "apps/native/src-tauri/configurable/Cargo.toml",
        "apps/native/src-tauri/configurable/src/lib.rs",
        "apps/native/src-tauri/src/evolve/config.rs"
      ],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        "Cargo.lock",
        "Cargo.toml",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/evolve/mod.rs"
      ]
    },
    {
      "id": "df8e0a1a4219fab78607dfceff0f372fab917066",
      "tree_id": "ea09232b3ee7dccfdfdb6e5604f4aad3bc4ca3dc",
      "distinct": false,
      "message": "test(native): cover EvolutionLimits::load via tauri mock app\n\nAdds a #[cfg(test)] module exercising the Configurable-derived load():\ndefaults on empty store, stored-value override, and graceful fallback on\nschema drift. Enables the tauri 'test' feature in dev-dependencies for\nmock_builder. Satisfies the danger 'new Rust module without tests' gate.",
      "timestamp": "2026-06-02T02:58:07-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/df8e0a1a4219fab78607dfceff0f372fab917066",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-31T13:41:31-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T02:58:07-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/evolve/config.rs"
      ]
    },
    {
      "id": "6bcdd6670f3ccc4825519a4887942b94526a4768",
      "tree_id": "ccf18b2284bd82e50f8b72750eb1dc9710ed25b2",
      "distinct": false,
      "message": "fix(build): use cargoHash to avoid crates.io 403s (#218)",
      "timestamp": "2026-06-02T02:58:07-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/6bcdd6670f3ccc4825519a4887942b94526a4768",
      "author": {
        "name": "Cas Linden",
        "email": "83954807+CasLinden@users.noreply.github.com",
        "date": "2026-05-29T07:29:21+09:00",
        "username": "CasLinden"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T02:58:07-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "nix/pkgs/tauri-wd.nix"
      ]
    },
    {
      "id": "375a1077ad0eda043121a293f8764a619ff3d655",
      "tree_id": "7e4681ea672ac4b3efdcd1428bd56a2b540cd847",
      "distinct": false,
      "message": "feat: introduce git2 for faster read-only Git operations; add profiling support (#238)\n\n* feat: introduce git2 for faster read-only Git operations; add profiling support\n\n* Fix type in readme\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T02:59:25-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/375a1077ad0eda043121a293f8764a619ff3d655",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-05-31T16:06:27+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T02:59:25-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/git/mod.rs",
        "apps/native/src-tauri/src/git/query.rs"
      ]
    },
    {
      "id": "75933838b4a103c8e0f8251b430efd5194c252bc",
      "tree_id": "6ad842bd06de3df4ea9db2ae94d19f3a1452dc6c",
      "distinct": false,
      "message": "Fix setup host persistence and permission skip hardening (#183)\n\n* fix: harden onboarding and permission checks\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* test: mock widget store in setup-step unit test\n\nAvoid importing the real useWidgetStore during collection, which\npulls in env.ts and fails before tests run.\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: Cas Linden <83954807+CasLinden@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:00:33-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/75933838b4a103c8e0f8251b430efd5194c252bc",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T01:46:05-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:00:33-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/system/permissions.rs"
      ]
    },
    {
      "id": "876b5c8cb655359422f2115b1d5517051507a8bc",
      "tree_id": "b7af60a2f742e96d7a15f321ba2c6cee31b86f6f",
      "distinct": false,
      "message": "Add org-level review guidance to Copilot onboarding instructions (#205)\n\n* Add .github/copilot-instructions.md for cloud agent onboarding\n\nAgent-Logs-Url: https://github.com/darkmatter/nixmac/sessions/b74c5d51-271c-43f7-bc21-8ace98589c2f\n\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\n\n* Mention org-wide skills guidance in copilot instructions\n\nAgent-Logs-Url: https://github.com/darkmatter/nixmac/sessions/84c8b753-5bc9-4b9f-b3a1-5f7249b90886\n\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: czxtm <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:00:47-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/876b5c8cb655359422f2115b1d5517051507a8bc",
      "author": {
        "name": "Copilot",
        "email": "198982749+Copilot@users.noreply.github.com",
        "date": "2026-05-31T13:26:40-07:00",
        "username": "Copilot"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:00:47-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/copilot-instructions.md"
      ]
    },
    {
      "id": "24c569cc5c6acaf2992393d573751a7502e29d2e",
      "tree_id": "1b416567e4899613cfdb45ab7523f5a686427eb7",
      "distinct": false,
      "message": "Fix release permission skip flag bypass (#156)\n\n* fix: gate permission skip flags to debug builds\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Fix permission skip helper cfg conflict\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\nCo-authored-by: CasLinden <cas_linden@msn.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:00:47-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/24c569cc5c6acaf2992393d573751a7502e29d2e",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T20:18:40Z",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:00:47-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/system/permissions.rs"
      ]
    },
    {
      "id": "c86331984af699ca397c5389190acdff344d701e",
      "tree_id": "a5d1630a41c907180a335989ccf81920639454de",
      "distinct": false,
      "message": "Revert \"fix(build): use cargoHash to avoid crates.io 403s (#218)\" (#258)\n\nThis reverts commit e7bf6aa6cd7702323ac836ed835298a9c3a0a96b.",
      "timestamp": "2026-06-02T03:00:47-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/c86331984af699ca397c5389190acdff344d701e",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-05-31T16:25:52-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:00:47-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "nix/pkgs/tauri-wd.nix"
      ]
    },
    {
      "id": "e380bc694ab7313b490ee241d00b6a52fe78d0ec",
      "tree_id": "92eb92e3ad7495713a0e6029498a9c54c98d03df",
      "distinct": false,
      "message": "Add visible Save button to nix editor (#203)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* Add visible nix editor save button\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:11-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/e380bc694ab7313b490ee241d00b6a52fe78d0ec",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-05-31T23:10:17-07:00",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:11-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl"
      ]
    },
    {
      "id": "caf703a116cbcdaffb55ac175fe72d926a4bd5ef",
      "tree_id": "30ba4bc99fe0bb099ffad9d90420e62314645106",
      "distinct": false,
      "message": "refactor: migrate git init, status, and basic diff to git2, including using objects more than strings/parsing. (#274)\n\n* refactor: migrate git init, status, and basic diff to git2, including using objects more than strings/parsing.\n\n- Moved repository initialization and validation functions to a new `init.rs` module.\n- Updated `status` function to utilize structured diff handling via git2.\n- Enhanced `commit_diff` to return structured file diffs via git2 for better change representation and perf.\n- Removed redundant and obsolete functions and tests related to previous diff handling.\n- Improved change type mapping and added tests for new functionality.\n- Updated various modules to reflect changes in the git query structure.\n- Try to maintain public API compat as much as possible to (hopefully) avoid breaking a lot of complex stuff in the summarization pipeline.\n\n* fix: remove extraneous origin markers\n\n* fix: extraneous crap around the hunk headers\n\n* fix: copilot review comments\n\n* fix: enable showing untracked content in default diff options",
      "timestamp": "2026-06-02T03:01:11-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/caf703a116cbcdaffb55ac175fe72d926a4bd5ef",
      "author": {
        "name": "Scott McMaster",
        "email": "scott@smcmaster.com",
        "date": "2026-06-02T16:36:42+08:00",
        "username": "scottmcmaster"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:11-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/copilot-instructions.md",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/git/mod.rs",
        "apps/native/src-tauri/src/git/query.rs"
      ]
    },
    {
      "id": "91dce536c8edf277d0c40e1462bd83817e4bff4a",
      "tree_id": "999169a90ce5e5d9e965aab40b5138726307139b",
      "distinct": false,
      "message": "Fix Tauri test build after develop merge\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:38-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/91dce536c8edf277d0c40e1462bd83817e4bff4a",
      "author": {
        "name": "Cursor Agent",
        "email": "cursoragent@cursor.com",
        "date": "2026-06-02T08:51:42Z",
        "username": "cursoragent"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:38-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/peek.rs"
      ]
    },
    {
      "id": "222287e849c2be429d19f4bd2686620845153546",
      "tree_id": "c96ae58744ffb4932b625a9934a8ad6a6a1c394e",
      "distinct": false,
      "message": "Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:39-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/222287e849c2be429d19f4bd2686620845153546",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T01:51:33-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:39-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/evolve/mod.rs"
      ]
    },
    {
      "id": "3077bf6769b8248fdd2ed35b0e5ac72d983d88d4",
      "tree_id": "0d1a64c87b5d7fe069634f1377fc58ca1cab104f",
      "distinct": false,
      "message": "Gate macOS title bar style in Tauri builder\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:39-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/3077bf6769b8248fdd2ed35b0e5ac72d983d88d4",
      "author": {
        "name": "Cursor Agent",
        "email": "cursoragent@cursor.com",
        "date": "2026-06-02T08:54:58Z",
        "username": "cursoragent"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:39-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/main.rs"
      ]
    },
    {
      "id": "02eeb4ad90b05715c052746438b39e40fb7c3673",
      "tree_id": "cb74db0aa2e9a837fb1625954e0215311f5bbee9",
      "distinct": false,
      "message": "Fix evolve config defaults after merge\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:39-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/02eeb4ad90b05715c052746438b39e40fb7c3673",
      "author": {
        "name": "Cursor Agent",
        "email": "cursoragent@cursor.com",
        "date": "2026-06-02T08:55:53Z",
        "username": "cursoragent"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:39-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/evolve/config.rs",
        "apps/native/src-tauri/src/main.rs"
      ]
    },
    {
      "id": "137d5bdd00fa9efda395e37f9428e50434766f07",
      "tree_id": "8e254b3e5649c4eb69d597a71aee59b8fa6d97e9",
      "distinct": false,
      "message": "Isolate evolve config store tests\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:01:39-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/137d5bdd00fa9efda395e37f9428e50434766f07",
      "author": {
        "name": "Cursor Agent",
        "email": "cursoragent@cursor.com",
        "date": "2026-06-02T08:57:31Z",
        "username": "cursoragent"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:01:39-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/evolve/config.rs"
      ]
    },
    {
      "id": "df0d629bc399a91d633c21bbca48296a88bf3dc6",
      "tree_id": "66795ebf4dd87bee8c12e5e7585f962b0688eafe",
      "distinct": false,
      "message": "fix(ci): support indented TOML in sync-versions regex",
      "timestamp": "2026-06-02T03:25:44-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/df0d629bc399a91d633c21bbca48296a88bf3dc6",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:25:44-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:25:44-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "scripts/sync-versions.mjs"
      ]
    },
    {
      "id": "9d75a29b376d40835c05a6b447135117398cfe09",
      "tree_id": "17dece7235a2b2839032961412675e166250ef7c",
      "distinct": false,
      "message": "fix(bootstrap): wire safety check into bootstrap fn",
      "timestamp": "2026-06-02T03:34:12-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/9d75a29b376d40835c05a6b447135117398cfe09",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:12-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:12-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/src/bootstrap/default_config.rs"
      ]
    },
    {
      "id": "5499782cc4ed12b44b8618257b593c907b8443b9",
      "tree_id": "17d8523d6c0aa1dbba599ae7f9b0735872a3f95e",
      "distinct": false,
      "message": "docs(state): add migration plan issues",
      "timestamp": "2026-06-02T03:34:19-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/5499782cc4ed12b44b8618257b593c907b8443b9",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-29T15:05:24-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:19-07:00",
        "username": "czxtm"
      },
      "added": [
        ".beads/issues.json",
        "docs/2026-05-29-state-management-migration-plan.md"
      ],
      "removed": [],
      "modified": []
    },
    {
      "id": "014113dc5017ff64b475cb2a5121934e47c0ec32",
      "tree_id": "7d746f303b31ca48050f78266ddf38d7bfa58bad",
      "distinct": false,
      "message": "ci: relax danger review gates",
      "timestamp": "2026-06-02T03:34:19-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/014113dc5017ff64b475cb2a5121934e47c0ec32",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-29T15:19:39-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:19-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "dangerfile.ts"
      ]
    },
    {
      "id": "cc3fa13176708c314e5a79ebe5973b023280d8e5",
      "tree_id": "39dc2f0a31fe0672c4f612eb7792c16a1f27c2ec",
      "distinct": false,
      "message": "ci: allow no test plan checkbox\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-02T03:34:19-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/cc3fa13176708c314e5a79ebe5973b023280d8e5",
      "author": {
        "name": "Cursor Agent",
        "email": "cursoragent@cursor.com",
        "date": "2026-05-30T06:11:22Z",
        "username": "cursoragent"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:19-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/PULL_REQUEST_TEMPLATE.md",
        "dangerfile.ts"
      ]
    },
    {
      "id": "97359cf285f4a9d8d155cdda6e9f7a04b80504af",
      "tree_id": "41b07fb959b2eb7ba3333f954c68c85e3294e8fc",
      "distinct": false,
      "message": "refactor(configurable): split derive and generated UI",
      "timestamp": "2026-06-02T03:34:19-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/97359cf285f4a9d8d155cdda6e9f7a04b80504af",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-29T15:06:16-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:19-07:00",
        "username": "czxtm"
      },
      "added": [
        "apps/native/src-tauri/configurable-derive/src/attrs.rs",
        "apps/native/src-tauri/configurable-derive/src/codegen.rs",
        "apps/native/src-tauri/configurable-derive/src/fields.rs",
        "apps/native/src-tauri/configurable-derive/src/strings.rs",
        "apps/native/src-tauri/configurable-derive/src/types.rs",
        "apps/native/src-tauri/src/commands/dev_configs.rs",
        "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-config-field.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.tsx"
      ],
      "removed": [],
      "modified": [
        "apps/native/src-tauri/configurable-derive/src/lib.rs",
        "apps/native/src-tauri/configurable/Cargo.toml",
        "apps/native/src-tauri/configurable/src/lib.rs",
        "apps/native/src-tauri/examples/specta_gen_ts.rs",
        "apps/native/src-tauri/src/commands/mod.rs"
      ]
    },
    {
      "id": "ad715e1c6c098f0f09e5c6714ea9b83f0821f75d",
      "tree_id": "45d801828a5a9ce786d8f2aa90c30ac8c9e14a9b",
      "distinct": false,
      "message": "feat(db): add Diesel pool and table models",
      "timestamp": "2026-06-02T03:34:20-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/ad715e1c6c098f0f09e5c6714ea9b83f0821f75d",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-29T15:07:10-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:20-07:00",
        "username": "czxtm"
      },
      "added": [
        "apps/native/src-tauri/src/db/pool.rs",
        "apps/native/src-tauri/src/db/tables.rs"
      ],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/db/commits.rs",
        "apps/native/src-tauri/src/db/mod.rs",
        "apps/native/src-tauri/src/db/schema.rs"
      ]
    },
    {
      "id": "064cee2d4eaa2cac208449c6b19beb0003ea244f",
      "tree_id": "43e38500164eda8519825b9566112ce5334e0017",
      "distinct": false,
      "message": "feat(state): add scoped slice persistence",
      "timestamp": "2026-06-02T03:34:20-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/064cee2d4eaa2cac208449c6b19beb0003ea244f",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-05-29T15:06:54-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T03:34:20-07:00",
        "username": "czxtm"
      },
      "added": [
        "apps/native/src-tauri/src/commands/settings_io.rs",
        "apps/native/src-tauri/src/shared_types/settings_io.rs",
        "apps/native/src-tauri/src/state/preferences.rs",
        "apps/native/src-tauri/src/state/slice/json_io.rs",
        "apps/native/src-tauri/src/state/slice/mod.rs",
        "apps/native/src-tauri/src/state/slice/persistence.rs",
        "apps/native/src-tauri/src/state/slice/registry.rs",
        "apps/native/src-tauri/src/storage/configurable_scope.rs"
      ],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "apps/native/src-tauri/src/commands/config.rs",
        "apps/native/src-tauri/src/evolve/config.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/shared_types.rs",
        "apps/native/src-tauri/src/state/evolve_state.rs",
        "apps/native/src-tauri/src/state/mod.rs",
        "apps/native/src-tauri/src/state/watcher.rs",
        "apps/native/src-tauri/src/storage/mod.rs",
        "apps/native/src-tauri/src/storage/store.rs"
      ]
    },
    {
      "id": "799c08a111578818f909f907813df5f559d86908",
      "tree_id": "17dece7235a2b2839032961412675e166250ef7c",
      "distinct": false,
      "message": "Merge PR #228\n\nimplement derive(Configurable) macro",
      "timestamp": "2026-06-02T03:40:57-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/799c08a111578818f909f907813df5f559d86908",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T03:40:57-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T03:40:57-07:00",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src-tauri/configurable-derive/Cargo.toml",
        "apps/native/src-tauri/configurable-derive/src/lib.rs",
        "apps/native/src-tauri/configurable/Cargo.toml",
        "apps/native/src-tauri/configurable/src/lib.rs",
        "apps/native/src-tauri/src/evolve/config.rs"
      ],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        "Cargo.lock",
        "Cargo.toml",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/peek.rs",
        "scripts/sync-versions.mjs"
      ]
    },
    {
      "id": "4c93f58b1add81002dc703590e12e9f89ab3304e",
      "tree_id": "45d801828a5a9ce786d8f2aa90c30ac8c9e14a9b",
      "distinct": false,
      "message": "Merge PR #247\n\nfeat(db): add Diesel pool and table models",
      "timestamp": "2026-06-02T03:41:08-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/4c93f58b1add81002dc703590e12e9f89ab3304e",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T03:41:08-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T03:41:08-07:00",
        "username": "web-flow"
      },
      "added": [
        "apps/native/src-tauri/src/db/pool.rs",
        "apps/native/src-tauri/src/db/tables.rs"
      ],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/src/db/commits.rs",
        "apps/native/src-tauri/src/db/mod.rs",
        "apps/native/src-tauri/src/db/schema.rs"
      ]
    },
    {
      "id": "5805a7b95c9c3f36dc9f161fad6563caecdbbf67",
      "tree_id": "45d801828a5a9ce786d8f2aa90c30ac8c9e14a9b",
      "distinct": false,
      "message": "Merge PR #246\n\nfeat(state): add scoped slice persistence",
      "timestamp": "2026-06-02T03:45:40-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/5805a7b95c9c3f36dc9f161fad6563caecdbbf67",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T03:45:40-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T03:45:40-07:00",
        "username": "web-flow"
      },
      "added": [
        ".beads/issues.json",
        "apps/native/src-tauri/configurable-derive/src/attrs.rs",
        "apps/native/src-tauri/configurable-derive/src/codegen.rs",
        "apps/native/src-tauri/configurable-derive/src/fields.rs",
        "apps/native/src-tauri/configurable-derive/src/strings.rs",
        "apps/native/src-tauri/configurable-derive/src/types.rs",
        "apps/native/src-tauri/src/commands/dev_configs.rs",
        "apps/native/src-tauri/src/commands/settings_io.rs",
        "apps/native/src-tauri/src/db/pool.rs",
        "apps/native/src-tauri/src/db/tables.rs",
        "apps/native/src-tauri/src/shared_types/settings_io.rs",
        "apps/native/src-tauri/src/state/preferences.rs",
        "apps/native/src-tauri/src/state/slice/json_io.rs",
        "apps/native/src-tauri/src/state/slice/mod.rs",
        "apps/native/src-tauri/src/state/slice/persistence.rs",
        "apps/native/src-tauri/src/state/slice/registry.rs",
        "apps/native/src-tauri/src/storage/configurable_scope.rs",
        "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-config-field.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.tsx",
        "docs/2026-05-29-state-management-migration-plan.md"
      ],
      "removed": [],
      "modified": [
        ".github/PULL_REQUEST_TEMPLATE.md",
        "Cargo.lock",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/configurable-derive/src/lib.rs",
        "apps/native/src-tauri/configurable/Cargo.toml",
        "apps/native/src-tauri/configurable/src/lib.rs",
        "apps/native/src-tauri/examples/specta_gen_ts.rs",
        "apps/native/src-tauri/src/commands/config.rs",
        "apps/native/src-tauri/src/commands/mod.rs",
        "apps/native/src-tauri/src/db/commits.rs",
        "apps/native/src-tauri/src/db/mod.rs",
        "apps/native/src-tauri/src/db/schema.rs",
        "apps/native/src-tauri/src/evolve/config.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/shared_types.rs",
        "apps/native/src-tauri/src/state/evolve_state.rs",
        "apps/native/src-tauri/src/state/mod.rs",
        "apps/native/src-tauri/src/state/watcher.rs",
        "apps/native/src-tauri/src/storage/mod.rs",
        "apps/native/src-tauri/src/storage/store.rs",
        "dangerfile.ts"
      ]
    },
    {
      "id": "696af4136dec67f7970990f77c18be816e608a4a",
      "tree_id": "7ab86d2de29ffb43d13c24769e285d1a3b0f51f5",
      "distinct": false,
      "message": "fix: chromatic token",
      "timestamp": "2026-06-02T04:44:09-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/696af4136dec67f7970990f77c18be816e608a4a",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T04:44:09-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T04:44:09-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        "ops/secrets/secrets.yaml"
      ]
    },
    {
      "id": "903649f3018caba491f654ae7afebb390b3e0674",
      "tree_id": "77980d51a7e2395ec2e2e25fe616ea3744ba40af",
      "distinct": false,
      "message": "ci(storybook): publish preview links",
      "timestamp": "2026-06-02T04:59:01-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/903649f3018caba491f654ae7afebb390b3e0674",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T04:59:01-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T04:59:01-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/workflows/storybook.yaml"
      ]
    },
    {
      "id": "47c3c1368021b47c5b035bb86ad76b72507a79e7",
      "tree_id": "c6866b5519f852f2ac11af2c4e2e53f366b8a434",
      "distinct": false,
      "message": "ci(storybook): deploy before snapshots",
      "timestamp": "2026-06-02T05:02:17-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/47c3c1368021b47c5b035bb86ad76b72507a79e7",
      "author": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T05:02:17-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "Cooper Maruyama",
        "email": "me@cooperm.com",
        "date": "2026-06-02T05:02:17-07:00",
        "username": "czxtm"
      },
      "added": [],
      "removed": [],
      "modified": [
        ".github/workflows/storybook.yaml"
      ]
    },
    {
      "id": "a7eb3b1221908e2434a0ef8ca94fc5de1bafbd66",
      "tree_id": "b0a101ad995a160c1b98de62ce6a9f81eeba9128",
      "distinct": false,
      "message": "Fix new-file content in diff view (#211)\n\n* chore(beads): nixmac-srn nightly release feature\n\n* chore(beads): record PR #195 on nixmac-srn\n\n* chore(beads): file nixmac-62s (TS build blocker) discovered triaging PR #195\n\n* chore(beads): nixmac-srn shipping depends on nixmac-62s (TS build fix)\n\n* fix(native): drop unused Plus and DropdownMenu imports (nixmac-62s)\n\nBoth imports were only referenced inside JSX comments, so tsc flagged\nthem (TS6133/TS6192) and broke the build check on main since bd658afc.\n\nThe env.ts BooleanFromString errors mentioned in the issue do not\nreproduce: apps/native resolves effect to 3.21.0 (transitive) which\nstill exports BooleanFromString. Only the root workspace pulls\neffect@4.0.0-beta.62, but env.ts lives under apps/native.\n\nCloses nixmac-62s.\n\n* chore(beads): close nixmac-62s\n\n* fix(native): migrate env.ts off Schema.BooleanFromString (effect 4.0)\n\nThe repo's bun.lock pins effect@4.0.0-beta.62 (no transitive effect@3.x).\n4.0 removed Schema.BooleanFromString — which env.ts was using — so a\nfresh `bun install --frozen-lockfile` (what CI does) produces a tree\nwhere the import fails to compile. The earlier \"doesn't reproduce\nlocally\" diagnosis on nixmac-62s was misled by a stale symlink at\napps/native/node_modules/effect pointing into node_modules/.bun/effect@3.21.0/\nleft over from an older install run. Locally tsc resolved against the\nstale 3.x version, where BooleanFromString still exists.\n\nMigration:\n- Replace `Schema.BooleanFromString` with\n  `Schema.Literals([\"true\", \"false\"])` (4.0's plural array form; 3.x had\n  variadic `Schema.Literal(...)` — these are not interchangeable).\n- Coerce the validated string to `boolean | undefined` in code so the\n  exported settings type matches the old BooleanFromString shape and\n  downstream consumers (utils.ts:19's `!== true` check) don't need to\n  change.\n- Drop the auto-derived `Schema.Schema.Type<typeof Settings>` because\n  the runtime shape we expose (with the string→bool coercion) differs\n  from the decoded shape.\n\nStrict parsing is preserved: any value other than \"true\"/\"false\" still\nfails at decode time, same as the original.\n\nNote: existing local installs with a stale apps/native/node_modules/effect\nsymlink will need `bun install` to refresh — the stale 3.x effect doesn't\nhave `Schema.Literals` (plural). One-time cost; matches CI from then on.\n\nRefs nixmac-62s.\n\n* chore(beads): file nixmac-rva (Storybook flake) + link as nixmac-srn blocker\n\n* chore(beads): file nixmac-cmu (Rust dead_code) + link as nixmac-srn blocker\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\n\n* chore(beads): file nixmac-k8d (Monaco platform drift) + link as nixmac-srn blocker\n\n* fix(beads): clean up stash-conflict markers in issues.jsonl\n\nPrevious commit 0895711d accidentally included unresolved 'Updated upstream\n/ Stashed changes' markers from a botched git stash pop. Re-exporting via\nbd export produces the correct merged state including nixmac-k8d as the\nfourth nixmac-srn blocker.\n\n* feat(ci): nightly develop→main release with minor version bump (#195)\n\n* feat(ci): nightly develop→main release with minor version bump\n\nAdds a GitHub Actions cron (09:00 UTC daily) that merges develop into\nmain and tags a vMAJ.(MIN+1).0 release. Exits silently when develop has\nno new commits vs main.\n\nThe actual ship work is delegated to build.yaml's existing `tag` mode —\nthe nightly job just produces the merge commit and the tag, then atomically\npushes both. compute-version.sh gets a small defensive edit: when HEAD is\nalready tagged with a v* tag, `release` mode is demoted to `branch` so the\nmain-push event doesn't trigger a duplicate (patch-bumped) ship alongside\nthe tag-push event.\n\nPrerequisites for the cron to push successfully:\n- RELEASE_BOT_TOKEN secret (PAT with bypass), OR\n- repo ruleset bypass for github-actions[bot] on main\n\nWithout either, `git push --atomic` fails on the protected main branch.\nWorkflow falls back to GITHUB_TOKEN so cron + script wiring can be tested\nbefore bypass is granted.\n\nFiles:\n- .github/workflows/nightly-release.yaml (new)\n- ops/scripts/release/nightly-release.sh (new; supports DRY_RUN=1)\n- ops/scripts/release/compute-version.sh (tag-aware release-mode skip)\n\n* feat(ci): scope nightly release trigger to native build affecteds\n\nReplace the simple \"any commit on develop\" trigger with the no-turbo\nequivalent of `turbo run build --affected --filter=native`. Releases now\nfire only when develop has changes inside the native workspace, its\ntransitive workspace deps (currently @nixmac/ui), or global build inputs\n(root package.json, bun.lock, root tsconfig, Cargo.toml/lock).\n\nThis skips nights where develop only got CI/docs/release-script changes\nso a minor version isn't burned on commits that wouldn't ship anything\ndifferent to users.\n\nAdds ops/scripts/release/affected-paths.mjs which dynamically resolves\nthe affected path set by reading the root workspaces config and walking\nworkspace:* deps — no hardcoded list to maintain when new packages\nappear.\n\nVerified locally:\n- Real diff (apps/native/*, Cargo.lock, etc.): release\n- Synthetic diff (ops/, .github/, docs/, *.md): skip\n- Synthetic diff (bun.lock only): release (global input)\n\n* fix(ci): address Copilot review feedback on nightly-release\n\n- next_minor_version: filter to stable vMAJ.MIN.PATCH only so disposable\n  -test.N tags (used by build.yaml for signing rehearsals) can't pollute\n  the bump base\n- Remote tag existence check: use `git ls-remote --exit-code` with an\n  exact ref pattern instead of `grep -q \"${tag}\"`, which would false-\n  positive when a longer tag like v1.2.0-test.1 contains the candidate\n  as a substring\n- Docstring: align step 2 with actual behavior (logs a one-liner then\n  exits 0, not strictly silent)\n- Workflow: add concurrency group so a scheduled run + manual dispatch\n  can't race on the same next-tag computation. cancel-in-progress=false\n  to avoid aborting a half-completed merge+tag mid-flight\n\n* docs(ci): align skip-message wording with affected-paths policy\n\nCopilot follow-up: three places still described the skip condition as\n\"no new commits vs main\" or \"skip silently\". The actual policy is the\naffected-paths filter (no-turbo equivalent of\n`turbo run build --affected --filter=native`), which can return false\neven when develop has commits — they just don't touch the native build\ngraph.\n\n- should_release docstring: \"skip silently\" → \"skip (caller logs reason)\"\n- main() skip log: \"develop has no new work\" → \"no changes affect the\n  native build graph\"\n- workflow header: \"no new commits vs main\" → explanation of the\n  affected-paths filter and what kinds of develop activity will no-op\n\nNo behavior change.\n\n* fix(ci): nightly-release cwd-independence and ..→... range\n\nCopilot follow-up. Two real bugs:\n\n1. The script claimed cwd-independence via REPO_ROOT but only used it for\n   the affected-paths.mjs invocation. Every git command and the\n   `node -p require('./package.json')` fallback ran relative to the\n   caller's cwd, so invoking the script from anywhere other than the\n   repo root would fail. main() now `cd`s into REPO_ROOT before doing\n   any work, which makes the cwd-independence claim actually true.\n\n2. should_release used `git diff origin/main..origin/develop` (two-dot\n   range), which is tip-to-tip. If main has a hotfix not on develop,\n   two-dot treats it as a develop-side deletion and flags it as a\n   change — falsely triggering a release every night until the hotfix\n   gets merged back. Three-dot (`origin/main...origin/develop`) diffs\n   from the merge-base, so only commits new on develop are counted.\n\nVerified locally: running the script from /tmp now produces the same\ndry-run plan as running from the repo root. Two-dot vs three-dot on\ncurrent origin/main vs origin/develop differs by one file, confirming\nthere is currently a hotfix-style commit on main that the old check\nwould have erroneously counted.\n\n* docs/fix(ci): nightly-release token fallback + optional-env docstring\n\nCopilot follow-up:\n\n1. Workflow checkout's token fallback used `secrets.GITHUB_TOKEN` as the\n   `||` second operand. While that *does* work in normal expression\n   contexts (it's GitHub's documented way to reference the auto-injected\n   token), the `github.token` context form is more reliable in fallback\n   positions and `if:` evaluations. Switched to\n   `secrets.RELEASE_BOT_TOKEN || github.token` for that defensive reason.\n\n2. Header docstring claimed GIT_USER_NAME / GIT_USER_EMAIL were \"Required\n   env\" but the code uses `if [[ -n \"${VAR:-}\" ]]` guards and silently\n   skips git config when unset. They're actually optional CI overrides\n   that fall back to the caller's existing git config — fine for local\n   rehearsals, expected to be set in CI for bot-identity attribution.\n   Updated the comment to match the actual code.\n\nNo behavior change.\n\n* fix(ci): defensive Copilot follow-ups on nightly-release\n\n1. DRY_RUN expression now gates on `github.event_name == 'workflow_dispatch'`\n   before reading `inputs.dry_run`. The `inputs.*` context is only\n   populated for dispatch events; gating ensures scheduled cron runs\n   always get '0' regardless of how GitHub resolves missing-input refs.\n\n2. compute-version.sh tag-skip regex now anchored with `$` so disposable\n   `v0.22.0-test.N` tags (used for signing/notarization rehearsals)\n   don't suppress legitimate `main`-push releases. Test tags don't ship\n   (publish/R2/Linear steps in build.yaml skip them), so main-push must\n   still bump+ship normally if such a tag happens to be at HEAD.\n   Verified: `v1.2.3` matches the regex (correctly skips release mode),\n   `v1.2.3-test.1` does not match (correctly does not suppress).\n\n3. affected-paths.mjs now normalizes `package.json#workspaces` to handle\n   both the npm/bun array form and the Yarn object form\n   (`{ packages: [...] }`). nixmac uses the array form today; supporting\n   both is cheap future-proofing if the repo ever switches package\n   manager.\n\n* docs/fix(ci): nightly-release docstring + unconditional fetch\n\nCopilot follow-up:\n\n1. Header step 4 said \"Fast-forward / no-ff merge\" but the implementation\n   always uses `git merge --no-ff`. Updated the comment to match the\n   actual behavior (always produces a merge commit so the release\n   boundary stays visible in git log --first-parent).\n\n2. `git fetch` was DRY_RUN-gated, but should_release and\n   next_minor_version both query local refs (origin/main..origin/develop\n   diff + `git tag --list` for the latest stable). On a stale checkout\n   the dry-run could compute a wrong next version or false-positive\n   \"nothing to release\". Unwrap the fetch from `run` so it always\n   executes — fetch is read-only from the project's perspective (only\n   updates local origin/* refs), so unconditional execution is safe and\n   makes dry-run output reflect real remote state.\n\nVerified: the unconditional fetch pulled a fresh v0.23.2 tag on this\nrun that the local checkout didn't have, validating the fix on its\nfirst execution.\n\n* fix(native): fix Chromatic Storybook\n\nUltraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* fix(native): env.ts — drop version-skewed Schema.Literal for plain String\n\nPR #195 build broke at TS2554 (\"Expected 1 arguments, but got 2\") after\n80a19c67 reverted NIX_INSTALLED_OVERRIDE from `Schema.Literals([...])` to\n`Schema.Literal(...)` (variadic). The problem: `Schema.Literal`'s signature\nis fundamentally version-skewed —\n\n  effect 3.x:       `Literal<L>(...values: L)`     variadic, multi-value\n  effect 4.0-beta:  `Literal<L>(value: L)`         single value only,\n                    use `Literals([...])` for sets\n\nSo neither form source-compiles in both:\n\n- `Schema.Literal(\"true\", \"false\")` works in 3.x, fails 4.0 (this PR)\n- `Schema.Literals([\"true\", \"false\"])` works in 4.0, fails 3.x (Chromatic)\n\nThe repo's lockfile pins effect 4.0-beta, so tsc sees that — but the\nChromatic/storybook test environment can resolve 3.x via workspace\nsymlink hoisting, which is why 80a19c67 picked the 3.x form to fix\nChromatic and broke the build instead.\n\nFix: validate with plain `Schema.String` (signature is identical across\nversions) and coerce to boolean in code via\n`raw.NIX_INSTALLED_OVERRIDE === \"true\" ? true : undefined`. The only\ndownstream consumer is `settings.NIX_INSTALLED_OVERRIDE !== true` in\nwidget/utils.ts, which treats any non-\"true\" value as functionally\nfalse — so silent acceptance of unexpected strings is observationally\nequivalent to coercing them to undefined. We lose schema-level\n\"must be 'true' or 'false'\" strictness; we gain working CI on both\nthe build and Chromatic paths.\n\nVerified against both effect@3.21.0 and effect@4.0.0-beta.62 symlinks\nin isolation: no TS2554, no missing-Literals errors.\n\n* fix(ci): nightly-release DRY_RUN final-message clarity\n\nCopilot follow-up: the final `echo \"Released ${tag}\"` ran unconditionally,\nso workflow_dispatch dry-runs printed \"Released v0.24.0\" even though the\nmerge/tag/push steps were only echoed. Now branches on DRY_RUN: prints\n\"Dry run complete — would have released ${tag}\" in dry mode, \"Released\n${tag}\" in real mode. Behavior preserved; just the operator-facing log\nline distinguishes the two modes.\n\nDid not touch the `local changed paths file path` declaration in\nshould_release — Copilots claim that `path` is unused is incorrect.\n`path` is the inner loops read variable on line 85 and is used in the\npath-matching comparisons on lines 87, 89, 91, and 92.\n\n* fix(ci): nightly-release working-tree guard + setup-node pin\n\nCopilot follow-up:\n\n1. Add a clean-working-tree guard before the destructive `git reset --hard\n   origin/${MAIN_BRANCH}`. Local accidental invocations would otherwise\n   silently obliterate uncommitted work. CI runners start clean by\n   construction so the guard never fires in CI; DRY_RUN=1 bypasses it\n   since dry-mode does not mutate the tree. Error path prints\n   `git status --short` so the operator can see what would have been lost.\n\n2. Add an actions/setup-node@v6 step pinned to node-version: 20 (matching\n   build.yaml's convention). The release script invokes node for\n   affected-paths.mjs and the package.json version fallback in\n   next_minor_version. Without an explicit pin the cron would depend on\n   whatever node the ubuntu-latest runner image ships, which is not stable\n   across image updates.\n\nVerified: bash -n passes, dry-run still works, guard simulation triggers\ncorrectly on dirty tree and stays out of the way in DRY_RUN=1.\n\n---------\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\n\n* Fix new file diff rendering fallback\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Add dev config IPC bindings\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Fix native Rust build wiring\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n* Allow dormant Rust helper code\n\nCo-authored-by: cooper <czxtm@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Cooper Maruyama <me@cooperm.com>\nCo-authored-by: cooper <1325802+czxtm@users.noreply.github.com>\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>\nCo-authored-by: Cursor Agent <cursoragent@cursor.com>\nCo-authored-by: cooper <czxtm@users.noreply.github.com>",
      "timestamp": "2026-06-03T01:21:17Z",
      "url": "https://github.com/darkmatter/nixmac/commit/a7eb3b1221908e2434a0ef8ca94fc5de1bafbd66",
      "author": {
        "name": "cursor[bot]",
        "email": "206951365+cursor[bot]@users.noreply.github.com",
        "date": "2026-06-03T01:21:17Z",
        "username": "cursor[bot]"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-03T01:21:17Z",
        "username": "web-flow"
      },
      "added": [],
      "removed": [],
      "modified": [
        "Cargo.lock",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/examples/specta_gen_ts.rs",
        "apps/native/src-tauri/src/db/commits.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/state/watcher.rs",
        "apps/native/src-tauri/src/storage/credential_store.rs",
        "apps/native/src-tauri/src/system/nix.rs",
        "apps/native/src/components/widget/summaries/full-file-diff-editor.tsx",
        "apps/native/src/components/widget/utils.test.ts",
        "apps/native/src/components/widget/utils.ts",
        "apps/native/src/ipc/api.ts",
        "apps/native/src/ipc/types.ts"
      ]
    },
    {
      "id": "a6d951c0ee1a899e6721260049c391cf177b3267",
      "tree_id": "6f5dd25c1e9f63534a0d275c5579c13fdf8e4937",
      "distinct": true,
      "message": "Merge branch 'develop' into rebase-main",
      "timestamp": "2026-06-02T21:24:04-07:00",
      "url": "https://github.com/darkmatter/nixmac/commit/a6d951c0ee1a899e6721260049c391cf177b3267",
      "author": {
        "name": "cooper",
        "email": "1325802+czxtm@users.noreply.github.com",
        "date": "2026-06-02T21:24:04-07:00",
        "username": "czxtm"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2026-06-02T21:24:04-07:00",
        "username": "web-flow"
      },
      "added": [
        ".beads/issues.json",
        ".github/copilot-instructions.md",
        "apps/native/src-tauri/configurable-derive/Cargo.toml",
        "apps/native/src-tauri/configurable-derive/src/attrs.rs",
        "apps/native/src-tauri/configurable-derive/src/codegen.rs",
        "apps/native/src-tauri/configurable-derive/src/fields.rs",
        "apps/native/src-tauri/configurable-derive/src/lib.rs",
        "apps/native/src-tauri/configurable-derive/src/strings.rs",
        "apps/native/src-tauri/configurable-derive/src/types.rs",
        "apps/native/src-tauri/configurable/Cargo.toml",
        "apps/native/src-tauri/configurable/src/lib.rs",
        "apps/native/src-tauri/src/commands/dev_configs.rs",
        "apps/native/src-tauri/src/commands/settings_io.rs",
        "apps/native/src-tauri/src/db/pool.rs",
        "apps/native/src-tauri/src/db/tables.rs",
        "apps/native/src-tauri/src/evolve/config.rs",
        "apps/native/src-tauri/src/git/init.rs",
        "apps/native/src-tauri/src/git/query.rs",
        "apps/native/src-tauri/src/shared_types/settings_io.rs",
        "apps/native/src-tauri/src/state/preferences.rs",
        "apps/native/src-tauri/src/state/slice/json_io.rs",
        "apps/native/src-tauri/src/state/slice/mod.rs",
        "apps/native/src-tauri/src/state/slice/persistence.rs",
        "apps/native/src-tauri/src/state/slice/registry.rs",
        "apps/native/src-tauri/src/storage/configurable_scope.rs",
        "apps/native/src/components/nix-editor/index.test.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-config-field.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
        "apps/native/src/components/widget/settings/auto-tuning-section.tsx",
        "apps/native/src/hooks/use-evolve.test.ts",
        "docs/2026-05-29-state-management-migration-plan.md",
        "nix/pkgs/tauri-wd.nix",
        "scripts/tart-run.sh"
      ],
      "removed": [],
      "modified": [
        ".beads/issues.jsonl",
        ".github/PULL_REQUEST_TEMPLATE.md",
        ".github/workflows/build.yaml",
        ".github/workflows/computer-use-e2e.yml",
        ".github/workflows/danger.yml",
        ".github/workflows/e2e.yml",
        ".github/workflows/nightly-release.yaml",
        ".github/workflows/peekaboo-e2e.yml",
        ".github/workflows/storybook.yaml",
        "CODEOWNERS",
        "Cargo.lock",
        "Cargo.toml",
        "README.md",
        "apps/native/e2e-tauri/README.md",
        "apps/native/e2e-tauri/wdio.conf.base.mjs",
        "apps/native/src-tauri/Cargo.toml",
        "apps/native/src-tauri/examples/specta_gen_ts.rs",
        "apps/native/src-tauri/prompts/system.md",
        "apps/native/src-tauri/resources/nix-darwin-docs.json",
        "apps/native/src-tauri/scripts/tauri-dev.sh",
        "apps/native/src-tauri/src/ai/log_summarizer.rs",
        "apps/native/src-tauri/src/ai/providers/ollama.rs",
        "apps/native/src-tauri/src/ai/providers/openai.rs",
        "apps/native/src-tauri/src/bootstrap/default_config.rs",
        "apps/native/src-tauri/src/commands/config.rs",
        "apps/native/src-tauri/src/commands/git.rs",
        "apps/native/src-tauri/src/commands/mod.rs",
        "apps/native/src-tauri/src/db/commits.rs",
        "apps/native/src-tauri/src/db/mod.rs",
        "apps/native/src-tauri/src/db/schema.rs",
        "apps/native/src-tauri/src/editor/mod.rs",
        "apps/native/src-tauri/src/evolve/config_dir_context.rs",
        "apps/native/src-tauri/src/evolve/file_ops.rs",
        "apps/native/src-tauri/src/evolve/lifecycle.rs",
        "apps/native/src-tauri/src/evolve/mod.rs",
        "apps/native/src-tauri/src/evolve/providers/ollama.rs",
        "apps/native/src-tauri/src/evolve/providers/openai.rs",
        "apps/native/src-tauri/src/evolve/search_code.rs",
        "apps/native/src-tauri/src/evolve/search_docs.rs",
        "apps/native/src-tauri/src/evolve/tools.rs",
        "apps/native/src-tauri/src/evolve/types.rs",
        "apps/native/src-tauri/src/evolve/utils.rs",
        "apps/native/src-tauri/src/feedback.rs",
        "apps/native/src-tauri/src/git/changes_from_diff.rs",
        "apps/native/src-tauri/src/git/exec.rs",
        "apps/native/src-tauri/src/git/mod.rs",
        "apps/native/src-tauri/src/history/get_history.rs",
        "apps/native/src-tauri/src/main.rs",
        "apps/native/src-tauri/src/managed_edits/managed_edit.rs",
        "apps/native/src-tauri/src/peek.rs",
        "apps/native/src-tauri/src/rebuild/finalize_apply.rs",
        "apps/native/src-tauri/src/rebuild/rollback.rs",
        "apps/native/src-tauri/src/shared_types.rs",
        "apps/native/src-tauri/src/shared_types/evolve.rs",
        "apps/native/src-tauri/src/shared_types/feedback.rs",
        "apps/native/src-tauri/src/shared_types/git.rs",
        "apps/native/src-tauri/src/state/completion_log.rs",
        "apps/native/src-tauri/src/state/evolve_state.rs",
        "apps/native/src-tauri/src/state/mod.rs",
        "apps/native/src-tauri/src/state/watcher.rs",
        "apps/native/src-tauri/src/storage/credential_store.rs",
        "apps/native/src-tauri/src/storage/mod.rs",
        "apps/native/src-tauri/src/storage/store.rs",
        "apps/native/src-tauri/src/summarize/mod.rs",
        "apps/native/src-tauri/src/summarize/pipelines/history.rs",
        "apps/native/src-tauri/src/system/nix.rs",
        "apps/native/src-tauri/src/system/permissions.rs",
        "apps/native/src/components/nix-editor/index.tsx",
        "apps/native/src/components/widget/controls/directory-picker.test.tsx",
        "apps/native/src/components/widget/feedback/feedback-dialog.tsx",
        "apps/native/src/components/widget/filesystem/__snapshots__/file-list.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/seed-prompt.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/__snapshots__/untracked-card.stories.tsx.snap",
        "apps/native/src/components/widget/filesystem/data.ts",
        "apps/native/src/components/widget/overlays/__snapshots__/rebuild-overlay-panel.stories.tsx.snap",
        "apps/native/src/components/widget/promptinput/prompt-input.tsx",
        "apps/native/src/components/widget/steps/setup-step.test.tsx",
        "apps/native/src/components/widget/summaries/full-file-diff-editor.tsx",
        "apps/native/src/components/widget/utils.test.ts",
        "apps/native/src/components/widget/utils.ts",
        "apps/native/src/hooks/use-evolve.ts",
        "apps/native/src/hooks/use-rollback.test.ts",
        "apps/native/src/ipc/api.ts",
        "apps/native/src/ipc/types.ts",
        "apps/native/src/lib/env.ts",
        "apps/native/src/lib/utils.ts",
        "apps/native/src/stores/widget-store.impl.ts",
        "apps/native/src/types/feedback.ts",
        "dangerfile.ts",
        "nix/dev.nix",
        "nix/e2e/default.nix",
        "ops/secrets/secrets.yaml",
        "scripts/sync-versions.mjs",
        "scripts/update-nix-darwin-docs.py"
      ]
    }
  ],
  "head_commit": {
    "id": "a6d951c0ee1a899e6721260049c391cf177b3267",
    "tree_id": "6f5dd25c1e9f63534a0d275c5579c13fdf8e4937",
    "distinct": true,
    "message": "Merge branch 'develop' into rebase-main",
    "timestamp": "2026-06-02T21:24:04-07:00",
    "url": "https://github.com/darkmatter/nixmac/commit/a6d951c0ee1a899e6721260049c391cf177b3267",
    "author": {
      "name": "cooper",
      "email": "1325802+czxtm@users.noreply.github.com",
      "date": "2026-06-02T21:24:04-07:00",
      "username": "czxtm"
    },
    "committer": {
      "name": "GitHub",
      "email": "noreply@github.com",
      "date": "2026-06-02T21:24:04-07:00",
      "username": "web-flow"
    },
    "added": [
      ".beads/issues.json",
      ".github/copilot-instructions.md",
      "apps/native/src-tauri/configurable-derive/Cargo.toml",
      "apps/native/src-tauri/configurable-derive/src/attrs.rs",
      "apps/native/src-tauri/configurable-derive/src/codegen.rs",
      "apps/native/src-tauri/configurable-derive/src/fields.rs",
      "apps/native/src-tauri/configurable-derive/src/lib.rs",
      "apps/native/src-tauri/configurable-derive/src/strings.rs",
      "apps/native/src-tauri/configurable-derive/src/types.rs",
      "apps/native/src-tauri/configurable/Cargo.toml",
      "apps/native/src-tauri/configurable/src/lib.rs",
      "apps/native/src-tauri/src/commands/dev_configs.rs",
      "apps/native/src-tauri/src/commands/settings_io.rs",
      "apps/native/src-tauri/src/db/pool.rs",
      "apps/native/src-tauri/src/db/tables.rs",
      "apps/native/src-tauri/src/evolve/config.rs",
      "apps/native/src-tauri/src/git/init.rs",
      "apps/native/src-tauri/src/git/query.rs",
      "apps/native/src-tauri/src/shared_types/settings_io.rs",
      "apps/native/src-tauri/src/state/preferences.rs",
      "apps/native/src-tauri/src/state/slice/json_io.rs",
      "apps/native/src-tauri/src/state/slice/mod.rs",
      "apps/native/src-tauri/src/state/slice/persistence.rs",
      "apps/native/src-tauri/src/state/slice/registry.rs",
      "apps/native/src-tauri/src/storage/configurable_scope.rs",
      "apps/native/src/components/nix-editor/index.test.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-config-field.tsx",
      "apps/native/src/components/widget/settings/auto-tuning-section.stories.tsx",
      "apps/native/src/components/widget/settings/auto-tuning-section.tsx",
      "apps/native/src/hooks/use-evolve.test.ts",
      "docs/2026-05-29-state-management-migration-plan.md",
      "nix/pkgs/tauri-wd.nix",
      "scripts/tart-run.sh"
    ],
    "removed": [],
    "modified": [
      ".beads/issues.jsonl",
      ".github/PULL_REQUEST_TEMPLATE.md",
      ".github/workflows/build.yaml",
      ".github/workflows/computer-use-e2e.yml",
      ".github/workflows/danger.yml",
      ".github/workflows/e2e.yml",
      ".github/workflows/nightly-release.yaml",
      ".github/workflows/peekaboo-e2e.yml",
      ".github/workflows/storybook.yaml",
      "CODEOWNERS",
      "Cargo.lock",
      "Cargo.toml",
      "README.md",
      "apps/native/e2e-tauri/README.md",
      "apps/native/e2e-tauri/wdio.conf.base.mjs",
      "apps/native/src-tauri/Cargo.toml",
      "apps/native/src-tauri/examples/specta_gen_ts.rs",
      "apps/native/src-tauri/prompts/system.md",
      "apps/native/src-tauri/resources/nix-darwin-docs.json",
      "apps/native/src-tauri/scripts/tauri-dev.sh",
      "apps/native/src-tauri/src/ai/log_summarizer.rs",
      "apps/native/src-tauri/src/ai/providers/ollama.rs",
      "apps/native/src-tauri/src/ai/providers/openai.rs",
      "apps/native/src-tauri/src/bootstrap/default_config.rs",
      "apps/native/src-tauri/src/commands/config.rs",
      "apps/native/src-tauri/src/commands/git.rs",
      "apps/native/src-tauri/src/commands/mod.rs",
      "apps/native/src-tauri/src/db/commits.rs",
      "apps/native/src-tauri/src/db/mod.rs",
      "apps/native/src-tauri/src/db/schema.rs",
      "apps/native/src-tauri/src/editor/mod.rs",
      "apps/native/src-tauri/src/evolve/config_dir_context.rs",
      "apps/native/src-tauri/src/evolve/file_ops.rs",
      "apps/native/src-tauri/src/evolve/lifecycle.rs",
      "apps/native/src-tauri/src/evolve/mod.rs",
      "apps/native/src-tauri/src/evolve/providers/ollama.rs",
      "apps/native/src-tauri/src/evolve/providers/openai.rs",
      "apps/native/src-tauri/src/evolve/search_code.rs",
      "apps/native/src-tauri/src/evolve/search_docs.rs",
      "apps/native/src-tauri/src/evolve/tools.rs",
      "apps/native/src-tauri/src/evolve/types.rs",
      "apps/native/src-tauri/src/evolve/utils.rs",
      "apps/native/src-tauri/src/feedback.rs",
      "apps/native/src-tauri/src/git/changes_from_diff.rs",
      "apps/native/src-tauri/src/git/exec.rs",
      "apps/native/src-tauri/src/git/mod.rs",
      "apps/native/src-tauri/src/history/get_history.rs",
      "apps/native/src-tauri/src/main.rs",
      "apps/native/src-tauri/src/managed_edits/managed_edit.rs",
      "apps/native/src-tauri/src/peek.rs",
      "apps/native/src-tauri/src/rebuild/finalize_apply.rs",
      "apps/native/src-tauri/src/rebuild/rollback.rs",
      "apps/native/src-tauri/src/shared_types.rs",
      "apps/native/src-tauri/src/shared_types/evolve.rs",
      "apps/native/src-tauri/src/shared_types/feedback.rs",
      "apps/native/src-tauri/src/shared_types/git.rs",
      "apps/native/src-tauri/src/state/completion_log.rs",
      "apps/native/src-tauri/src/state/evolve_state.rs",
      "apps/native/src-tauri/src/state/mod.rs",
      "apps/native/src-tauri/src/state/watcher.rs",
      "apps/native/src-tauri/src/storage/credential_store.rs",
      "apps/native/src-tauri/src/storage/mod.rs",
      "apps/native/src-tauri/src/storage/store.rs",
      "apps/native/src-tauri/src/summarize/mod.rs",
      "apps/native/src-tauri/src/summarize/pipelines/history.rs",
      "apps/native/src-tauri/src/system/nix.rs",
      "apps/native/src-tauri/src/system/permissions.rs",
      "apps/native/src/components/nix-editor/index.tsx",
      "apps/native/src/components/widget/controls/directory-picker.test.tsx",
      "apps/native/src/components/widget/feedback/feedback-dialog.tsx",
      "apps/native/src/components/widget/filesystem/__snapshots__/file-list.stories.tsx.snap",
      "apps/native/src/components/widget/filesystem/__snapshots__/seed-prompt.stories.tsx.snap",
      "apps/native/src/components/widget/filesystem/__snapshots__/untracked-card.stories.tsx.snap",
      "apps/native/src/components/widget/filesystem/data.ts",
      "apps/native/src/components/widget/overlays/__snapshots__/rebuild-overlay-panel.stories.tsx.snap",
      "apps/native/src/components/widget/promptinput/prompt-input.tsx",
      "apps/native/src/components/widget/steps/setup-step.test.tsx",
      "apps/native/src/components/widget/summaries/full-file-diff-editor.tsx",
      "apps/native/src/components/widget/utils.test.ts",
      "apps/native/src/components/widget/utils.ts",
      "apps/native/src/hooks/use-evolve.ts",
      "apps/native/src/hooks/use-rollback.test.ts",
      "apps/native/src/ipc/api.ts",
      "apps/native/src/ipc/types.ts",
      "apps/native/src/lib/env.ts",
      "apps/native/src/lib/utils.ts",
      "apps/native/src/stores/widget-store.impl.ts",
      "apps/native/src/types/feedback.ts",
      "dangerfile.ts",
      "nix/dev.nix",
      "nix/e2e/default.nix",
      "ops/secrets/secrets.yaml",
      "scripts/sync-versions.mjs",
      "scripts/update-nix-darwin-docs.py"
    ]
  }
}