[{"name":"tests","kind":"directory","size":0,"lastCommitHash":"4bf122bb6fd3455b09511791a16a00022098f8a7","lastCommitWhen":"2026-09-14T18:02:33-04:00","lastCommitMessage":"add a persistent update channel with a /nightly command (#2323)\n\n* add a persistent update channel with a /beta command\n\nSelf-updates read latest.json or beta.json based on the running version's\nprerelease tag, with no way to choose. This adds an updateChannel setting,\n--beta/--stable flags on prime-agent update that persist it, a /beta slash\ncommand that switches to beta and updates immediately (/beta off returns to\nstable, /beta status reports the choice), and routes startup version notices\nand compiled-install updates through the same preference.\n\n* apply formatter output from pre-commit check\n\n* warn and confirm before switching updates to the beta channel\n\n/beta no longer flips the setting itself. The update command prints that beta\nbuilds are unreleased and may be broken, asks for confirmation unless --force\nis given, persists the channel only after a yes, and then continues into the\nexisting busy-session confirmation.\n\n* let a channel switch install the current beta and read the channel from global settings\n\nA stable 1.2.3 never saw 1.2.3-beta.N as an update because prerelease ordering\nranks it lower. isReleaseUpdateCandidate keeps same-channel updates strictly\nnewer but accepts a different version with a base version that is not older\nwhen the user explicitly switched channels. The CLI, compiled updates, and\nstartup notices use it. getUpdateChannel now reads global settings only, so a\nproject settings file cannot override the user's choice, and ignores values\nother than stable or beta.\n\n* gate the beta switch before any update work and never persist it on cancel\n\nThe public update command now accepts --beta and --stable. The beta warning\nand confirmation run before extensions are touched, the channel is persisted\nonly after the busy-session confirmation succeeds or when nothing needs\ninstalling, and a beta manifest that cannot be resolved aborts instead of\nfalling back to the stable registry package. Cancelled or refused updates exit\nwith the not-attempted code when launched from the interactive client, so\n/beta declined is a no-op rather than a relaunch.\n\n* treat an unresolved beta manifest as a no-op for compiled installs and reject channel flags on extension-only updates\n\ngetNativeUpdatePlan now throws NativeReleaseUnavailableError when the manifest\ncannot be resolved, and the self-update plan maps that to the same\nnon-runnable beta-unavailable result the npm path uses, so /beta does not\nrelaunch the client when nothing was installed. --beta and --stable are\nrejected for extension-only targets rather than being accepted and ignored,\nmirroring --rollback.\n\n* keep exit code 1 when the session-loss prompt is declined\n\nThe interactive parent relies on a non-sentinel exit there, and an existing\ntest pins it. The not-attempted sentinel stays for the beta-specific\ncancellations: the beta warning declined, the non-TTY refusal, and an\nunresolvable beta manifest.\n\n* map every failed compiled-release lookup to the unavailable plan and save a confirmed channel even without an updater\n\nNetwork, timeout, and malformed-manifest errors from the compiled release\nlookup now surface as NativeReleaseUnavailableError with the cause attached,\nso a /beta run on a compiled install is a no-op instead of a failed update\nthat relaunches the client. When no self-update command exists for the\ninstall, the already-confirmed channel switch is still persisted before the\nmanual-update guidance is printed.\n\n* benchmarks: clamp CPU deltas at zero when a child exits mid-measurement\n\ncpu_total() sums CPU time over the live process tree, so a process exiting\nbetween the start and end samples lowers the total and the raw delta can go\nslightly negative. The report schema rejects negative observations, which\naborted the agents_view trial on the main baseline and left 19 measurements\nincomplete. cpu_delta() clamps at zero; all ten sites use it.\n\n* list the channel flags in the public update help\n\nThe public command registry renders its own usage for prime-agent update\n--help; it still advertised only --force and --rollback.\n\n* rename the channel surface to nightly\n\n/nightly, --nightly, the saved updateChannel value, and every message now say\nnightly. The release bucket still publishes these builds as beta (beta.json and\n-beta.N version tags), so that mapping stays internal to version-check.\n\n* never install a lower base version, even with --force\n\n--force is also how a channel switch is scripted without a TTY, so it must not\ndouble as permission to downgrade. Both the npm and compiled update plans now\nrefuse a release whose major.minor.patch is below the installed version and\nleave the channel unchanged; compiled installs are pointed at --rollback.\n\n* report being ahead of a channel as nothing to update\n\nA channel whose current release is below the installed base version is still\nnever installed, but without --force that is now a green no-op with the\nnot-attempted exit code, so a plain update or /nightly off while ahead does\nnot fail or relaunch the client. With --force the refusal stays explicit. The\ncompiled path returns the refusal in its plan instead of throwing, so the\ninteractive client treats it the same way.\n\n* guard a missing nightly manifest by the effective channel\n\nA -beta install with no saved preference is on the nightly channel by\ninference, so an unresolvable manifest must abort for it too instead of\nfalling through to the stable registry package.\n\n* reload settings after the updater child returns without relaunching\n\n/nightly persists the channel inside the update child. When that child installs\nnothing, the interactive parent keeps running with its in-memory settings, so\n/nightly status could report the old channel. Reload from disk before reporting.\n\n* say what was not updated instead of claiming nothing was installed\n\nWith an all target, extensions may already have been updated before the\nnightly manifest lookup fails or a downgrade is refused. Both messages now\nstate that Prime Agent itself was not updated.\n\n* keep a successful extension update when the self update is unavailable\n\nFor an all target the extensions are updated before the self update is\nplanned. A missing nightly manifest or refused downgrade now reports that\nPrime Agent was not updated without failing the run that already updated\nextensions.\n\n---------\n\nCo-authored-by: Seth Karten <32787133+sethkarten@users.noreply.github.com>"},{"name":".gitignore","kind":"file","size":29,"lastCommitHash":"f9c7e06b58b9760944abb33b81f758ce5df1a1b3","lastCommitWhen":"2026-09-09T16:20:36-07:00","lastCommitMessage":"benchmark prime agent performance on pull request updates (#2160)\n\n* ci: benchmark prime agent pull request updates\n\nRefs ENG-6043\n\n* docs: clarify benchmark installation prerequisites\n\nRefs ENG-6043\n\n* ci: reduce benchmark debounce to two seconds\n\nRefs ENG-6043; fixes #2160\n\n* ci: run benchmark harness tests in existing CI\n\nRefs ENG-6043; fixes #2160\n\n* ci: benchmark local runtime performance without inference\n\nRefs ENG-6043; fixes #2160\n\n* test: calibrate benchmark noise thresholds\n\nRefs ENG-6043; fixes #2160"},{"name":"cli.py","kind":"file","size":7285,"lastCommitHash":"c872594b758882ed7f814815f1e002e85033a657","lastCommitWhen":"2026-09-12T02:21:02-07:00","lastCommitMessage":"fix benchmark readiness and incomplete run reporting (#2254)\n\n* fix benchmark editor readiness and failed run reporting\n\n* fix benchmark diagnostics and preserve first-use measurements\n\n* remove redundant python language test\n\n* bound benchmark terminal writes under backpressure"},{"name":"config.json","kind":"file","size":421,"lastCommitHash":"7a049d50c61ed5a93e65060255e54d752f56dbf2","lastCommitWhen":"2026-09-14T08:24:39+02:00","lastCommitMessage":"feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043) (#2211)\n\n* feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043)\n\nExtend the PR benchmark harness with a UI/UX interaction suite driven over a\nPTY against the interactive TUI, reported as a new \"UI interactions\" section\nin the PR comment.\n\nDeterministic fixtures, regenerated per trial so no state leaks: 280 top-level\nsessions (3 large, one ~40 MB transcript; 150 medium; 40 ledger fan-out\nchildren) plus a 6-deep subagent chain linked through the same spawn-ledger\nrecords the daemon replays. No inference is called.\n\nMeasured interactions, each with wall time, process-tree CPU (utime+stime of\nthe whole benchmark-user tree), and PTY bytes in the raw results:\n\n- resume_large: cold --resume of a large session, spawn to rendered tail\n- switch_large: warm /resume switch into the ~40 MB transcript\n- agents_view: session -> agents view (left-arrow to splash)\n- agents_roster: full roster settle with many saved sessions and ledger edges\n- agents_open: agents view -> another large session (search + open)\n- parent_open: open the subagent chain parent with its recorded children\n- subagent_open: clear-expand-step drill into the live chain to depth 6\n- ui_rss: summed tree RSS after the scenario\n\nInteraction readiness is the rendered transcript tail plus a confirmed editor\necho, never a spinner or status line; keystrokes are echo-verified with\nretries because the TUI can drop input during large renders. ui_trials\ndefaults to 3 per revision; the run deadline moves to 25 minutes.\n\nValidated end to end in Prime sandboxes (image and resources identical to\nCI): prepare -> install -> ui across two trials, all 15 metrics recorded with\ntight repeatability; ruff and the 47-test harness suite pass.\n\n* fix(ci): address UI benchmark review findings (ENG-6043)\n\nFour review fixes for the UI interaction suite:\n\n- expand_subagents now succeeds only when the on-screen \"▾\" count grows, so an\n  eaten expand keystroke on the selected row cannot be mistaken for success\n  just because an ancestor row is already expanded; retries stay meaningful\n  through the depth-6 drill.\n- agents_roster_cpu and the roster PTY bytes reset their baseline right before\n  waiting for the roster, so the window matches the roster wall time instead\n  of including the agents-view navigation.\n- The warm-scenario terminal spawn attributes failures to switch_large, so a\n  warm-startup error can no longer overwrite the successful resume_large\n  sample for that trial.\n- README, report methodology, and PR description now state the fixture counts\n  the code actually produces: 194 top-level sessions and 200 session files.\n\nAdds regression coverage for the expand check (eaten keystroke retried, and\ntimeout when nothing expands); FakeTerminal settles one scripted frame at a\ntime and records sent keystrokes.\n\n* fix(ci): cover cold-resume startup CPU and fix the roster description (ENG-6043)\n\nTwo review follow-ups:\n\n- The resume_large CPU baseline now precedes the Terminal spawn, so the CPU\n  window matches the published wall-time window (process spawn to usable\n  editor) instead of omitting the CPU spent starting the process.\n- The README's roster bullet says the roster window starts after the\n  agents-view splash is rendered, which is what the probe measures.\n\n* fix(ci): correct fixture triple counts in UI benchmark docs (ENG-6043)\n\nThe final fixture iteration ends on a plain assistant message without a\ntoolResult, so complete user/assistant/toolResult triples are one fewer than\nthe iteration counts. README and the report methodology now state 1,999 /\n15,999 / 119 / 399.\n\n* fix(ci): gate UI trials on install success and floor roster settling (ENG-6043)\n\nReview fixes for the UI interaction suite:\n\n- The controller applies the first-install gate to the ui phase, so a side\n  whose trial-0 installation failed skips UI trials with the same recorded\n  \"skipped; first installation did not succeed\" notice as measure and\n  runtime instead of launching UI probes against a missing prime-agent.\n- ui_measure mirrors measure()'s worker-side guard, so a UI trial invoked\n  without a successful first installation fails fast with the same error\n  instead of burning a 60-90 s scenario on terminal spawn failures.\n- wait_for_roster accepts a settled count only after the roster lists the\n  fixture's saved top-level sessions, so a delayed or broken catalog scan\n  fails the trial loudly instead of recording a fast agents_roster sample\n  while the splash still shows an empty roster.\n\nRegression coverage: the failed-first-install controller test now asserts\nUI trials are skipped for that side (and still run for the healthy side);\nroster tests pin the hydration floor (a splash stuck below it never\nsettles); a worker test rejects a UI trial without a successful install."},{"name":"controller.py","kind":"file","size":17608,"lastCommitHash":"7a049d50c61ed5a93e65060255e54d752f56dbf2","lastCommitWhen":"2026-09-14T08:24:39+02:00","lastCommitMessage":"feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043) (#2211)\n\n* feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043)\n\nExtend the PR benchmark harness with a UI/UX interaction suite driven over a\nPTY against the interactive TUI, reported as a new \"UI interactions\" section\nin the PR comment.\n\nDeterministic fixtures, regenerated per trial so no state leaks: 280 top-level\nsessions (3 large, one ~40 MB transcript; 150 medium; 40 ledger fan-out\nchildren) plus a 6-deep subagent chain linked through the same spawn-ledger\nrecords the daemon replays. No inference is called.\n\nMeasured interactions, each with wall time, process-tree CPU (utime+stime of\nthe whole benchmark-user tree), and PTY bytes in the raw results:\n\n- resume_large: cold --resume of a large session, spawn to rendered tail\n- switch_large: warm /resume switch into the ~40 MB transcript\n- agents_view: session -> agents view (left-arrow to splash)\n- agents_roster: full roster settle with many saved sessions and ledger edges\n- agents_open: agents view -> another large session (search + open)\n- parent_open: open the subagent chain parent with its recorded children\n- subagent_open: clear-expand-step drill into the live chain to depth 6\n- ui_rss: summed tree RSS after the scenario\n\nInteraction readiness is the rendered transcript tail plus a confirmed editor\necho, never a spinner or status line; keystrokes are echo-verified with\nretries because the TUI can drop input during large renders. ui_trials\ndefaults to 3 per revision; the run deadline moves to 25 minutes.\n\nValidated end to end in Prime sandboxes (image and resources identical to\nCI): prepare -> install -> ui across two trials, all 15 metrics recorded with\ntight repeatability; ruff and the 47-test harness suite pass.\n\n* fix(ci): address UI benchmark review findings (ENG-6043)\n\nFour review fixes for the UI interaction suite:\n\n- expand_subagents now succeeds only when the on-screen \"▾\" count grows, so an\n  eaten expand keystroke on the selected row cannot be mistaken for success\n  just because an ancestor row is already expanded; retries stay meaningful\n  through the depth-6 drill.\n- agents_roster_cpu and the roster PTY bytes reset their baseline right before\n  waiting for the roster, so the window matches the roster wall time instead\n  of including the agents-view navigation.\n- The warm-scenario terminal spawn attributes failures to switch_large, so a\n  warm-startup error can no longer overwrite the successful resume_large\n  sample for that trial.\n- README, report methodology, and PR description now state the fixture counts\n  the code actually produces: 194 top-level sessions and 200 session files.\n\nAdds regression coverage for the expand check (eaten keystroke retried, and\ntimeout when nothing expands); FakeTerminal settles one scripted frame at a\ntime and records sent keystrokes.\n\n* fix(ci): cover cold-resume startup CPU and fix the roster description (ENG-6043)\n\nTwo review follow-ups:\n\n- The resume_large CPU baseline now precedes the Terminal spawn, so the CPU\n  window matches the published wall-time window (process spawn to usable\n  editor) instead of omitting the CPU spent starting the process.\n- The README's roster bullet says the roster window starts after the\n  agents-view splash is rendered, which is what the probe measures.\n\n* fix(ci): correct fixture triple counts in UI benchmark docs (ENG-6043)\n\nThe final fixture iteration ends on a plain assistant message without a\ntoolResult, so complete user/assistant/toolResult triples are one fewer than\nthe iteration counts. README and the report methodology now state 1,999 /\n15,999 / 119 / 399.\n\n* fix(ci): gate UI trials on install success and floor roster settling (ENG-6043)\n\nReview fixes for the UI interaction suite:\n\n- The controller applies the first-install gate to the ui phase, so a side\n  whose trial-0 installation failed skips UI trials with the same recorded\n  \"skipped; first installation did not succeed\" notice as measure and\n  runtime instead of launching UI probes against a missing prime-agent.\n- ui_measure mirrors measure()'s worker-side guard, so a UI trial invoked\n  without a successful first installation fails fast with the same error\n  instead of burning a 60-90 s scenario on terminal spawn failures.\n- wait_for_roster accepts a settled count only after the roster lists the\n  fixture's saved top-level sessions, so a delayed or broken catalog scan\n  fails the trial loudly instead of recording a fast agents_roster sample\n  while the splash still shows an empty roster.\n\nRegression coverage: the failed-first-install controller test now asserts\nUI trials are skipped for that side (and still run for the healthy side);\nroster tests pin the hydration floor (a splash stuck below it never\nsettles); a worker test rejects a UI trial without a successful install."},{"name":"github.py","kind":"file","size":4581,"lastCommitHash":"1eee2938b4eeb7a4d72e17035adda669a89b63de","lastCommitWhen":"2026-09-10T16:10:33-07:00","lastCommitMessage":"fix(ci): benchmark stacked pull requests against main (#2200)"},{"name":"kernel.py","kind":"file","size":7047,"lastCommitHash":"f9c7e06b58b9760944abb33b81f758ce5df1a1b3","lastCommitWhen":"2026-09-09T16:20:36-07:00","lastCommitMessage":"benchmark prime agent performance on pull request updates (#2160)\n\n* ci: benchmark prime agent pull request updates\n\nRefs ENG-6043\n\n* docs: clarify benchmark installation prerequisites\n\nRefs ENG-6043\n\n* ci: reduce benchmark debounce to two seconds\n\nRefs ENG-6043; fixes #2160\n\n* ci: run benchmark harness tests in existing CI\n\nRefs ENG-6043; fixes #2160\n\n* ci: benchmark local runtime performance without inference\n\nRefs ENG-6043; fixes #2160\n\n* test: calibrate benchmark noise thresholds\n\nRefs ENG-6043; fixes #2160"},{"name":"pyproject.toml","kind":"file","size":433,"lastCommitHash":"f9c7e06b58b9760944abb33b81f758ce5df1a1b3","lastCommitWhen":"2026-09-09T16:20:36-07:00","lastCommitMessage":"benchmark prime agent performance on pull request updates (#2160)\n\n* ci: benchmark prime agent pull request updates\n\nRefs ENG-6043\n\n* docs: clarify benchmark installation prerequisites\n\nRefs ENG-6043\n\n* ci: reduce benchmark debounce to two seconds\n\nRefs ENG-6043; fixes #2160\n\n* ci: run benchmark harness tests in existing CI\n\nRefs ENG-6043; fixes #2160\n\n* ci: benchmark local runtime performance without inference\n\nRefs ENG-6043; fixes #2160\n\n* test: calibrate benchmark noise thresholds\n\nRefs ENG-6043; fixes #2160"},{"name":"README.md","kind":"file","size":20507,"lastCommitHash":"1a891aa1b765cc351db03547857f4ba9370eb3d5","lastCommitWhen":"2026-09-14T12:21:09-04:00","lastCommitMessage":"test(ci): cover resident large-chat reopening in UI benchmarks (#2301)\n\n* test(ci): benchmark resident large-chat reattachment (fixes #2211)\n\n* test(ci): match current agents view search hint (fixes #2211)\n\n* fix(ci): recognize agents view with a saved query (fixes #2301)\n\n* fix(ci): wait for a fresh agents-view render before reopen (fixes #2301)\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"report.py","kind":"file","size":18532,"lastCommitHash":"1a891aa1b765cc351db03547857f4ba9370eb3d5","lastCommitWhen":"2026-09-14T12:21:09-04:00","lastCommitMessage":"test(ci): cover resident large-chat reopening in UI benchmarks (#2301)\n\n* test(ci): benchmark resident large-chat reattachment (fixes #2211)\n\n* test(ci): match current agents view search hint (fixes #2211)\n\n* fix(ci): recognize agents view with a saved query (fixes #2301)\n\n* fix(ci): wait for a fresh agents-view render before reopen (fixes #2301)\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"schema.py","kind":"file","size":10013,"lastCommitHash":"1a891aa1b765cc351db03547857f4ba9370eb3d5","lastCommitWhen":"2026-09-14T12:21:09-04:00","lastCommitMessage":"test(ci): cover resident large-chat reopening in UI benchmarks (#2301)\n\n* test(ci): benchmark resident large-chat reattachment (fixes #2211)\n\n* test(ci): match current agents view search hint (fixes #2211)\n\n* fix(ci): recognize agents view with a saved query (fixes #2301)\n\n* fix(ci): wait for a fresh agents-view render before reopen (fixes #2301)\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"terminal.py","kind":"file","size":9216,"lastCommitHash":"1a891aa1b765cc351db03547857f4ba9370eb3d5","lastCommitWhen":"2026-09-14T12:21:09-04:00","lastCommitMessage":"test(ci): cover resident large-chat reopening in UI benchmarks (#2301)\n\n* test(ci): benchmark resident large-chat reattachment (fixes #2211)\n\n* test(ci): match current agents view search hint (fixes #2211)\n\n* fix(ci): recognize agents view with a saved query (fixes #2301)\n\n* fix(ci): wait for a fresh agents-view render before reopen (fixes #2301)\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"ui.py","kind":"file","size":37202,"lastCommitHash":"4bf122bb6fd3455b09511791a16a00022098f8a7","lastCommitWhen":"2026-09-14T18:02:33-04:00","lastCommitMessage":"add a persistent update channel with a /nightly command (#2323)\n\n* add a persistent update channel with a /beta command\n\nSelf-updates read latest.json or beta.json based on the running version's\nprerelease tag, with no way to choose. This adds an updateChannel setting,\n--beta/--stable flags on prime-agent update that persist it, a /beta slash\ncommand that switches to beta and updates immediately (/beta off returns to\nstable, /beta status reports the choice), and routes startup version notices\nand compiled-install updates through the same preference.\n\n* apply formatter output from pre-commit check\n\n* warn and confirm before switching updates to the beta channel\n\n/beta no longer flips the setting itself. The update command prints that beta\nbuilds are unreleased and may be broken, asks for confirmation unless --force\nis given, persists the channel only after a yes, and then continues into the\nexisting busy-session confirmation.\n\n* let a channel switch install the current beta and read the channel from global settings\n\nA stable 1.2.3 never saw 1.2.3-beta.N as an update because prerelease ordering\nranks it lower. isReleaseUpdateCandidate keeps same-channel updates strictly\nnewer but accepts a different version with a base version that is not older\nwhen the user explicitly switched channels. The CLI, compiled updates, and\nstartup notices use it. getUpdateChannel now reads global settings only, so a\nproject settings file cannot override the user's choice, and ignores values\nother than stable or beta.\n\n* gate the beta switch before any update work and never persist it on cancel\n\nThe public update command now accepts --beta and --stable. The beta warning\nand confirmation run before extensions are touched, the channel is persisted\nonly after the busy-session confirmation succeeds or when nothing needs\ninstalling, and a beta manifest that cannot be resolved aborts instead of\nfalling back to the stable registry package. Cancelled or refused updates exit\nwith the not-attempted code when launched from the interactive client, so\n/beta declined is a no-op rather than a relaunch.\n\n* treat an unresolved beta manifest as a no-op for compiled installs and reject channel flags on extension-only updates\n\ngetNativeUpdatePlan now throws NativeReleaseUnavailableError when the manifest\ncannot be resolved, and the self-update plan maps that to the same\nnon-runnable beta-unavailable result the npm path uses, so /beta does not\nrelaunch the client when nothing was installed. --beta and --stable are\nrejected for extension-only targets rather than being accepted and ignored,\nmirroring --rollback.\n\n* keep exit code 1 when the session-loss prompt is declined\n\nThe interactive parent relies on a non-sentinel exit there, and an existing\ntest pins it. The not-attempted sentinel stays for the beta-specific\ncancellations: the beta warning declined, the non-TTY refusal, and an\nunresolvable beta manifest.\n\n* map every failed compiled-release lookup to the unavailable plan and save a confirmed channel even without an updater\n\nNetwork, timeout, and malformed-manifest errors from the compiled release\nlookup now surface as NativeReleaseUnavailableError with the cause attached,\nso a /beta run on a compiled install is a no-op instead of a failed update\nthat relaunches the client. When no self-update command exists for the\ninstall, the already-confirmed channel switch is still persisted before the\nmanual-update guidance is printed.\n\n* benchmarks: clamp CPU deltas at zero when a child exits mid-measurement\n\ncpu_total() sums CPU time over the live process tree, so a process exiting\nbetween the start and end samples lowers the total and the raw delta can go\nslightly negative. The report schema rejects negative observations, which\naborted the agents_view trial on the main baseline and left 19 measurements\nincomplete. cpu_delta() clamps at zero; all ten sites use it.\n\n* list the channel flags in the public update help\n\nThe public command registry renders its own usage for prime-agent update\n--help; it still advertised only --force and --rollback.\n\n* rename the channel surface to nightly\n\n/nightly, --nightly, the saved updateChannel value, and every message now say\nnightly. The release bucket still publishes these builds as beta (beta.json and\n-beta.N version tags), so that mapping stays internal to version-check.\n\n* never install a lower base version, even with --force\n\n--force is also how a channel switch is scripted without a TTY, so it must not\ndouble as permission to downgrade. Both the npm and compiled update plans now\nrefuse a release whose major.minor.patch is below the installed version and\nleave the channel unchanged; compiled installs are pointed at --rollback.\n\n* report being ahead of a channel as nothing to update\n\nA channel whose current release is below the installed base version is still\nnever installed, but without --force that is now a green no-op with the\nnot-attempted exit code, so a plain update or /nightly off while ahead does\nnot fail or relaunch the client. With --force the refusal stays explicit. The\ncompiled path returns the refusal in its plan instead of throwing, so the\ninteractive client treats it the same way.\n\n* guard a missing nightly manifest by the effective channel\n\nA -beta install with no saved preference is on the nightly channel by\ninference, so an unresolvable manifest must abort for it too instead of\nfalling through to the stable registry package.\n\n* reload settings after the updater child returns without relaunching\n\n/nightly persists the channel inside the update child. When that child installs\nnothing, the interactive parent keeps running with its in-memory settings, so\n/nightly status could report the old channel. Reload from disk before reporting.\n\n* say what was not updated instead of claiming nothing was installed\n\nWith an all target, extensions may already have been updated before the\nnightly manifest lookup fails or a downgrade is refused. Both messages now\nstate that Prime Agent itself was not updated.\n\n* keep a successful extension update when the self update is unavailable\n\nFor an all target the extensions are updated before the self update is\nplanned. A missing nightly manifest or refused downgrade now reports that\nPrime Agent was not updated without failing the run that already updated\nextensions.\n\n---------\n\nCo-authored-by: Seth Karten <32787133+sethkarten@users.noreply.github.com>"},{"name":"uv.lock","kind":"file","size":78480,"lastCommitHash":"f9c7e06b58b9760944abb33b81f758ce5df1a1b3","lastCommitWhen":"2026-09-09T16:20:36-07:00","lastCommitMessage":"benchmark prime agent performance on pull request updates (#2160)\n\n* ci: benchmark prime agent pull request updates\n\nRefs ENG-6043\n\n* docs: clarify benchmark installation prerequisites\n\nRefs ENG-6043\n\n* ci: reduce benchmark debounce to two seconds\n\nRefs ENG-6043; fixes #2160\n\n* ci: run benchmark harness tests in existing CI\n\nRefs ENG-6043; fixes #2160\n\n* ci: benchmark local runtime performance without inference\n\nRefs ENG-6043; fixes #2160\n\n* test: calibrate benchmark noise thresholds\n\nRefs ENG-6043; fixes #2160"},{"name":"worker.py","kind":"file","size":21938,"lastCommitHash":"7a049d50c61ed5a93e65060255e54d752f56dbf2","lastCommitWhen":"2026-09-14T08:24:39+02:00","lastCommitMessage":"feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043) (#2211)\n\n* feat(ci): add UI interaction benchmarks to Prime Agent performance CI (ENG-6043)\n\nExtend the PR benchmark harness with a UI/UX interaction suite driven over a\nPTY against the interactive TUI, reported as a new \"UI interactions\" section\nin the PR comment.\n\nDeterministic fixtures, regenerated per trial so no state leaks: 280 top-level\nsessions (3 large, one ~40 MB transcript; 150 medium; 40 ledger fan-out\nchildren) plus a 6-deep subagent chain linked through the same spawn-ledger\nrecords the daemon replays. No inference is called.\n\nMeasured interactions, each with wall time, process-tree CPU (utime+stime of\nthe whole benchmark-user tree), and PTY bytes in the raw results:\n\n- resume_large: cold --resume of a large session, spawn to rendered tail\n- switch_large: warm /resume switch into the ~40 MB transcript\n- agents_view: session -> agents view (left-arrow to splash)\n- agents_roster: full roster settle with many saved sessions and ledger edges\n- agents_open: agents view -> another large session (search + open)\n- parent_open: open the subagent chain parent with its recorded children\n- subagent_open: clear-expand-step drill into the live chain to depth 6\n- ui_rss: summed tree RSS after the scenario\n\nInteraction readiness is the rendered transcript tail plus a confirmed editor\necho, never a spinner or status line; keystrokes are echo-verified with\nretries because the TUI can drop input during large renders. ui_trials\ndefaults to 3 per revision; the run deadline moves to 25 minutes.\n\nValidated end to end in Prime sandboxes (image and resources identical to\nCI): prepare -> install -> ui across two trials, all 15 metrics recorded with\ntight repeatability; ruff and the 47-test harness suite pass.\n\n* fix(ci): address UI benchmark review findings (ENG-6043)\n\nFour review fixes for the UI interaction suite:\n\n- expand_subagents now succeeds only when the on-screen \"▾\" count grows, so an\n  eaten expand keystroke on the selected row cannot be mistaken for success\n  just because an ancestor row is already expanded; retries stay meaningful\n  through the depth-6 drill.\n- agents_roster_cpu and the roster PTY bytes reset their baseline right before\n  waiting for the roster, so the window matches the roster wall time instead\n  of including the agents-view navigation.\n- The warm-scenario terminal spawn attributes failures to switch_large, so a\n  warm-startup error can no longer overwrite the successful resume_large\n  sample for that trial.\n- README, report methodology, and PR description now state the fixture counts\n  the code actually produces: 194 top-level sessions and 200 session files.\n\nAdds regression coverage for the expand check (eaten keystroke retried, and\ntimeout when nothing expands); FakeTerminal settles one scripted frame at a\ntime and records sent keystrokes.\n\n* fix(ci): cover cold-resume startup CPU and fix the roster description (ENG-6043)\n\nTwo review follow-ups:\n\n- The resume_large CPU baseline now precedes the Terminal spawn, so the CPU\n  window matches the published wall-time window (process spawn to usable\n  editor) instead of omitting the CPU spent starting the process.\n- The README's roster bullet says the roster window starts after the\n  agents-view splash is rendered, which is what the probe measures.\n\n* fix(ci): correct fixture triple counts in UI benchmark docs (ENG-6043)\n\nThe final fixture iteration ends on a plain assistant message without a\ntoolResult, so complete user/assistant/toolResult triples are one fewer than\nthe iteration counts. README and the report methodology now state 1,999 /\n15,999 / 119 / 399.\n\n* fix(ci): gate UI trials on install success and floor roster settling (ENG-6043)\n\nReview fixes for the UI interaction suite:\n\n- The controller applies the first-install gate to the ui phase, so a side\n  whose trial-0 installation failed skips UI trials with the same recorded\n  \"skipped; first installation did not succeed\" notice as measure and\n  runtime instead of launching UI probes against a missing prime-agent.\n- ui_measure mirrors measure()'s worker-side guard, so a UI trial invoked\n  without a successful first installation fails fast with the same error\n  instead of burning a 60-90 s scenario on terminal spawn failures.\n- wait_for_roster accepts a settled count only after the roster lists the\n  fixture's saved top-level sessions, so a delayed or broken catalog scan\n  fails the trial loudly instead of recording a fast agents_roster sample\n  while the splash still shows an empty roster.\n\nRegression coverage: the failed-first-install controller test now asserts\nUI trials are skipped for that side (and still run for the healthy side);\nroster tests pin the hydration floor (a splash stuck below it never\nsettles); a worker test rejects a UI trial without a successful install."}]