@piagent/platform 1.41.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +1006 -2038
  2. package/CONTRIBUTING.md +2 -0
  3. package/README.md +128 -325
  4. package/README.vi.md +149 -143
  5. package/docs/command-reference-vietnamese.md +2 -2
  6. package/docs/distribution-standard.md +6 -6
  7. package/docs/languages.json +2 -2
  8. package/docs/operator-manual-vietnamese.md +7 -7
  9. package/docs/publishing-for-teams.md +1 -0
  10. package/docs/release-install-policy.md +3 -3
  11. package/docs/team-onboarding.md +2 -2
  12. package/docs-site/architecture.html +71 -63
  13. package/docs-site/assets/docs.css +2736 -1030
  14. package/docs-site/assets/docs.js +451 -43
  15. package/docs-site/assets/og.png +0 -0
  16. package/docs-site/assets/piagent-logo.svg +9 -31
  17. package/docs-site/assets/search-en.json +1 -0
  18. package/docs-site/assets/search-vi.json +1 -0
  19. package/docs-site/benchmark.html +71 -63
  20. package/docs-site/commands.html +72 -64
  21. package/docs-site/content/en/index.html +220 -131
  22. package/docs-site/content/en/quickstart.html +74 -90
  23. package/docs-site/content/en/update.html +80 -0
  24. package/docs-site/content/en/whats-new.html +1 -684
  25. package/docs-site/content/index.html +220 -131
  26. package/docs-site/content/quickstart.html +73 -108
  27. package/docs-site/content/update.html +80 -0
  28. package/docs-site/content/whats-new.html +1 -684
  29. package/docs-site/context-engine.html +73 -65
  30. package/docs-site/ecosystem.html +73 -65
  31. package/docs-site/en/architecture.html +67 -59
  32. package/docs-site/en/benchmark.html +67 -59
  33. package/docs-site/en/commands.html +68 -60
  34. package/docs-site/en/context-engine.html +68 -60
  35. package/docs-site/en/ecosystem.html +68 -60
  36. package/docs-site/en/index.html +281 -220
  37. package/docs-site/en/mcp-approval.html +67 -59
  38. package/docs-site/en/mcp-auth.html +67 -59
  39. package/docs-site/en/mcp-servers.html +68 -60
  40. package/docs-site/en/mcp.html +64 -56
  41. package/docs-site/en/permissions.html +68 -60
  42. package/docs-site/en/profiles.html +68 -60
  43. package/docs-site/en/quickstart.html +142 -150
  44. package/docs-site/en/runtime.html +67 -59
  45. package/docs-site/en/scope.html +68 -60
  46. package/docs-site/en/security.html +64 -56
  47. package/docs-site/en/team.html +67 -59
  48. package/docs-site/en/update.html +228 -0
  49. package/docs-site/en/whats-new.html +1601 -725
  50. package/docs-site/en/windows.html +71 -63
  51. package/docs-site/en/workflows.html +68 -60
  52. package/docs-site/favicon.svg +9 -14
  53. package/docs-site/index.html +281 -220
  54. package/docs-site/mcp-approval.html +70 -62
  55. package/docs-site/mcp-auth.html +70 -62
  56. package/docs-site/mcp-servers.html +71 -63
  57. package/docs-site/mcp.html +70 -62
  58. package/docs-site/permissions.html +72 -64
  59. package/docs-site/profiles.html +72 -64
  60. package/docs-site/quickstart.html +145 -172
  61. package/docs-site/releases.json +4449 -0
  62. package/docs-site/runtime.html +73 -65
  63. package/docs-site/scope.html +73 -65
  64. package/docs-site/security.html +73 -65
  65. package/docs-site/team.html +71 -63
  66. package/docs-site/update.html +228 -0
  67. package/docs-site/whats-new.html +1605 -729
  68. package/docs-site/windows.html +75 -67
  69. package/docs-site/workflows.html +73 -65
  70. package/evals/private-holdout-v1/public-exposure.v2.json +1 -1
  71. package/package.json +1 -1
  72. package/packages/piagent-core/package.json +1 -1
  73. package/packages/piagent-webui/dist/client/assets/App-DBx4BU3F.js +5 -0
  74. package/packages/piagent-webui/dist/client/assets/LineReview-DzonwD-g.js +3 -0
  75. package/packages/piagent-webui/dist/client/assets/{MarkdownMessage-DeLo-xiz.js → MarkdownMessage-DchODuO7.js} +2 -2
  76. package/packages/piagent-webui/dist/client/assets/SessionInspectorDrawer-BHHNlct3.js +1 -0
  77. package/packages/piagent-webui/dist/client/assets/SettingsPage-DX28MsZA.js +1 -0
  78. package/packages/piagent-webui/dist/client/assets/TerminalPanel-C--BiN0p.js +2 -0
  79. package/packages/piagent-webui/dist/client/assets/{TerminalView-r9rG24IO.js → TerminalView-BML7uS6R.js} +3 -3
  80. package/packages/piagent-webui/dist/client/assets/WorkspaceCodeEditor-B7ieqDnt.js +2 -0
  81. package/packages/piagent-webui/dist/client/assets/WorkspaceExplorer-BOafuPU-.js +5 -0
  82. package/packages/piagent-webui/dist/client/assets/WorkspaceQuickOpen-CGoGfUPk.js +1 -0
  83. package/packages/piagent-webui/dist/client/assets/api-BUjrtT1B.js +1 -0
  84. package/packages/piagent-webui/dist/client/assets/index-C7Azrwpq.js +132 -0
  85. package/packages/piagent-webui/dist/client/assets/index-Dqb2hNan.css +1 -0
  86. package/packages/piagent-webui/dist/client/assets/tab-close-Crj8vsUq.js +1 -0
  87. package/packages/piagent-webui/dist/client/assets/ui-preferences-B3UfDp-5.js +1 -0
  88. package/packages/piagent-webui/dist/client/assets/vendor-Ch5hIe0W.js +136 -0
  89. package/packages/piagent-webui/dist/client/index.html +5 -8
  90. package/scripts/build-docs-site.mjs +205 -348
  91. package/scripts/check-public-wording.mjs +2 -1
  92. package/scripts/docs-site-icons.mjs +84 -0
  93. package/scripts/docs-site-nav.mjs +302 -0
  94. package/scripts/docs-site-releases.mjs +227 -0
  95. package/packages/piagent-webui/dist/client/assets/Alert-DGWhP2MM.js +0 -1
  96. package/packages/piagent-webui/dist/client/assets/Button-QItfZUNj.js +0 -1
  97. package/packages/piagent-webui/dist/client/assets/DialogTitle-CyaFPaiW.js +0 -3
  98. package/packages/piagent-webui/dist/client/assets/TerminalPanel-BG-DP_qm.js +0 -2
  99. package/packages/piagent-webui/dist/client/assets/Typography-B9om7Evq.js +0 -1
  100. package/packages/piagent-webui/dist/client/assets/WorkspaceCodeEditor-BnqaR3pK.js +0 -2
  101. package/packages/piagent-webui/dist/client/assets/WorkspaceExplorer-BIxwiGtl.js +0 -5
  102. package/packages/piagent-webui/dist/client/assets/WorkspaceQuickOpen-CK3dILhQ.js +0 -1
  103. package/packages/piagent-webui/dist/client/assets/index-DBUTrEXi.css +0 -1
  104. package/packages/piagent-webui/dist/client/assets/index-rlyRccut.js +0 -102
  105. package/packages/piagent-webui/dist/client/assets/tab-close-BoJRyBO_.js +0 -1
  106. package/packages/piagent-webui/dist/client/assets/ui-preferences-BO3AV7QE.js +0 -10
  107. package/packages/piagent-webui/dist/client/assets/useId-DEefKUAT.js +0 -124
package/CHANGELOG.md CHANGED
@@ -1,2900 +1,1868 @@
1
1
  # Changelog
2
2
 
3
- This file records release-facing changes for Pi Agent Platform. Copy the relevant version block into GitHub Releases when publishing a tag.
3
+ Every release of Pi Agent Platform (`@piagent/platform`), newest first. Versions follow semantic versioning; prereleases and builds that were tagged but never published are marked.
4
+
5
+ This file is generated from `docs-site/releases.json` by `node scripts/build-docs-site.mjs`, which also renders the [Changelog page](https://piagent.io.vn/en/whats-new). Edit the JSON, not this file. When publishing a tag, copy the version's block into the GitHub Release.
6
+
7
+ ## v1.42.0 - 2026-10-25
8
+
9
+ **A redesigned dashboard and older messages that load without jumping.** The dashboard gets one design scale and every theme everywhere; older messages load as you scroll up and the message you are reading stays put.
10
+
11
+ ### Added
12
+
13
+ - Older messages load on their own as you near the top, and the message being read no longer moves when a page is added above it.
14
+
15
+ ### Improved
16
+
17
+ - All 13 colour themes now reach the diff, approval, question and document views; header, sidebar, composer and new chat page are redesigned.
18
+ - A running turn shows one moving indicator at a time: the step's spinner, the streaming caret, or a thinking spinner.
19
+ - New website and README with an Update & uninstall guide; release notes now come from one file that also writes `CHANGELOG.md`.
20
+
21
+ ### Fixed
22
+
23
+ - History showed raw markdown for a moment and then reflowed; it now appears formatted from the first frame.
24
+ - Loading many older pages silently dropped the newest messages; the window now holds 1,000 items and offers a way back to the newest.
4
25
 
5
26
  ## v1.41.0 - 2026-10-24
6
27
 
7
- Front-end change reports: before/after screenshots with numbered red frames, business and logic changes and check results, shown in the dashboard.
28
+ **Front-end change reports with before/after screenshots.** A new skill turns a front-end task into a report with framed before/after screenshots, business and logic changes and check results, shown in the dashboard.
8
29
 
9
30
  ### Added
10
31
 
11
- - **The `fe-change-report` skill.** For a front-end task that asks for a report, the agent captures both versions of the affected pages headless on the same data, frames each change with a numbered red box on both screenshots, runs the project's checks and full E2E headless (baseline failures named as such), and writes what changed for the business, in the logic, and on screen. Its scripts use the project's own Playwright and add no dependency: `capture.mjs` (desktop and phone sizes, masks for clocks and other content that changes on its own, login state, an 8 MB cap per screenshot), `diff-regions.mjs` (proposed frames from a pixel diff that skips masked areas, and a red changed-pixels image) and `build-report.mjs` (one self-contained `report.html` with no scripts, to send to anyone).
12
- - **Change reports in Documents.** The dashboard draws `reports/fe-change/<slug>/report.json` as the report: summary, business and logic tables, before/after screenshots with the same numbered frames, zoom per frame, other sizes, changed pixels, checks and changed files, with a full-screen view. It is drawn from data, never from the HTML file, so the WebUI still renders no model markup. Screenshots come through a new read, `GET /api/v1/documents/<ref>/assets/<name>` (`document-asset-v1`), which answers only `before-`/`after-`/`diff-*.png` in the `shots/` folder beside a listed `report.json`, refuses links and non-PNG files, and applies protected paths; it works for company conversations through the relay. The listing leaves that `shots/` folder out.
32
+ - The `fe-change-report` skill captures old and new pages headless on the same data and frames each change with a numbered red box on both.
33
+ - The agent runs the project's checks and full E2E headless, naming baseline failures, and writes what changed in business, logic and on screen.
34
+ - Documents draws `reports/fe-change/<slug>/report.json` as the report, with zoom per frame, other screen sizes and a full-screen view.
35
+ - The scripts use the project's own Playwright and add no dependency; they write one self-contained `report.html` with no scripts, to send to anyone.
36
+
37
+ ### Security
38
+
39
+ - The report is drawn from data, never from the HTML file, and only its PNG screenshots are served, so the dashboard still renders no model markup.
13
40
 
14
41
  ## v1.40.0 - 2026-10-24
15
42
 
16
- Local projects without a remote are reported to Studio too, every run reports, and the member sees every kind of project warning.
43
+ **Local projects are reported to Studio too.** Company conversations in folders without a remote report a local project to Studio, every run reports, and members see every kind of project warning.
17
44
 
18
45
  ### Added
19
46
 
20
- - **Local projects are reported too.** A company conversation in a folder without a readable remote now tells Studio about it as a local project (with `managed.workspace.v2`, Agent Studio 0.40.0): a git checkout by its root commit (`local/git/…`, the same on every computer with that history, including clones and checkouts with several remotes but no `origin`), a checkout without commits or any other folder by a hash of the computer's name and path (`local/dir/…`), each with its folder's name; a path never leaves the computer. A folder holding several checkouts reports each (up to six), and a folder with none reports itself.
47
+ - A folder without a readable remote is reported as a local project, by its Git root commit or by a hash; its path never leaves the computer.
48
+ - A Git project's local key is the same on every computer with that history, including clones and checkouts without an `origin` remote.
21
49
 
22
- ### Changed
50
+ ### Improved
23
51
 
24
- - **Every run reports its projects**, not only the first one of a conversation, so Studio counts each use and knows which computers never report. A Studio without the route is asked once, not on every run.
25
- - **The member sees a line for every warning Studio returns**: another team's project, one outside the team's list, a project not registered to the team, or a folder Piagent could not read. A local project is named by its folder.
52
+ - Every run reports its projects, not only a conversation's first, so Studio counts each use and knows which computers never report.
53
+ - Members see a line for every warning: another team's project, one outside the team's list, an unregistered project or an unreadable folder.
54
+ - A folder holding several checkouts reports each one, up to six, and a local project is named by its folder.
26
55
 
27
56
  ### Security
28
57
 
29
- - **Three undici advisories in the Pi host are accepted until 2026-11-07** (GHSA-xjj6-f33q-929c, GHSA-4qv8-2p9j-2685, GHSA-f72v-6w45-q472: denial of service and an integrity-check bypass Pi does not use; no data exposure). Every published Pi host (1.3.0, 1.4.0) pins undici 8.10.2 and is installed globally, so Piagent cannot update it; 8.12.2 fixes them. The runtime advisory check now carries a package flagged only through accepted advisories of its dependencies (the Pi host here) and still blocks it otherwise.
58
+ - Three dependency advisories in the Pi host are accepted until 2026-11-07: denial of service and a check bypass Pi does not use, no data exposure.
59
+
60
+ Requires: Agent Studio 0.40.0.
30
61
 
31
62
  ## v1.39.0 - 2026-10-23
32
63
 
33
- Studio learns when a team key works in a repository outside its team, and the dashboard keeps its language and theme across restarts.
64
+ **Warnings when a team key is used outside its team.** Studio learns which repositories a company conversation works in and warns when a team key is used outside its team; the dashboard keeps its language and theme.
34
65
 
35
66
  ### Added
36
67
 
37
- - **Studio is told when a team key works in a repository outside its team.** At the first model request of a company conversation, Piagent sends Studio the conversation's repositories (`POST /studio/v1/managed/workspace` with the run's token, the same `host/path` keys team memory already sends; a folder without one sends why), only to a Studio that serves it (`managed.workspace.v1`, Agent Studio 0.39.0). Studio's administrators see the warnings in Logs → "Sai project". When Studio says a repository belongs to another team or is outside the team's repository list, the member reads one line above the composer and in `piagent studio`; nothing is blocked, and memory works as before.
68
+ - Company conversations tell Studio their repositories, using the same `host/path` keys team memory already sends.
69
+ - Administrators see the warnings in Logs → "Sai project"; the member reads one line above the composer and in `piagent studio`.
38
70
 
39
- ### Fixes
71
+ ### Improved
40
72
 
41
- - **The dashboard keeps its language and colour theme across restarts.** The browser stored them per address, and the dashboard's port changes each time it starts, so every restart went back to the defaults. The Gateway now keeps them (`piagent-gateway/ui-preferences.json`, owner-only) behind the browser session and its CSRF token, and applies them once the page is signed in.
73
+ - Nothing is blocked, and team memory works as before.
74
+
75
+ ### Fixed
76
+
77
+ - The dashboard went back to the default language and colour theme on every restart; it now keeps both.
78
+
79
+ Requires: Agent Studio 0.39.0.
42
80
 
43
81
  ## v1.38.2 - 2026-10-23
44
82
 
45
- A folder tree as in VS Code, colour themes, and an editor and terminal that stay in view.
83
+ **Folder tree, colour themes and an editor that stays in view.** The files panel becomes a folder tree, 13 colour themes arrive, and the editor and terminal stay pinned while the conversation scrolls.
46
84
 
47
85
  ### Added
48
86
 
49
- - **Colour themes.** Settings → Appearance → Color theme, or `Color theme: …` in the command palette (⌘K): Piagent Dark and Light, Dracula, One Dark, Monokai, Nord, Tokyo Night, Catppuccin Mocha, Gruvbox Dark, Solarized Dark and Light, GitHub Dark and Light. A theme colours the interface, the editor's syntax (no longer CodeMirror's light default on a dark page) and the terminal's ANSI palette; Light/Dark switches to that mode's Piagent theme. Kept in this browser like the language.
87
+ - Colour themes in Settings → Appearance or the command palette (⌘K) colour the interface, the editor's syntax and the terminal.
50
88
 
51
- ### Changed
89
+ ### Improved
52
90
 
53
- - **The editor and terminal stay in view.** On wide screens they are pinned under the header while the conversation beside them scrolls, so a long conversation no longer carries them away; the Files/Terminal switches are pinned too, on every width. A splitter (drag, or ←/→ when focused) sets the editor's width, kept in this browser. On phones the folder tree is narrower and the editor's actions stay on one line.
54
- - **The files panel is a folder tree, as in VS Code.** Folders open in place under their parent (▸/▾) instead of replacing the list, each read when first opened and refreshed while open; the open file is highlighted and a file opened from search, a link or Cmd/Ctrl+P shows in its folder. **New file** starts in the last folder chosen.
91
+ - On wide screens the editor and terminal stay pinned under the header while the conversation scrolls; a splitter sets the editor's width.
92
+ - The files panel is a folder tree: folders open in place, the open file is highlighted, and New file starts in the last folder chosen.
93
+ - The Files/Terminal switches stay pinned on every width; on phones the folder tree is narrower and the editor's actions fit on one line.
55
94
 
56
95
  ## v1.38.1 - 2026-10-23
57
96
 
58
- v1.38.0 was tagged but never published: its release checks failed on two tests. This is the same release.
97
+ **Published release of v1.38.0.** v1.38.0 failed its release checks on two tests and was never published; v1.38.1 is the same release with those tests fixed.
59
98
 
60
- ### Tests
99
+ ### Improved
61
100
 
62
- - `tests/managed-terminal-boundary.test.mjs`: the Linux fixture says it is a Linux boundary, as the real one does (the macOS Seatbelt path was taken on Linux and failed).
63
- - `tests/managed-network-approval-web.test.mjs`: the approval card gets 30 s to appear on slow runners.
101
+ - Two release tests now pass on Linux and on slow runners, so the editor, terminals, review, checkpoints and Bypass of v1.38.0 ship here.
64
102
 
65
103
  ## v1.38.0 - 2026-10-23 (not published)
66
104
 
67
- Piagent becomes an editor: files, terminals, inline review and checkpoints in the dashboard, and Bypass that asks nothing (company conversations too, where the Harness allows it).
105
+ **Piagent becomes an editor, and Bypass asks nothing.** Files, terminals, inline review and checkpoints in the dashboard, and a Bypass mode that asks nothing, in company conversations where the Harness allows it.
68
106
 
69
- ### Added
107
+ ### Breaking changes
70
108
 
71
- - **Bypass, as in Codex.** A new `bypass` permission mode (`/permission bypass`, `piagent-auto --bypass`, `PIAGENT_PERMISSION_PROFILE=bypass`, or **Bypass** in the dashboard's access menu) turns every Piagent gate off in a personal session: nothing is asked or blocked, deletes, pushes, migrations, external sends and protected or read-only paths included. Tool output is still redacted and each turn still gets its `/undo` checkpoint. A policy can forbid it by leaving `bypass` out of `permissionProfiles.allowedModes`. **Full access** (`trusted-full-access`) is unchanged.
72
- - **Bypass in company conversations, where the Harness allows it.** A company conversation now has three levels: Ask first, **Full access** (what the dashboard called Bypass before: asks only what must be confirmed) and **Bypass**, which asks nothing (internet, Docker, the member's machine, pushes, deploys, migrations) while plain commands stay in the sandbox. Bypass needs the Harness's `bypass_mode` (Agent Studio, on by default; an administrator can turn it off) carried by an Agent Watch that knows the field; without an explicit yes it is not offered, and a conversation left in Bypass after it is turned off applies as Full access. `/bypass on|full|off` in the dashboard and in `piagent studio`.
73
- - **Editor-like workspace.** Square 2px edges across the dashboard; file and terminal tabs close with their own ×; the files and terminal panels hide with a × of their own; the editor sits above the terminal and both share the window height.
74
-
75
- ### Fixes
76
-
77
- - **A checkpoint that cannot be taken no longer stops the agent's edit.** Personal snapshots failed on a submodule, a file over 16 MB, a tree over 64 MB or a file changing mid-snapshot, and every write was then refused. Snapshots now hash the whole tree in one Git call (about 0.5 s instead of 35 s on a 4,000-file repository), include tracked files of any size, skip untracked files over 100 MB and leave submodules out. A turn whose snapshot fails has no checkpoint and ends the history before it; only another live owner of the session's history makes an edit wait. Company checkpoints get the same snapshot.
78
- - **Restoring a turn no longer overwrites a file the member saved from the editor during it.** Such files are reported as conflicts by `/undo` and Timeline restore.
79
- - **Checkpoint snapshots stay out of the project's refs.** They live in a private repository inside the Git directory that borrows the project's objects, so `git push --mirror` cannot publish untracked files; conversations untouched for 30 days lose their checkpoints.
80
- - **The company explorer, editor and review panels no longer wait behind the agent's running command.** Reads run beside it (three at a time) and the editor's permission poll no longer stacks requests.
81
- - **A flood of terminal output no longer drops the dashboard connection.** Output is paced at about 4 MB/s, the writer is paused while the browser catches up, output it cannot keep up with is marked as skipped, and a terminal tab never stops rendering for good. Company terminal workers pause instead of exiting when their pipe backs up. A flood of short lines no longer stalls the Gateway: tiny PTY reads are joined before pacing and the replay buffer trims its window once it doubles instead of on every line.
82
- - Restored files the turn had deleted get a new file's usual mode instead of owner-only.
83
- - **Company terminals work on macOS.** The company Gateway creates the PTY and starts only the shell under the agent's offline Seatbelt profile, which gains terminal ioctls and `/dev/tty`; opening any other terminal stays denied, and nothing runs on the host. Company terminals also write the project's Git directories and package caches like the agent's offline commands, so `go build` and `git` in a worktree work.
84
- - **Terminals:** background jobs stop with their terminal (the shell's tree is watched while it runs); actions refused before anything ran are reported as refused, not "may have run"; a stale revision is resent instead of dropping queued keystrokes; `@terminal` naming no open terminal attaches nothing instead of blocking the message; the personal shell no longer inherits the Gateway's `PI_*`/`PIAGENT_*` variables.
85
- - **Editor:** **Rename** and **Delete** for the open file, applied only to the version shown; new files get the usual mode and their missing folders; creating a file never replaces one that appeared meanwhile; refusals that changed nothing (oversized file, linked folder) are reported as such. Kept hunks survive a page reload in the same browser.
86
- - **Checkpoints:** a restore that stopped midway finishes what is left instead of refusing its own work; a refusal before any file changed is reported as refused; a file ignored since the turn is refused rather than overwritten; folders the turn created and its undo emptied are removed; any shell command not provably read-only takes the turn's checkpoint; a lock or capture left by a process from before a reboot, or whose number was reused, no longer blocks.
87
-
88
- - Company inline review preserves exact agent observations across trusted internal snapshot reads; ordinary shell commands still invalidate attribution.
109
+ - Company conversations have Ask first, Full access (formerly called Bypass) and Bypass, offered only when the Harness allows it.
89
110
 
90
111
  ### Added
91
112
 
92
- - Timeline checkpoint restoration previews affected files, requires confirmation and reverses safe turns until a member-edit conflict. Personal `/undo` shares the checkpoint service with company mode; personal history is bounded and pins Git trees without changing HEAD or the index. Browser retries retain the same request across tab reloads.
113
+ - The `bypass` mode (`/permission bypass`, `piagent-auto --bypass`) turns every gate off; output is still redacted and `/undo` still works.
114
+ - The dashboard opens, edits, saves, renames and deletes project files, with Cmd/Ctrl+P, search and conflicts when a file changed on disk.
115
+ - Project terminals in the dashboard; company terminals run in the sandbox, on macOS too, and never on the host.
116
+ - Inline review of the agent's hunks with Keep and Revert, and Timeline restore with a preview, sharing checkpoints with `/undo`.
93
117
 
94
- - Company Session Hub terminals run inside the Linux/WSL bubblewrap boundary through the company Gateway and authenticated relay, with no network, credential masking and sandbox process cleanup. Disconnects reconnect for replay without automatically resending commands. Doctor reports prerequisites. The complete browser workflow is qualified on Linux arm64; native Linux x64 and WSL remain unverified.
95
-
96
- - Personal Session Hub terminals open up to four project shells with lazy xterm tabs, resizing, Ctrl+C and reconnect replay. Session teardown cleans terminal processes. Explicit `@terminal`/`@terminal:2` sends attach bounded redacted output. Optional native PTY failures leave the dashboard usable and appear in Doctor; company terminals never fall back to host execution.
118
+ ### Fixed
97
119
 
98
- - Session Hub reviews exact observed agent hunks inline, with Keep, preview-confirmed Revert, hunk navigation/counts and current/removed-line comments to the composer. Clean tabs refresh after agent changes; dirty drafts retain conflict handling. Company source review and revert run in the existing sandbox. New untracked agent files support review; deletion through hunk revert remains unavailable.
120
+ - A checkpoint that could not be taken blocked every edit; it no longer does, and snapshots take about 0.5 s instead of 35 s on 4,000 files.
99
121
 
100
- - Session Hub edits and atomically saves files with Cmd/Ctrl+S, dirty tabs, new files and digest conflicts (Reload/Compare/confirmed Overwrite). Live permission and protected-path checks apply in personal and company mode. Durable receipts prevent duplicate saves; member edits notify the next agent turn and invalidate stale agent edits.
101
- - Session Hub opens project files in read-only editor tabs, with Files/Search navigation, Cmd/Ctrl+P, line links from tool calls, source changes and @mentions, and a drawer on smaller screens. Protected files stay locked. Company file reads and searches run inside the session's existing sandbox through its Gateway.
122
+ Requires: Agent Studio 0.38.0 and Agent Watch 0.15.14 (Windows 0.1.17) for the company Bypass level.
102
123
 
103
124
  ## v1.37.1 - 2026-10-22
104
125
 
105
- Closes, helper reports and team-memory lessons Studio can trust (from the 2026-10-22 upstream audit), and two outbound-address fixes from the 2026-10-22 security review.
126
+ **Run closes and helper reports Studio can trust.** A retried close counts only when it reaches Studio, helpers keep their answers, and outbound requests refuse every IPv6 form of a private address.
106
127
 
107
- ### Security
108
-
109
- - **`web_fetch` and the package proxy refuse every IPv6 form of a private address.** Both checked IPv4 carried in IPv6 only when it was written dotted, so `https://[::ffff:7f00:1]/` (127.0.0.1) or a NAT64 `64:ff9b::c0a8:101` (192.168.1.1) passed and was dialled; the URL parser even rewrites `[::ffff:127.0.0.1]` to the hex form. One classifier (`managed/ip-policy.mjs`) now judges mapped, compatible, translated, NAT64 and 6to4 addresses by their IPv4, treats Teredo and IPv6 outside `2000::/3` as private, and fails closed on anything it cannot parse. HTTPS certificate checks are unchanged.
110
- - **With a company upstream proxy (`HTTPS_PROXY`), the package proxy still refuses private destinations.** It handed the host name to the upstream, which resolved it itself, so no address was checked. The name is now looked up and checked here in every mode, and the upstream is asked for the checked address (`CONNECT <ip>:<port>`, or the IP with the original `Host` for plain HTTP); TLS still names the registry end to end. A name this machine cannot resolve is refused like any other refused host; `run_with_network` still reaches it after the member approves.
128
+ ### Fixed
111
129
 
112
- ### Fixes
130
+ - A close retried after a brief failure could be recorded without reaching Studio; it now counts only when Studio receives it.
131
+ - A helper whose close failed for a moment was turned into a failure; it now keeps its answer, and its report is resent after passing errors.
132
+ - Team memory merged failures of two commands of one executable into one lesson; the whole command is now the key.
133
+ - Skill feedback mixed skills with alike names such as `a/b` and `a_b`; each skill name now keeps its own file.
113
134
 
114
- - **A run's close asked again is recorded closed only when it reached Studio.** After a close failed for a moment, Agent Watch dropped the run, so the close asked again "succeeded" without reaching Studio: Piagent recorded the run closed while Studio kept it active until its lease lapsed and lost the process report. Agent Watch 0.15.11 (Windows 0.1.16) sends it again and says so (`close-retry`); with an older Agent Watch the run now stays "active" here and reopening the conversation recovers or abandons it.
115
- - **A helper whose close fails for a moment keeps its answer.** A helper role's close goes through the same wait for Studio as the run's; a close that still fails no longer turns a finished helper into a failure, and the role's next helper closes it first. A helper's report to Studio is sent again after a passing failure (no answer, 5xx, 429), never after a refusal.
116
- - **A repeated tool-error lesson names the right command.** Lessons were keyed on the executable, so `curl service-a` and `curl service-b` failing the same way became one lesson saying the first "failed twice". The whole command (without temporary paths, ids and numbers) is the key now.
117
- - Skill feedback keeps one file per skill name (`a/b`, `a_b` and `A_B` shared one); notes served under an old key or epoch are forgotten when the scope changes.
135
+ ### Security
118
136
 
119
- ### Tests
137
+ - The `web_fetch` tool and the package proxy let some IPv6 forms of a private address through; every such form is now refused.
138
+ - With a company upstream proxy (`HTTPS_PROXY`), the package proxy now checks each destination itself instead of leaving it to the upstream.
120
139
 
121
- - `tests/managed-failures.test.mjs`: a close asked again of an Agent Watch with and without `close-retry`.
122
- - `tests/managed-helper-settlement.test.mjs`: a settlement sent again after a 5xx only; a helper role close asked again and never failing the helper.
123
- - `tests/managed-memory-lessons.test.mjs`, `tests/managed-skill-feedback.test.mjs`, `tests/managed-memory-outbox.test.mjs`: two commands of one executable, alike skill names, a scope change.
124
- - `tests/managed-ip-policy.test.mjs`, `tests/managed-coding-tools.test.mjs`, `tests/managed-package-proxy.test.mjs`: hex/dotted mapped, NAT64, 6to4 and Teredo addresses refused; the upstream proxy is asked for the checked address only.
140
+ Requires: Agent Watch 0.15.11 (Windows 0.1.16).
125
141
 
126
142
  ## v1.37.0 - 2026-10-22
127
143
 
128
- A cut answer no longer stops a long task, and the company Terminal can be driven by a script.
129
-
130
- ### Fixes
131
-
132
- - **An answer Studio's upstream cut mid-stream is asked again.** Found on 2026-10-21 in the long-task soak: Studio's error event for a cut answer ("Request interrupted", code `upstream_interrupted`) reached Piagent without its code, which the provider libraries drop, so it showed "the request could not be sent" and stopped a long task. Studio's own words now name it `upstream_interrupted`: it is asked again and the task goes on by itself. "The answer ran past its output limit" names `output_limit_exceeded`. "Request ended by Studio" is still not asked again.
133
- - The company Terminal no longer exits with an error when a conversation closes right after a turn while git still answers for the branch status.
144
+ **A cut answer no longer stops a long task.** An answer cut mid-stream behind Studio is asked again and the task goes on, and `piagent studio --rpc` lets a script drive a company conversation.
134
145
 
135
146
  ### Added
136
147
 
137
- - **`piagent studio --rpc`**: one company conversation over Pi's RPC protocol on stdin/stdout. Several messages in one conversation; `ask_user` arrives as an extension UI select the client answers.
138
- - **Long-task soak lane** (`evals/long-task-soak-v1`, repository only): a simulated member drives the real company agent through 45–150-minute multi-phase tasks in real repositories (Node, Python, Go in Docker, PostgreSQL, Playwright, a polyglot monorepo) on the Terminal or the WebUI Gateway. It answers only the business decisions it owns, changes a rule mid-task, presses Stop, restarts the Gateway and nudges when the agent stops early; hidden acceptance checks decide whether the work is done.
148
+ - New `piagent studio --rpc` runs one company conversation over Pi's RPC protocol on stdin/stdout, with several messages and `ask_user`.
149
+ - A long-task soak lane in the repository drives the real company agent through 45–150-minute tasks with a simulated member.
139
150
 
140
- ### Tests
151
+ ### Fixed
141
152
 
142
- - `tests/managed-studio-rpc.test.mjs`: two messages in one conversation, `ask_user` answered through the client, a clean exit.
143
- - `tests/managed-failures.test.mjs`, `tests/managed-provider-retry.test.mjs`: Studio's words for a cut answer and an over-long answer, asked again; "Request ended by Studio" is not.
144
- - `tests/long-task-soak.test.mjs`: the simulated member's reading of a turn end, its answers, nudges, phases and stalls.
153
+ - An answer cut mid-stream showed "the request could not be sent" and stopped a long task; it is now asked again and the task goes on.
154
+ - The company Terminal no longer exits with an error when a conversation closes right after a turn while Git still reports branch status.
145
155
 
146
156
  ## v1.36.1 - 2026-10-22
147
157
 
148
- Agent Watch failing to reach a running Studio for a moment no longer stops a task.
158
+ **A brief Agent Watch failure no longer stops a task.** When Agent Watch briefly cannot reach a running Studio, Piagent asks again for up to 3 minutes instead of stopping the task.
149
159
 
150
- ### Fixes
160
+ ### Improved
151
161
 
152
- - **A broker failure while Studio answers is asked again.** Found on 2026-10-22: after a long command, renewing the run's grant through Agent Watch failed once with `managed-broker:serverUnavailable` (Agent Watch's way to Studio answered a 5xx; Studio never saw the call). Studio's heartbeat said ready, so the failure was not waited out and a 25-minute task with 2 of 4 steps open stopped at once. Now a `managed-broker` failure on a Studio that answers is asked again, pausing longer each time (2 s doubling), until it has failed for 3 minutes without a request going through; then it fails as before.
153
- - **Closing the round's run goes through the same wait**, so a passing gateway error does not fail a turn whose work is done.
154
- - Each wait is in `studio-link.jsonl` and reported to Studio (Logs → "Mất kết nối", cause `broker_offline`). Codes that are not Agent Watch's (a refused key or report, `connector_unavailable` on a running Studio) still fail at once.
162
+ - Each wait is logged locally and reported to Studio in Logs → "Mất kết nối"; a refused key or report still fails at once.
155
163
 
156
- ### Tests
164
+ ### Fixed
157
165
 
158
- - `tests/managed-failures.test.mjs`: a renew and a close Agent Watch could not send once are asked again and the turn ends well (both fail on 1.36.0).
159
- - `tests/managed-studio-link.test.mjs`: the retry window, its reset when a request goes through, and codes that still fail at once.
166
+ - One failed grant renewal through Agent Watch stopped a 25-minute task; it is now asked again, waiting longer each time, for up to 3 minutes.
167
+ - Closing the round's run goes through the same wait, so a passing gateway error no longer fails a turn whose work is done.
160
168
 
161
169
  ## v1.36.0 - 2026-10-21
162
170
 
163
- Team memory learns from what went wrong (needs Agent Studio with the memory feedback loop, protocol 4).
171
+ **Team memory learns from what went wrong.** Memory learns from member feedback and repeated errors, keeps only completed tasks that add something, and proposes failing skills for review.
164
172
 
165
- ### Features
173
+ ### Added
174
+
175
+ - What memory hands a round goes back to Studio with it, so Studio rates notes by the member's next words and stops briefing wrong ones.
176
+ - A command that fails the same way twice in a round becomes a lesson that keeps the first error line, with no guessed cause.
177
+ - When 3 of a skill's last rounds failed, Piagent writes a proposal to `.pi/piagent-state/skill-proposals/`, at most weekly; it never edits skills.
166
178
 
167
- - **What memory handed a round goes back with it.** Briefs and `memory_search` answers name what they handed over (`serve_id`). The round that used them sends the ids back with its retain (`serves`), and only to a Studio that speaks protocol 4. Studio then rates those notes by the member's next words, and stops briefing notes members said were wrong.
168
- - **A command that fails the same way twice in a round is a lesson.** This goes beside check recoveries (`managed/memory-lessons.mjs`). The lesson keeps the first error line, sanitized (temporary paths, ids and numbers taken out of the fingerprint), with no guessed cause.
169
- - **Repository memory keeps only completed tasks that add something.** Changes only to build output, caches, logs or Piagent's own state are `not_durable`. The same files at the same digests a second time are `already_known` (`completedTaskSkipReason`).
170
- - **Skills that keep failing are proposed for review.** When at least 3 of a skill's last rounds ended with a failed check or a repeated tool error, Piagent writes `.pi/piagent-state/skill-proposals/<skill>.md` with the evidence, at most once a week. Piagent never edits a skill itself.
179
+ ### Improved
171
180
 
172
- ### Tests
181
+ - Repository memory skips completed tasks that change only build output, caches, logs or Piagent's state, or repeat files already known.
173
182
 
174
- - `tests/managed-team-memory.test.mjs`: protocol 4 sends the brief's and the search's serves with the round that used them, and protocol 3 sends none.
175
- - `tests/managed-memory-lessons.test.mjs`: repeated tool errors give one lesson; different errors, successes and timeouts give none.
176
- - `tests/repository-memory-distill.test.mjs`, `tests/managed-skill-feedback.test.mjs`.
183
+ Requires: Agent Studio 0.37.0.
177
184
 
178
185
  ## v1.35.1 - 2026-10-21
179
186
 
180
- A passing failure of the model provider no longer stops a long task.
187
+ **A passing model provider failure no longer stops a long task.** A provider error in the middle of an answer is asked again, and a round cut by such a failure goes on by itself after a pause.
181
188
 
182
- ### Fixes
189
+ ### Improved
183
190
 
184
- - **The provider's own error event in the middle of an answer is asked again.** Found on 2026-10-21: gpt-6-sol sent `api_error` after a tool step, Studio passed it on as it should, and Piagent did not recognise it, so nothing asked again and a long task stopped until the member wrote 8 minutes later. Pi's words for such an event (OpenAI `server_error` / `api_error`, Anthropic `api_error` / `overloaded_error`) are now the code `upstream_server_error`, asked again by the turn's retry (2 and 4 s later).
185
- - **A round cut by a passing provider failure goes on by itself.** Where the turn's retry does not run (the WebUI does not replay a round once a tool ran) or does not get through, the next round starts after a pause and tells the agent why: for `upstream_server_error`, `upstream_interrupted`, `upstream_incomplete`, `upstream_timeout`, `upstream_unavailable`, `connector_execution_failed` and `output_limit_exceeded`, at most 8 times per member message, 15 s doubling to 5 min (about 23 min in all); a round that ends well resets the count; Stop ends the pause. After the last one the turn fails with the reason, as before.
186
- - **Every ask again is in the member's local log.** `studio-link.jsonl` now also has `turn_retry` and `provider_retry` lines (and `outcome: "gave_up"`), so why a task stopped or went on can be read back.
191
+ - Where that retry cannot run, the next round starts after a pause and tells the agent why, up to 8 times per member message (about 23 min).
192
+ - A round that ends well resets the count, Stop ends the pause, and after the last attempt the turn fails with its reason.
193
+ - Every retry is recorded in the member's local log, so why a task stopped or went on can be read back.
187
194
 
188
- ### Tests
195
+ ### Fixed
189
196
 
190
- - `tests/managed-provider-retry.test.mjs`: the provider's words become `upstream_server_error` (Studio's own codes keep theirs), a round that goes on and resets the count, the bounded number of asks, Stop while waiting.
191
- - `tests/managed-provider-error-resume.test.mjs`: WebUI end to end, the provider's `api_error` event after a tool step; the task finishes without a click and the retry is in the local log.
197
+ - A provider error after a tool step stopped a long task until the member wrote again; it is now asked again 2 and 4 s later.
192
198
 
193
199
  ## v1.35.0 - 2026-10-21
194
200
 
195
- Long company tasks go on across Studio updates.
201
+ **Long company tasks go on across Studio updates.** When Studio stops, restarts or updates mid-task, Piagent waits for it and goes on instead of failing, and a dashboard turn can run for 24 hours.
196
202
 
197
- ### Features
198
-
199
- - **Waits for Studio instead of failing.** When a company request cannot reach Studio for a reason that is Studio's or the way to it (Studio stopped, restarting or being updated; a Cloudflare or LAN-edge page instead of Studio's answer, now its own code `studio-gateway-unavailable`; Agent Watch losing Studio during an update), Piagent reads Studio's heartbeat (`GET /v1/heartbeat`, Studio 0.36.0) and asks again once Studio is back, with no limit on how long; Stop ends the wait. A request cut before the model answered is asked again as it was; an answer cut mid-stream is asked again by the turn's retry without its two-try limit; where the WebUI ends that retry (a tool already ran), the next round starts by itself and tells the agent why ("Studio was updated (0.35.3 → 0.36.0) … continue from where you were"). A key, quota or policy failure fails at once as before; Agent Watch or Studio's connector failing while Studio answers here (and was not away in the last 10 minutes) fails at once too, after the usual two asks.
200
- - **Every wait is logged and reported.** One JSON line per event in `<agentDir>/logs/studio-link.jsonl` (`kind` `studio_wait` / `studio_disconnect`, `cause`, `outcome`, versions, attempts), filterable with `jq`; reported to Studio (`POST /studio/v1/managed/disconnects`), which decides the cause from its own starts and lists it in Logs → "Mất kết nối". A Studio without the route (older than 0.36.0) is not asked again; a Studio without the heartbeat counts as up.
201
- - **24-hour turns in the WebUI.** The watchdog's ceiling for one member message is 24 hours (it was 6), so a checklist left running overnight is not cut; the 15-minute silence limit stays and each heartbeat read while waiting counts as activity.
203
+ ### Added
202
204
 
203
- ### Tests
205
+ - When Studio is away, Piagent reads its heartbeat and asks again once it is back, with no time limit; Stop ends the wait.
206
+ - Every wait is logged locally and reported to Studio, which lists it with its cause in Logs → "Mất kết nối".
204
207
 
205
- - `tests/managed-studio-link.test.mjs`: classification, waits, Stop, reports, the unlimited turn retry, a round that resumes, and Agent Watch or Studio's connector failing on a running Studio.
206
- - `tests/managed-studio-update-resume.test.mjs`: WebUI end to end, a request cut by a Studio update, Studio away for 5 s and back as a new version; the task finishes without a click, the report says `studio_update`, the local log has the wait.
207
- - Live check on the Mac mini: an 8-step task through Cloudflare while Studio was upgraded from 0.35.3 to 0.36.0; Agent Watch could not renew the grant for 14.7 s, Piagent waited and went on, all 8 steps finished, and Studio recorded the stretch as `studio_update`.
208
+ ### Improved
208
209
 
209
- ## v1.34.3 - 2026-10-20
210
+ - A round the dashboard cannot replay starts again by itself and tells the agent Studio was updated, so it continues where it was.
211
+ - One member message can run for 24 hours in the dashboard (it was 6); the 15-minute silence limit stays.
212
+ - A key, quota or policy failure still fails at once, as before.
210
213
 
211
- Agent Watch notifies for company conversations.
214
+ Requires: Agent Studio 0.36.0.
212
215
 
213
- ### Fixes
216
+ ## v1.34.3 - 2026-10-20
214
217
 
215
- - **Company conversation states reach Agent Watch.** The company Gateway wrote each conversation's state under its private session folder, while Agent Watch reads the member's `~/.pi/agent/status`; company conversations never notified. They are now written to `~/.pi/agent/status/company`. Found in the live check: the state went from waiting for an answer to done, in the wrong folder.
218
+ **Agent Watch notifies for company conversations.** Company conversation states were written where Agent Watch does not read, so it never notified; they are now written where it reads.
216
219
 
217
- ### Tests
220
+ ### Fixed
218
221
 
219
- - `tests/managed-crash-continue.test.mjs` checks the company Gateway writes the conversation's state, without its prompt or answer, under the member's `~/.pi/agent/status/company`.
222
+ - Agent Watch never notified for company conversations; their states now go to `~/.pi/agent/status/company`, without prompts or answers.
220
223
 
221
224
  ## v1.34.2 - 2026-10-20
222
225
 
223
- Helper outcomes reach Studio.
224
-
225
- ### Fixes
226
+ **Helper outcomes reach Studio.** In 1.34.1 Studio refused helper reports sent with an outdated token, so no outcome was recorded; reports now go with the current token.
226
227
 
227
- - **Helper settlements are recorded.** A helper sent its report with the first token of its attempt, which Studio had already replaced at a renewal, so Studio refused it (401) and no outcome was recorded in 1.34.1. The report now goes with the role's current token, taken the same way the helper's own requests take theirs. Found in the live check on Agent Studio 0.35.0.
228
-
229
- ### Tests
228
+ ### Fixed
230
229
 
231
- - `tests/managed-delegation-cli.test.mjs` gives each renewal a new token and checks each report goes with a token newer than any the helper's requests used; `tests/managed-helper-settlement.test.mjs` covers the lease.
230
+ - Helper reports were refused after a token renewal and no outcome was recorded; they now use the helper role's current token.
232
231
 
233
232
  ## v1.34.1 - 2026-10-20
234
233
 
235
- Piagent asks Studio what it serves, helpers report how their work ended, and Agent Watch learns when a conversation needs you (Agent Studio 0.34, Agent Watch 0.15.9 / Windows 0.1.15).
234
+ **Helper outcomes, line review and Agent Watch notifications.** Helpers report how their work ended, line comments on a diff go to the agent, and Agent Watch notifies when a conversation needs you.
235
+
236
+ ### Added
236
237
 
237
- ### Changes
238
+ - Each helper reports how it ended: succeeded, failed, cancelled or unverifiable; Studio shows it in Logs → Lượt agent.
239
+ - In Source Changes, click a line number to comment; comments on several files go to the composer as one message with `file:line`.
240
+ - The review helper's findings show under the line they name, and findings without a line under their file.
241
+ - Conversation states are written for Agent Watch notifications, holding only the title and project name, never prompts or answers.
242
+ - The `delegate` tool takes optional target, change, constraints, ownership and acceptance fields, which head the helper's brief.
238
243
 
239
- - v1.34.0 was tagged but never published: its lockfile named a lightningcss version that does not exist. v1.34.1 is the same release with the lockfile fixed.
240
- - **Studio capabilities.** Piagent asks `GET /v1/capabilities` (Agent Studio 0.34+) once an hour per Studio and key, and keeps the answer in `~/.pi/agent/studio-capabilities.json`. A newer operation is used only when Studio lists it; an older Studio (404) keeps today's behaviour. `memory_ask` is offered unless the list leaves `memory.ask.v1` out.
241
- - **Structured delegation.** `delegate` takes five optional fields beside the brief: target, change, constraints, ownership and acceptance. They head the helper's brief.
242
- - **Helper settlements.** Each helper attempt reports once, with its own run token, how it ended: succeeded (answered in the form its role needs), failed, cancelled, or unverifiable (no verdicts or findings, or a stale review). The main agent reads `Outcome: …` first; the receipt line says done, failed, stopped or unverifiable. Studio shows each attempt's ending in Logs → Lượt agent and reads an attempt without a report as unverifiable.
243
- - **Review on the diff.** In Agent Inspector → Source Changes, click a line number to comment that line. Comments on any number of files go into the conversation's composer as one message with a `file:line` anchor and the code of each line; a comment whose line has changed since is marked. The review helper's findings (blocking, major, minor) show under the line they name, and findings without a line under the file.
244
- - **Conversation states for Agent Watch.** The dashboard and the company runtime write each conversation's state (working, waiting for an approval or an answer, done, stopped, failed) under `~/.pi/agent/status/`. A file holds the conversation's title and project name, never its preview, prompt or answer. Agent Watch 0.15.9 (macOS) and 0.1.15 (Windows) turn it into notifications.
244
+ ### Improved
245
245
 
246
- ### Tests
246
+ - Piagent asks Studio hourly which operations it serves and uses newer ones only when listed; an older Studio keeps today's behaviour.
247
247
 
248
- - `tests/managed-studio-capabilities.test.mjs`, `tests/managed-helper-settlement.test.mjs`, `tests/piagent-webui-agent-status-files.test.mjs`, `tests/piagent-webui-line-review.test.mjs`; `tests/piagent-webui-session-hub.e2e.mjs` comments two files and sends them; `tests/managed-delegation-cli.test.mjs` checks both helpers' settlements through the production CLI.
248
+ Requires: Agent Studio 0.34, Agent Watch 0.15.9 (Windows 0.1.15).
249
249
 
250
250
  ## v1.33.0 - 2026-10-20
251
251
 
252
- Company and personal sessions run on Pi 1.3.0 (from 0.87.1).
252
+ **Company and personal sessions run on Pi 1.3.0.** `piagent-setup` and `piagent-update` move Piagent from Pi 0.87.1 to Pi 1.3.0, which refuses malformed tool calls and retries gateway errors.
253
253
 
254
- ### Changes
254
+ ### Breaking changes
255
255
 
256
- - **Pi host 1.3.0.** `piagent-setup` and `piagent-update` install Pi Coding Agent 1.3.0. What it brings to Piagent: a tool call whose arguments are malformed JSON is refused and shown to the model instead of running with the fields parsed before the error; gateway errors such as "Unable to forward upstream stream" are retried; internal Pi packages are pinned to exact versions; a resumed session keeps its active tools; switching model drops the previous model's thinking; the terminal reports its state with OSC 7501 (working, waiting for a dialog or sign-in, done, error).
257
- - Your personal `pi` command is also 1.3.0 after the update. Pi 1.2.0 changed theme `$schema` references and `models.json` overrides of the `kimi-coding` base URL must end in `/v1`.
258
- - After the update, Agent Watch writes a new binding by itself while it runs; `piagent studio` waits for it.
259
- - GPT-6.1 Sol keeps its reviewed 272k window in company sessions (Pi 1.3.0's catalog says 500k, which Codex prices at twice the rate above 272k).
260
- - The three `brace-expansion` advisories accepted until 2026-10-31 are gone: Pi 1.3.0 installs `brace-expansion` 5.0.12.
256
+ - Your personal `pi` also becomes 1.3.0: theme `$schema` references changed, and `kimi-coding` base URL overrides must end in `/v1`.
261
257
 
262
- ### Fixes
258
+ ### Improved
263
259
 
264
- - Pi 1.2+ calls `before_agent_start` also for a run that a custom message starts (no prompt). Piagent's personal runtime now gives such a run the same system prompt and starts no turn, task or context pack for it.
260
+ - A tool call with malformed JSON arguments is refused and shown to the model instead of running with the fields parsed before the error.
261
+ - Gateway errors are retried, a resumed session keeps its active tools, and switching model drops the previous model's thinking.
262
+ - GPT-6.1 Sol keeps its reviewed 272k window in company sessions, where use above 272k is priced at twice the rate.
265
263
 
266
- ### Tests
264
+ ### Fixed
267
265
 
268
- - `tests/runtime-session-modules.test.mjs`: a custom-message run records no turn, opens no index and creates no task (fails without the fix).
269
- - `tests/managed-failures.test.mjs`: Sol keeps 272k on a host whose catalog says 500k.
270
- - `tests/runtime-advisories.test.mjs` checks the exception rules on a fixture list.
266
+ - A run started by a custom message now gets the usual system prompt and starts no extra turn, task or context pack.
271
267
 
272
- ## v1.32.1 - 2026-10-19
268
+ ### Security
273
269
 
274
- Bypass is kept after a reload, and a tab in use stays signed in.
270
+ - Three accepted dependency advisories are resolved: Pi 1.3.0 installs the fixed version.
275
271
 
276
- ### Fixes
272
+ Requires: Pi 1.3.0.
277
273
 
278
- - Turning on Bypass (or Fast) right after a reply was refused by the Gateway as `session-revision-stale`: the turn had changed the conversation once more as it ended, so nothing changed and a reload showed "Hỏi trước". Access and Fast are now sent again against the latest revision, like a rename.
279
- - Opening another conversation that was also in Bypass showed "Hỏi trước": the access button was reset for the switch and only followed a change of the choice. The button and Settings → Access now follow the open conversation.
280
- - A browser session ended 8 hours after its launch even while its tab was in use, so a long or hung turn ended on the expired screen. A request past half the session's time now renews it and sends the cookie again, up to 7 days; only a tab unused for 8 hours signs out.
274
+ ## v1.32.1 - 2026-10-19
281
275
 
282
- ### Tests
276
+ **Bypass survives a reload, and a tab in use stays signed in.** Bypass and Fast turned on right after a reply are kept, the access button follows the open conversation, and a tab in use is no longer signed out.
283
277
 
284
- - `tests/managed-bypass-switch-reload.test.mjs`: two company conversations turned to Bypass right after their replies, switched between and reloaded, all show Bypass.
285
- - `tests/piagent-webui-loopback-server.test.mjs`: a session in use is renewed past half its time, within the cap, and the tab gets its cookie again.
278
+ ### Fixed
279
+
280
+ - Turning on Bypass or Fast right after a reply was refused, so a reload showed "Hỏi trước"; it is now resent against the latest state.
281
+ - Opening another conversation in Bypass showed "Hỏi trước"; the access button and Settings → Access now follow the open conversation.
282
+ - A browser session ended 8 hours after launch even while in use; it now renews for up to 7 days, and only a tab unused for 8 hours signs out.
286
283
 
287
284
  ## v1.32.0 - 2026-10-19
288
285
 
289
- A company stream that fails or is stopped ends at Studio too, so the conversation's account is free for the next request (Agent Studio 0.32.0).
286
+ **Failed or stopped company streams end at Studio too.** When a company stream fails or you press Stop, Piagent asks Studio to end the request, so the conversation's account is free for the next one.
287
+
288
+ ### Improved
290
289
 
291
- ### Fixes
290
+ - New failure messages for an over-long answer, a cancelled request and a superseded one; an over-long answer is asked again.
292
291
 
293
- - When a company model stream ends with an error or the member presses Stop, Piagent asks Studio to end that request (`POST /v1/requests/{id}/cancel`, using Studio's `X-Request-ID`, the role's own token, fire and forget, 10 s). Behind Cloudflare a dropped connection may never reach Studio: on 2026-10-19 a degenerate answer kept streaming there for 10 minutes and every retry of that conversation was refused as "account busy". An older Studio answers 404 and nothing changes.
294
- - New failure words for Studio's `output_limit_exceeded`, `client_cancelled` and `superseded` (roles only, never model names); `output_limit_exceeded` is asked again by the company turn retry.
292
+ ### Fixed
295
293
 
296
- ### Tests
294
+ - A dropped stream could keep running at Studio for 10 minutes, so every retry was refused as "account busy"; Studio is now told to end it.
297
295
 
298
- - `tests/managed-failures.test.mjs`: a stream cut mid-answer and a stream stopped with Stop are both ended at Studio with the role's token.
296
+ Requires: Agent Studio 0.32.0.
299
297
 
300
298
  ## v1.31.1 - 2026-10-19
301
299
 
302
- `memory_ask` is there from the first conversation after an update.
300
+ **`memory_ask` is there from the first conversation after an update.** The first company conversation after Agent Studio 0.30.0 arrived had no `memory_ask`; it is now offered whenever the conversation has team memory.
303
301
 
304
- ### Fixes
302
+ ### Improved
305
303
 
306
- - `memory_ask` was offered only when this Mac had last heard memory protocol 3 from Studio, which it records at the end of a conversation; the first company conversation after Agent Studio 0.30.0 arrived had no `memory_ask`. It is now offered whenever the conversation has team memory; on a Studio without `/v1/memory/ask` it says to use `memory_search`, and memory stays on.
304
+ - On a Studio without it, `memory_ask` says to use `memory_search`, and memory stays on.
307
305
 
308
- ### Tests
306
+ ### Fixed
309
307
 
310
- - `tests/managed-team-memory.test.mjs`, `tests/managed-memory-p1.test.mjs` updated.
308
+ - The `memory_ask` tool was missing from the first company conversation after a Studio update; it is now offered whenever team memory is on.
311
309
 
312
310
  ## v1.31.0 - 2026-10-19
313
311
 
314
- Team memory follows the work: team rules first, the current branch and folders preferred, and `memory_ask` answers with sources (Agent Studio 0.30.0).
312
+ **Team memory follows the work.** Team rules lead the brief, memories from the current branch and folders are preferred, and the new `memory_ask` answers with sources.
315
313
 
316
- ### Changes
314
+ ### Added
315
+
316
+ - The brief starts with the team's rules, which override recalled memories.
317
+ - The new read-only `memory_ask` tool answers a question from team memory with its sources, for the main agent and helpers.
317
318
 
318
- - Memory protocol 3: each round carries its work context (branch, top-level folders touched, files changed, checks and their result, commit changes). Studio 0.30.0 tags memories with branch and folders, prefers them in the brief and `memory_search`, and marks an agent's "fixed/done" as a claim until a check passes (verified) or git removes the files it named (stale).
319
- - The brief starts with the team's rules ("Luật của team"), which override recalled memories.
320
- - New tool `memory_ask` (main agent and helpers, read-only): asks Studio to answer a question from team memory with its sources; off (204/404) when Studio has no memory.
321
- - A folder with several repositories uses each repository's memory; a repository whose only remote is not named `origin` works; git's "dubious ownership" (often on WSL) is retried; a folder with no repository is reported to Studio instead of turning memory off silently.
322
- - Check results from piped commands (`cmd | tail`) now count as lessons.
323
- - Older Studio (0.27–0.29) keeps working: protocol 3 fields are sent only when Studio says it reads them.
319
+ ### Improved
324
320
 
325
- ### Tests
321
+ - Each round carries its branch, folders, changed files and checks, so Studio prefers memories from the current branch and folders.
322
+ - An agent's "fixed" or "done" is a claim until a check passes, and turns stale when Git removes the files it named.
323
+ - Check results from piped commands such as `cmd | tail` now count as lessons, and Agent Studio 0.27–0.29 keeps working.
326
324
 
327
- - `tests/managed-memory-p1.test.mjs`; new cases in `tests/managed-team-memory.test.mjs` and `tests/managed-memory-lessons.test.mjs`.
325
+ ### Fixed
326
+
327
+ - Folders with several repositories, a remote not named `origin` and Git "dubious ownership" on WSL no longer turn memory off silently.
328
+
329
+ Requires: Agent Studio 0.30.0.
328
330
 
329
331
  ## v1.30.1 - 2026-10-18
330
332
 
331
- The company Terminal no longer shows model names, and the home folder says why it cannot open there.
333
+ **Company Terminal hides model names; clear message in the home folder.** The company Terminal shows roles instead of model ids, and `piagent studio` in the home folder now says why it cannot open there and what to do.
332
334
 
333
- ### Fixes
335
+ ### Improved
334
336
 
335
- - The company Terminal showed the Harness's model ids (header `main gpt-… · review gpt-…`, footer, and the /model and /thinking answers). A member sees roles only: `Main agent (Rất cao) · Subagent review bật`, footer `Main agent • Rất cao`. Pi's start-up warnings are reworded too: the crash notice no longer points at /bug (off in company conversations) and "Could not restore model …" no longer names one.
336
- - `piagent studio` in the home folder (or any folder that holds `~/.pi/agent/agent-watch-managed.json`) failed with `managed-launch-binding-changed`, which reads "Agent Watch or Piagent changed; import the configuration again", although nothing had changed. The refusal stays (a project's tools must not reach the company configuration); it now reports `managed-project-contains-config` with what to do: open a project folder, or `piagent studio --project <folder>`. The dashboard shows the same words.
337
+ - Pi's start-up warnings no longer point at /bug, which is off in company conversations, or name a model.
337
338
 
338
- ### Tests
339
+ ### Fixed
339
340
 
340
- - New case in `tests/managed-binding-wait.test.mjs`; `tests/terminal-parity.test.mjs` checks that no model id reaches the header, footer, command answers or Pi's warnings.
341
+ - The company Terminal showed the Harness's model ids in its header, footer and /model answers; it now shows roles, such as `Main agent • Rất cao`.
342
+ - Running `piagent studio` in the home folder wrongly said Agent Watch or Piagent had changed; it now says to open a project folder or use `--project`.
341
343
 
342
344
  ## v1.30.0 - 2026-10-18
343
345
 
344
- Large conversations reach Studio from slow connections, and the company Terminal reads like the dashboard.
346
+ **Large contexts over slow connections; a clearer company Terminal.** Model calls to Studio are gzip-compressed, about 3x smaller, and the company Terminal shows turn stats, running helpers and the Git branch.
345
347
 
346
- ### Changes
348
+ ### Improved
347
349
 
348
- - Model calls go to Studio gzip-compressed once Studio says it accepts them (Agent Studio 0.28.2, `X-Studio-Accept-Encoding: gzip`): bodies of 64 KiB or more, about 3x smaller (a 200k-token Codex context is about 1 MB; encrypted reasoning does not compress). With Studio 0.28.2 a slow upload that keeps sending is no longer cut at 15 s.
349
- - Company Terminal: each turn's end notice adds requests, tokens, time and output speed; the footer shows `Subagent n/m` while helpers run and the git branch; `memory_search` and `memory_page` results stay short (Ctrl+O shows all); "Working" reads "Đang làm…"; `/bypass status` and `/fast on` run on the first Enter; `piagent studio` says it is joining Agent Watch before the Terminal draws.
350
+ - Model calls of 64 KiB or more go to Studio gzip-compressed once Studio accepts it, about 3x smaller.
351
+ - Each turn's end notice in the company Terminal adds requests, tokens, time and output speed.
352
+ - The footer shows `Subagent n/m` and the Git branch; `memory_search` and `memory_page` results stay short, with Ctrl+O to show all.
350
353
 
351
- ### Tests
354
+ ### Fixed
355
+
356
+ - A slow upload that keeps sending is no longer cut at 15 s.
357
+ - Commands `/bypass status` and `/fast on` run on the first Enter, and `piagent studio` says it is joining Agent Watch before the Terminal draws.
352
358
 
353
- - `tests/managed-compressed-fetch.test.mjs`; new cases in `tests/terminal-parity.test.mjs`.
359
+ Requires: Agent Studio 0.28.2.
354
360
 
355
361
  ## v1.29.0 - 2026-10-18
356
362
 
357
- The company Terminal (`piagent studio`) shows what the team's Harness runs and keeps company conversations inside the company.
363
+ **Company Terminal shows the Harness and keeps work inside the company.** The company Terminal gets its own header, footer and plan checklist, blocks commands that send work outside, and Stop no longer breaks the next message.
358
364
 
359
- ### Changes
365
+ ### Added
360
366
 
361
- - `/share` (a GitHub Gist) and `/bug` (a report to Pi's developers) are refused in the company Terminal with a notice, and Pi's "/bug sends a report to the developers" hint after errors is no longer shown: both sent company conversations and code outside the company.
362
- - `/login`, `/logout`, `/model`, `/scoped-models`, `/thinking` and `/settings`, and the keys that do the same (Ctrl+L, Ctrl+P, Shift+Tab), say that the team's Harness decides instead of opening Pi's pickers. They stay in the `/` list with Vietnamese descriptions (hiding one let Enter pick a skill and send it to the agent). `/changelog` shows Piagent's latest release notes instead of Pi's.
363
- - A company header replaces Pi's startup header and the "Model scope: agent-watch-auto (Ctrl+P to cycle)" line: team, Harness main model and effort, review model, Ask first or Bypass, Fast, memory, release.
364
- - The footer shows the Harness's main model and effort before the first run (it said "medium" while the Harness ran xhigh) and no USD cost.
365
- - While `ask_user` waits for the member, the loader reads "Đang chờ bạn trả lời" instead of "Working".
366
- - The plan is drawn as a checklist with each step (☑ done, ☐ open, ⊘ deferred) instead of "Plan updated: 1/3 steps completed". Personal `pi` is unchanged.
367
+ - A company header shows team, Harness model and effort, review model, Ask first or Bypass, Fast, memory and release.
367
368
 
368
- ### Fixes
369
+ ### Improved
369
370
 
370
- - Stop while a command runs no longer breaks the next message. Stop used to renew the run's token once more after the tool was cancelled, then close the run, and close it again without its report when that failed. With Agent Studio 0.28.1 and Agent Watch 0.15.7 / Windows 0.1.14, a stopped request ends before renewing, a close Studio could not confirm is not sent again, and the next message starts a new run instead of failing with `managed-broker:serverUnavailable`.
371
+ - `/login`, `/model`, `/thinking`, `/settings` and their keys say the team's Harness decides instead of opening Pi's pickers.
372
+ - The footer shows the Harness's real model and effort with no USD cost, and the plan is drawn as a checklist.
373
+ - `/changelog` shows Piagent's release notes, and the loader reads “Đang chờ bạn trả lời” while a question waits.
371
374
 
372
- ### Tests
375
+ ### Fixed
376
+
377
+ - Stopping a turn while a command ran could break the next message; with the required Studio and Watch, the next message now starts a new run.
378
+
379
+ ### Security
380
+
381
+ - `/share` and `/bug` are refused in the company Terminal, since both sent company conversations and code outside the company.
373
382
 
374
- - New cases in `tests/terminal-parity.test.mjs` and `tests/managed-agent-skills.test.mjs`; checked in the real TUI through a pty.
375
- - `tests/managed-failures.test.mjs`: Stop during a real sandboxed command sends no renew; a close Studio cannot confirm is not sent again, and the next turn works.
383
+ Requires: Agent Studio 0.28.1, Agent Watch 0.15.7 (Windows 0.1.14) for the Stop fix.
376
384
 
377
385
  ## v1.28.3 - 2026-10-18
378
386
 
379
- Agent Watch updating itself no longer breaks `piagent studio` for a minute.
387
+ **Agent Watch self-updates no longer break the company Terminal.** Right after Agent Watch updates itself on macOS, `piagent studio` and the dashboard wait for the new setup instead of failing for about a minute.
380
388
 
381
- ### Fixes
389
+ ### Fixed
382
390
 
383
- - Right after Agent Watch updates itself (Sparkle replaces the app), the broker's hash differs from the company binding until Watch writes it again (46–71 s after launch on 0.15.6), and `piagent studio` failed with `managed-launch-binding-changed`. When only the broker's hash differs and the broker is still Agent Watch's own executable (bundle id and `CFBundleExecutable` checked, macOS only), replaced after the binding was written, `piagent studio` and the dashboard now wait for the new binding as they do after a Piagent update; every pinned path and hash is checked again first.
391
+ - `piagent studio` failed for up to a minute after Agent Watch updated itself; it now waits for the new setup and runs.
384
392
 
385
- ### Tests
393
+ ### Security
386
394
 
387
- - New cases in `tests/managed-binding-wait.test.mjs`.
395
+ - The wait applies only when the changed file is still Agent Watch's own app, and every pinned path and hash is checked again first.
388
396
 
389
397
  ## v1.28.2 - 2026-10-18
390
398
 
391
- No more "managed-launch-binding-changed" right after an update.
399
+ **No setup error right after a Piagent update.** After a Piagent update, `piagent studio` waits up to 90 seconds for Agent Watch to rewrite the company setup instead of failing at once.
392
400
 
393
- ### Fixes
401
+ ### Improved
394
402
 
395
- - Right after a Piagent update, `piagent studio` no longer fails with `managed-launch-binding-changed` while Agent Watch has not rewritten the company binding yet. When only the launcher's hash differs and the launcher was installed after the binding, it waits up to 90 s for the new binding ("Agent Watch đang cập nhật cấu hình…", or "Agent Watch không chạy" when the app is not open) and then runs on it; every pinned path and hash is checked again first. Any other difference still fails at once. The dashboard's company start waits as long.
396
- - When the wait runs out, the reason says whether Agent Watch is running (`managed-binding-update-pending`, `managed-binding-watch-not-running`). The update notes in the Terminal and the dashboard no longer tell members to import the configuration again by hand.
403
+ - While waiting it says “Agent Watch đang cập nhật cấu hình…”, or that Agent Watch is not running; the dashboard waits as long.
404
+ - Update notes in the Terminal and the dashboard no longer tell members to import the configuration again by hand.
397
405
 
398
- ### Tests
406
+ ### Fixed
399
407
 
400
- - `tests/managed-binding-wait.test.mjs`, a new case in `tests/managed-dashboard-launch.test.mjs`.
408
+ - `piagent studio` failed right after an update while Agent Watch had not rewritten the setup; it now waits, rechecks every hash and runs.
401
409
 
402
410
  ## v1.28.1 - 2026-10-18
403
411
 
404
- The company Terminal and personal Pi stop stepping on each other.
412
+ **Company Terminal and personal Pi stop stepping on each other.** Personal Pi starts again when Piagent was loaded twice, old company entries are cleaned up, and company conversations stay in the company Terminal.
405
413
 
406
- ### Fixes
414
+ ### Improved
407
415
 
408
- - Personal Pi no longer refuses to start when Piagent is loaded twice. An extension path into another Piagent copy (beside the Piagent Pi package) registered every Piagent tool twice ("Tool … conflicts with …") and `pi` exited without an answer. `piagent-update` and the installer now remove such entries, with a backup; `piagent-doctor` reports them as an error.
409
- - Old Agent Watch company entries in personal Pi are cleaned up once the machine has a managed company binding: the `agent_watch_*` providers (a direct key read from Agent Watch), a default model or model list that names them, and the old session-header extension. They sent personal Pi to Studio outside the team's Harness, or failed. The member's own settings, models and packages stay; every changed file is backed up first.
410
- - `piagent-update --check` reports the installed Pi package version and any personal Pi conflict, instead of "Everything is on the target release" while the package was older.
411
- - Personal Pi refuses to continue a company conversation (one in Agent Watch's store or carrying its run entries): it would have gone on with personal models, keys and settings. It says to open it with `piagent studio --project <folder>` and `/resume`.
412
- - The company Terminal says how to reopen a conversation with `piagent studio --project <folder>` and `/resume` when it closes, instead of Pi's `pi --session-dir …`.
413
- - `/help` in the company Terminal lists its commands and shortcuts without a model request (it used to go to the agent, which even started a review).
414
- - Stopping `piagent` from outside (a script, an editor, a timeout) stops the company run under it too; it used to keep running in the background.
416
+ - `piagent-update --check` reports the installed Pi package version and any personal Pi conflict.
415
417
 
416
- ### Tests
418
+ ### Fixed
417
419
 
418
- - `tests/personal-pi-config.test.mjs`, new cases in `tests/terminal-parity.test.mjs` and `tests/update-global.test.mjs`.
420
+ - Personal `pi` exited without an answer when Piagent was loaded twice; `piagent-update` and the installer now remove the duplicate, with a backup.
421
+ - Old Agent Watch company providers and models in personal Pi are removed once a company binding exists; your own settings stay.
422
+ - Personal Pi refuses to continue a company conversation and says to open it with `piagent studio --project <folder>` and `/resume`.
423
+ - `/help` in the company Terminal lists commands locally instead of going to the agent, which even started a review.
424
+ - Stopping `piagent` from a script, editor or timeout now stops the company run under it instead of leaving it running.
419
425
 
420
426
  ## v1.28.0 - 2026-10-17
421
427
 
422
- Team memory lifecycle v2: every round reaches memory once, the brief comes back after compaction, and observed check recoveries are kept.
428
+ **Team memory v2: each round once, brief restored after compaction.** Each company round reaches team memory exactly once, the brief returns after compaction, and observed check recoveries are kept.
423
429
 
424
- ### Features
430
+ ### Added
425
431
 
426
- - With Agent Studio 0.28.0, each company round has a stable event ID, its time and its key, written to a private per-Studio/key outbox before it is sent; a lost acknowledgement, a crash or two sessions at once never extract a round twice, and a round is never sent under another key. Retries back off and stop after 30 attempts or 30 days. Older JSONL outboxes are left untouched.
427
- - After a successful compaction the agent gets a fresh brief for the latest request before its next model call, and the conversation keeps exactly one brief.
428
- - A round also carries up to three observed check recoveries (a check that failed, a change, the same check passing; redacted, with both tool calls), never a guessed cause, a rerun alone, a narrowed or skipped test run.
429
- - Counters per round (brief, searches, pages, helper searches, lessons, outbox retries) go to Studio for its System page; never a prompt or tool output.
432
+ - After a compaction the agent gets a fresh brief for the latest request, and the conversation keeps exactly one brief.
433
+ - A round carries up to three observed check recoveries (fail, change, pass), redacted, never a guessed cause.
430
434
 
431
- ### Fixes
435
+ ### Improved
432
436
 
433
- - A brief that comes back empty, or fails, is not asked again every round of the same context (30 and 5 minutes; compaction asks again).
434
- - Closing a round (backlog, retain, counters) stays within 4.5 seconds when the memory engine does not answer.
435
- - On an Agent Studio 0.27.x, rounds still go to memory in the old body, so either release order keeps memory growing.
437
+ - Rounds are queued on disk before sending, so a lost reply, a crash or two sessions never record a round twice or under another key.
438
+ - On Agent Studio 0.27.x rounds still reach memory, so either release order keeps memory growing.
436
439
 
437
- ### Tests
440
+ ### Fixed
438
441
 
439
- - `tests/managed-memory-outbox.test.mjs`, `tests/managed-memory-context.test.mjs`, `tests/managed-memory-lessons.test.mjs`, and new cases in `tests/managed-team-memory.test.mjs`: durable outbox and claims, compaction refresh and branch entry IDs, lesson evidence rules, empty/failed brief pause, v1 body, close budget.
442
+ - An empty or failed brief is no longer requested again every round, and closing a round waits at most 4.5 seconds.
440
443
 
441
- ## v1.27.1 - 2026-10-17
444
+ Requires: Agent Studio 0.28.0.
442
445
 
443
- Team memory keeps working while the agent runs: commits and memory searches no longer fail beside a model request.
446
+ ## v1.27.1 - 2026-10-17
444
447
 
445
- ### Fixes
448
+ **Team memory keeps working while the agent calls the model.** Commits and memory searches made beside a model request no longer fail, so a repository's commits reach team memory again.
446
449
 
447
- - Every model request renews its role's run token and voids the one before, so the commits sent right after the brief, and a `memory_search` made beside a request, went out on a dead token and Studio refused them (401): in a real company conversation the repository's commits never reached memory. A memory call Studio refuses this way now renews the token (shared with that role's requests, as web search does) and asks once more. Found in the acceptance run on Agent Studio 0.27.1 (0.27.0 was withdrawn).
450
+ ### Fixed
448
451
 
449
- ### Tests
452
+ - Memory calls made beside a model request were refused on an expired token; they now renew the token and retry once.
450
453
 
451
- - `tests/managed-team-memory.test.mjs`: a memory call on a voided token asks again once with a renewed one, and a token that stays refused is not asked forever.
454
+ Requires: Agent Studio 0.27.1.
452
455
 
453
456
  ## v1.27.0 - 2026-10-17
454
457
 
455
- Team memory: company agents remember what the team settled in each repository.
458
+ **Team memory: company agents remember what the team settled.** With team memory on, a new company conversation opens with a short brief of the repository's decisions, rules and work in progress.
459
+
460
+ ### Added
456
461
 
457
- ### Features
462
+ - New company conversations open with a brief from the team's memory of the repository, kept in the conversation for the prompt cache.
463
+ - Each round (your words, the final answer, changed files; never tool output) goes back to memory redacted, and new commits once.
464
+ - The main agent gets `memory_search` and `memory_page`; helpers get a read-only `memory_search`.
458
465
 
459
- - With Agent Studio 0.27.0 and team memory turned on for the team, a new company conversation opens with a short brief from the team's memory of the repository (decisions, rules, work in progress from earlier conversations and commits), kept in the conversation so the prompt cache holds. Every round goes back to memory on the run's token before the run closes (the member's words, the final answer, the files changed; never tool output), redacted; new commits are sent once when HEAD moved.
460
- - `memory_search` and `memory_page` for the main agent, and a read-only `memory_search` for helpers (scout, research, verify, review) on their own run token, once Studio has answered memory on this Mac.
461
- - Memory never fails or slows a turn: every call is bounded, a round Studio did not take waits in a small outbox and goes with the next round, and a Studio or team without memory (204/404) means no memory traffic for 30 minutes and no memory tools.
466
+ ### Improved
462
467
 
463
- ### Tests
468
+ - Memory never fails or slows a turn: calls are bounded, and a team without memory gets no memory traffic or tools.
464
469
 
465
- - `tests/managed-team-memory.test.mjs`: the brief opens a conversation and stays once, rounds and commits go back on the run token, the outbox drains after an outage, 204/404 turn memory off, a folder without an origin remote sends nothing, a helper searches on its own token and never writes.
470
+ Requires: Agent Studio 0.27.0 with team memory turned on.
466
471
 
467
472
  ## v1.26.1 - 2026-10-16
468
473
 
469
- A conversation is renamed while its turn runs.
474
+ **Rename a conversation while its turn runs.** Renaming a conversation mid-turn now takes effect, and a rename, fork or archive that fails says why in words.
470
475
 
471
- ### Fixes
476
+ ### Improved
472
477
 
473
- - Renaming a conversation from its menu while a turn ran (a company conversation in particular) showed `session-revision-stale` and kept the old name: the turn changes the conversation after every step, and the Gateway refused a rename while busy. The rename now lands mid-turn, the dashboard sends it again against the conversation as it is now, and a rename, fork or archive that still fails says why in words, with the code at the end.
478
+ - A rename, fork or archive that still fails explains why in words, with the code at the end.
474
479
 
475
- ### Tests
480
+ ### Fixed
476
481
 
477
- - `tests/managed-rename-web.test.mjs`: a company conversation is renamed from its menu while idle and while its turn runs, then with `/name`, and the name survives a reload.
482
+ - Renaming a conversation from its menu during a turn showed an error and kept the old name; the rename now lands mid-turn.
478
483
 
479
484
  ## v1.26.0 - 2026-10-15
480
485
 
481
- Company conversations work the way a developer works in an editor: the Terminal's `/` commands and shortcuts in the dashboard, `/undo` for the agent's last turn, dev servers that stay up across turns, type errors right after an edit. The Harness is now tested where it runs.
486
+ **Dashboard `/` commands, `/undo` and dev servers across turns.** Company conversations gain Terminal-style `/` commands in the dashboard, `/undo` for the last turn, long-running dev servers and instant type errors.
482
487
 
483
- ### Changes
488
+ ### Added
484
489
 
485
- - Dashboard `/` commands, run in the dashboard and never sent to the model: `/new`, `/fork`, `/name`, `/pin`, `/archive`, `/stop`, `/thinking`, `/model` and `/permission` (personal), `/undo`, `/fast` and `/bypass` (company), `/changes`, `/settings`, `/help`. Full access and Bypass still ask for confirmation. Shortcuts: ⌘⇧O new chat, ⌘/ the `/` commands, Esc stops the running turn.
486
- - `/undo` (company Terminal and dashboard): the files the agent's last turn changed go back, one turn at a time; it refuses while a turn runs and when a file was changed again since, and never touches the member's index, HEAD or commits. Git repositories only.
487
- - `start_process`, `process_output`, `stop_process` (macOS): a dev server, watcher or local service runs across turns in the plain sandbox, without network, until stopped, the conversation closes or 4 hours pass.
488
- - After a write or edit of a TypeScript or JavaScript file the agent gets that file's errors from the project's own TypeScript (5 and 6 through a language service, 7 through its native `tsc`); a syntax error elsewhere that stops `tsc` is named instead of reported as clean.
489
- - `piagent studio --prompt <text> --json` writes the event stream of `pi --mode json`.
490
- - A message sent from another tab while a turn runs waits for that turn instead of being refused.
491
- - The prompt and `run_with_network` no longer send end-to-end tests to approval on macOS: Playwright's Chromium runs in the plain sandbox against a server on the Mac.
492
- - Ready for Pi 1.2.0 (the pin stays 0.87.1): `@earendil-works/pi-ai` is found where Pi 1.x hoists it, the sandbox reads it there, and Pi 1.x's error results read as the failures they are.
490
+ - Dashboard `/` commands such as `/new`, `/fork`, `/undo`, `/fast` and `/bypass` run locally, plus ⌘⇧O, ⌘/ and Esc shortcuts.
491
+ - `/undo` restores the files the agent's last turn changed, one turn at a time, without touching your index, HEAD or commits.
492
+ - On macOS a dev server or watcher started by the agent keeps running across turns in the sandbox, for up to 4 hours.
493
+ - After editing a TypeScript or JavaScript file, the agent gets that file's errors from the project's own TypeScript.
494
+ - `piagent studio --prompt <text> --json` writes the same event stream as `pi --mode json`.
493
495
 
494
- ### Fixes
496
+ ### Fixed
495
497
 
496
- - A test's own localhost server blocked while a local proxy listens printed only `fetch failed`; the agent is now told to use `run_with_network`.
497
- - `gh` and SSH without a sign-in in the sandbox no longer point the agent at `gh auth login`; they name `run_on_host`.
498
- - `fetch_origin` stopped a repository with many branches after 60 seconds (a team repository of 92 branches takes about two minutes) and failed with `managed-repository-fetch-failed`; the download now has ten minutes.
499
- - A turn cut off after a check had passed (the next model request interrupted) reported "no check passed on the final code"; the passed check now counts. A failed `fetch_origin` names `run_on_host` as the way on. `E401` and `ENEEDAUTH` are matched as whole words.
498
+ - Fetching a repository with many branches stopped after 60 seconds; the download now has ten minutes.
500
499
 
501
- ### Tests and documentation
500
+ ## v1.25.0 - 2026-10-13
502
501
 
503
- - The end-to-end Harness tests skipped wherever the Pi host was not under `~/.pi/npm-global`, CI included; they now find it in the npm global root. `docs/harness-conformance.md` maps every Harness setting to who enforces it and the tests that prove it, and a test keeps that page true.
504
- - `docs/company-dev-commands.md`: what runs in a company session without asking, what names its approval, the dashboard commands and the headless mode.
502
+ **When the machine lacks something, the agent asks and then runs.** A company conversation no longer gives up on a missing runtime, sign-in or stopped Docker: the agent asks for approval and carries on.
505
503
 
506
- ## v1.25.0 - 2026-10-13
504
+ ### Added
507
505
 
508
- A company conversation no longer gives up when the machine lacks something: the agent asks for the approval that makes the command run, and once the member approves it runs, outside the sandbox when it has to.
506
+ - `run_on_host` runs one approved command on your machine outside the sandbox, such as installing a runtime or `git push`; it always asks.
507
+ - `start_docker` asks to start an installed but stopped Docker and waits for it, so `run_with_docker` works in the same conversation.
509
508
 
510
- ### Changes
509
+ ### Improved
511
510
 
512
- - `run_on_host`: one command the member approves runs on their machine, outside the sandbox, as them (their files, Keychain and sign-ins), for what the sandbox blocks and no other tool covers: installing a runtime the project needs (`brew install openjdk@21`, `brew install node@22`), `git pull`/`git push` with the member's sign-in, a private registry, a file outside the project. It always asks, Bypass included, and says what Bypass would still have asked about. It runs in a login shell without Piagent's own environment and with no input; a command that needs the member's password (`sudo`, an installer) or an interactive sign-in is not run: the agent asks the member with `ask_user` (the exact steps, "done, continue" or "skip") and carries on after the answer. What it installed is looked up again at once, so a JDK installed through Homebrew (`openjdk@N`, which macOS does not list) is the next command's `JAVA_HOME`.
513
- - `start_docker`: when Docker is installed but not running, the agent asks to start it (Docker Desktop, OrbStack, Rancher Desktop or Colima on macOS; Docker Desktop from WSL; rootless Docker or Podman on Linux) and waits until the engine answers; `run_with_docker` then works in the same conversation. Bypass starts it without asking. Before, a conversation opened while Docker was off had no `run_with_docker` until a new conversation, and an engine that stopped answering ended the turn with "tell the member".
514
- - `run_with_docker` is offered whenever the Docker CLI is installed; a stopped engine (Docker Desktop leaves its socket file behind) is found before anything is asked.
515
- - Every sandbox failure now names the way on instead of "report it and stop": a missing runtime or wrong version (`Unable to locate a Java Runtime`, `command not found`, `invalid target release`, Node `engines`) → `run_on_host` to install it; the member's sign-in (`could not read Username`, `Permission denied (publickey)`, `E401`, a private image) → `fetch_origin` or `run_on_host`; a blocked write outside the project or Keychain → `run_on_host`; Docker stopped → `start_docker`; a host the approved network still cannot reach (VPN, offline) → a question to the member. The Harness check request and the process prompt ask for that approval instead of telling the agent not to install or start anything.
516
- - `fetch_origin` takes `path`, the repository folder inside the conversation folder, for a workspace folder that holds several repositories; a folder that is not a repository says so and names `path`.
511
+ - Every sandbox failure names the way forward instead of “report it and stop”.
512
+ - Steps only you can do, such as a `sudo` password or an interactive sign-in, are asked with the exact steps and “done, continue” or “skip”.
517
513
 
518
- ### Fixes
514
+ ### Fixed
519
515
 
520
- - A turn that only read repositories through `git -C <folder> …` (status, log, reflog, `remote -v`, rev-list…) in a folder that is not itself a repository was counted as a code change, so the Harness asked for checks three times on a turn that changed nothing. Git's options before the command are read now, and `./mvnw … compile`/`package` and `./gradlew build` count as checks.
521
- - `wget: Failed to fetch` (how `./mvnw` downloads its Maven) is read as a blocked download and points to `run_with_network`, instead of a bare exit code.
516
+ - A turn that only read repositories with `git -C` was counted as a code change and asked for checks three times.
522
517
 
523
518
  ## v1.24.0 - 2026-10-13
524
519
 
525
- Fast mode can be chosen when a company conversation starts, and the switch is easier to see.
520
+ **Choose Fast when a company conversation starts.** The new chat page offers a Fast switch when the team's Harness allows it, and the switch turns amber while on.
521
+
522
+ ### Added
526
523
 
527
- ### Changes
524
+ - “Fast: tắt / Fast: bật” next to the company model makes a new conversation run Fast from its first message.
528
525
 
529
- - The new chat page shows "Fast: tắt / Fast: bật" next to the company model when the team's Harness in Agent Studio allows fast mode. A conversation created with it on is on Fast before its first message runs (`session.create` carries `fast: true`); a Harness that does not allow it refuses the create with the company-policy message. Before, the switch appeared only in the header of a conversation that already existed.
530
- - The Fast switch in a conversation's header turns amber while on, so a member sees at a glance that its calls count 2.5 times toward the quota.
526
+ ### Improved
527
+
528
+ - The Fast switch in the header turns amber while on, since its calls count 2.5 times toward the quota.
531
529
 
532
530
  ## v1.23.1 - 2026-10-13
533
531
 
534
- An agent's question waits at the end of the conversation, right above the composer, and is easier to read.
532
+ **Agent questions wait at the end of the conversation.** Questions and approvals now sit right above the composer, so a long turn no longer pushes them out of view.
533
+
534
+ ### Improved
535
+
536
+ - The question card has larger text and roomier options, and “Let the agent decide” no longer outweighs “Send answer”.
535
537
 
536
- ### Fixes
538
+ ### Fixed
537
539
 
538
- - A question or approval request was drawn above the running turn, so a long turn pushed it out of view: opening a conversation that waited on the member showed its activity, not the question. Questions and approvals now come last in the conversation, right above the composer, and the page goes to them when one comes up or the conversation opens with one waiting.
539
- - The question card reads more easily: larger question and option text, roomier options, the chosen option's number filled in. In the light theme "Let the agent decide" is an outline button instead of a black one that outweighed "Send answer".
540
+ - A long turn pushed a waiting question out of view; questions now come last and the page scrolls to them.
540
541
 
541
542
  ## v1.23.0 - 2026-10-13
542
543
 
543
- Fast mode for company conversations where the Harness allows it, failed tool calls reported to Agent Studio, and new company conversations that send their first message again after a Harness change.
544
+ **Fast mode for company conversations, tool failures sent to Studio.** Where the Harness allows it, a Fast switch gets faster GPT answers at 2.5× quota, and failed tool calls are reported to Agent Studio.
545
+
546
+ ### Added
547
+
548
+ - Fast mode via the dashboard switch or `/fast on|off|status`: same GPT model and thinking, faster, tokens counted 2.5 times.
549
+ - Failed tool calls in company runs are reported to Agent Studio with secrets redacted and no prompts.
550
+
551
+ ### Improved
544
552
 
545
- ### Changes
553
+ - On Claude or API-key models Fast adds nothing, and a refused fast request falls back to standard speed with a note.
546
554
 
547
- - Fast mode for company conversations, where the team's Harness in Agent Studio allows it. The dashboard shows a Fast switch in the conversation's header and the Terminal has `/fast on|off|status`; a conversation starts with it off and keeps the member's choice. While on, the main agent's calls ask a GPT (Codex) model for the priority service tier: the same model and thinking level, answered faster, with tokens counted 2.5 times toward the key's quota by Studio. Subagents run as usual. Only the GPT models OpenAI documents for Fast get the tier: on a Claude model (whose fast mode is another protocol, billed outside a subscription) or an API-key vendor model, nothing is added and the turn runs at standard speed. A fast request that Studio or the provider refuses is asked again once without the tier, and the conversation goes back to standard speed with a note, instead of failing the turn. Without the Harness setting there is no switch, and Studio refuses the tier. Needs a Studio with migration 048 and an Agent Watch that carries the Harness's `fast_mode`.
548
- - A tool call that fails in a company run is reported to Agent Studio (Logs → "Tool lỗi"), so an administrator can read why Docker, a network command or a test failed on a member's machine: the tool, a code, the command or path, the start and end of the error output, the OS and whether the machine has a Docker engine. Secrets are redacted and the home folder is written `~` before anything is sent; no prompt, search query or subagent brief is sent, and a tool the member stopped or declined is not reported. Needs a Studio with migration 047; an older Studio is asked once and not again.
555
+ ### Fixed
549
556
 
550
- ### Fixes
557
+ - After an admin changed the Harness, a new company conversation never sent its first message; it now starts at an allowed level.
551
558
 
552
- - After an administrator changed a team's Harness in Studio (for example the main agent from thinking level high to a fixed max), a new company conversation from the dashboard was created but its message was never sent, under the notice “Pi received the request and the session is resyncing. Do not resend it”. The new chat page still offered the levels of the Harness before; the runtime took the nearest level the new Harness allows, and the dashboard treated that difference as a create it could not confirm. A company conversation now starts at the level its Harness allows.
559
+ Requires: An Agent Studio and Agent Watch that support the Harness Fast setting.
553
560
 
554
561
  ## v1.22.1 - 2026-10-12
555
562
 
556
- A project on a slow file system (a Windows drive seen from WSL) no longer leaves the dashboard loading.
563
+ **Dashboard no longer hangs on a slow file system.** A project on a Windows drive seen from WSL no longer leaves the dashboard stuck on “Opening Piagent…”.
557
564
 
558
- ### Fixes
565
+ ### Improved
559
566
 
560
- - On Windows the dashboard could open and keep showing “Opening Piagent…”. The project was on a Windows drive seen from WSL (`/mnt/d/…`), where Git walks the tree through a slow file system. The company Gateway ran that scan synchronously and without a limit, so it answered nobody meanwhile; the dashboard waited for it, also without a limit, for its conversation list, its live state and its new-chat options. The dashboard now gives a read of the company Gateway 15 seconds, counts the company runtime as connected only once a read is answered, and after a missed read shows its own conversations without the company ones and asks again a minute later. The company entry says the company runtime runs but does not answer, with what to do.
561
- - A conversation's page gives Git 8 seconds per repository to list the changed files. A repository that takes longer is shown without its changed files and tried again 5 minutes later, instead of stopping the Gateway for every conversation. Completion checks still wait for Git as before.
567
+ - On Windows, keep projects in the Ubuntu file system (`~/projects`); under `/mnt/c` or `/mnt/d` they work but stay slow.
562
568
 
563
- Keep projects in the Ubuntu file system (`~/projects`) on Windows: a project under `/mnt/c` or `/mnt/d` works but stays slow.
569
+ ### Fixed
570
+
571
+ - On Windows the dashboard could stay on “Opening Piagent…”; it now waits 15 seconds for the company runtime and opens anyway.
572
+ - Git gets 8 seconds per repository to list changed files; a slower one is shown without them and retried after 5 minutes.
564
573
 
565
574
  ## v1.22.0 - 2026-10-09
566
575
 
567
- Attach any source or text file, as coding agents do; a message with files shows once, as typed.
576
+ **Attach any source or text file.** Any text file can be attached under its own name, binaries are refused up front with an alternative, and messages with files show once.
568
577
 
569
- ### Changes
578
+ ### Added
570
579
 
571
- - Attach any source or text file, as coding agents do: `.html`, `.css`, `.js`/`.ts`/`.tsx`, `.py`, `.go`, `.java`, `.sql`, `.xml`, `.svg`, `.toml` and any other extension, plus files without one (`Dockerfile`, `Makefile`, `LICENSE`). They are sent as text under their own name, so the model sees `index.html`; the host still checks the bytes are text and refuses a binary in disguise. The file picker offers every file. Binary formats are refused before the upload with what to send instead: spreadsheets → export to .csv, slide decks → .pdf, old Word formats → .docx/.pdf/.txt, archives, media and fonts → keep them in the project for the agent's tools.
580
+ - Attach `.html`, `.css`, `.ts`, `.py`, `.go`, `.sql` and any other text file, including `Dockerfile` or `Makefile`, under its own name.
572
581
 
573
- ### Fixes
582
+ ### Improved
574
583
 
575
- - A message sent with a text file or document from the dashboard showed twice once its turn ended: once as raw text with the file's contents between `BEGIN/END PIAGENT-ATTACHMENT` lines, once as the tidy bubble with the file card. The Gateway joins the typed text and the files into one block, which the transcript did not split. It now reads the fenced files out of that block as cards and shows only what was typed.
576
- - On the new chat page a binary file (a .zip, a video) is refused by name as it is added, not after the conversation is created.
584
+ - Binary formats are refused before upload with what to send instead, such as .csv for spreadsheets or .pdf for slide decks.
585
+
586
+ ### Fixed
587
+
588
+ - A message with a file showed twice after its turn, once with the raw file contents; now only your text and the file card show.
577
589
 
578
590
  ## v1.21.1 - 2026-10-09
579
591
 
580
- Bypass can be turned on while a turn runs, and it stays on.
592
+ **Turn on Bypass while a turn runs, and it stays on.** A company conversation can switch between Ask first and Bypass at any time, and the next commands follow the new choice.
581
593
 
582
- ### Fixes
594
+ ### Improved
583
595
 
584
- - Turning on Bypass while a command waited for your approval did not take: the Gateway refused to change access while a turn ran, and the error showed in a panel that had just closed, so the switch looked done and a reload showed Ask first. A company conversation now switches between Ask first and Bypass at any time, also mid-turn; access is read at each command, so the next commands follow the new choice. A command already waiting keeps its card (Allow or Deny). The result of a switch shows in a notice at the top.
596
+ - A command already waiting keeps its Allow or Deny card, and the result of a switch shows in a notice at the top.
597
+
598
+ ### Fixed
599
+
600
+ - Turning on Bypass while a command waited for approval looked done but did not take; it now applies mid-turn and is kept.
585
601
 
586
602
  ## v1.21.0 - 2026-10-09
587
603
 
588
- The agent's questions and approvals come one card at a time, other conversations announce when they finish or wait for you, and Studio logs each context compaction.
604
+ **Decisions one card at a time, alerts from other conversations.** Questions and approvals show one card at a time, other conversations announce when they finish or wait for you, and Studio logs compactions.
589
605
 
590
- ### Changes
606
+ ### Added
591
607
 
592
- - What waits for you comes one card at a time. A conversation's questions and approval requests no longer stack down the page: one card shows, with steps above it ("Việc cần bạn quyết · 1/3") that say who asks (main agent or a subagent role), what kind (Hỏi / Duyệt) and let you jump to another. The main agent's come first, since its answer shapes its subagents' work; then subagents in work order (scout, research, verify, review); within one agent, what was asked first. Answering one brings up the next.
593
- - Several conversations at once: a toast at the top right says when another conversation finishes a turn (Xong), fails or stops, or starts waiting for your answer or approval; "Mở" opens it. A finished turn fades after a few seconds; a waiting decision stays until it is answered or opened. In the sidebar, a conversation waiting for you glows amber and reads "Cần bạn trả lời" or "Cần duyệt", one that finished while you were elsewhere reads "Xong · chưa xem" until you open it, and they move to the top of "Đang chạy · cần chú ý". The tab title counts what waits, e.g. "(2) Piagent". Before, a conversation waiting on a question showed only "Đang chạy"; the Gateway now marks it, so a page opened later still knows.
594
- - Studio logs each context compaction of a company conversation. The summary calls carry `X-Agent-Compaction` (`<id>;<reason>;<part>`, reason `threshold`, `overflow` or `manual`), and the main agent's next call carries `X-Agent-Compacted` (`<id>;<reason>;<done|failed|aborted>;<tokens before>;<tokens after>;<ms>`, Pi's own counts). Logs → Lượt agent shows "Compact context 244k → 34k · context chạm ngưỡng · 2 lượt tóm tắt". No summary text leaves the machine. Needs Studio with migration 046; an older Studio ignores the headers.
608
+ - A toast says when another conversation finishes, fails, stops or waits for you, and “Mở” opens it.
609
+ - The sidebar marks conversations waiting for you or finished unseen, and the tab title counts what waits.
610
+ - Studio logs each context compaction of a company conversation with its reason and size before and after; no summary text is sent.
611
+
612
+ ### Improved
613
+
614
+ - Questions and approvals show one card at a time with steps such as “Việc cần bạn quyết · 1/3”, main agent first.
595
615
 
596
616
  ## v1.20.0 - 2026-10-09
597
617
 
598
- Package installs in the company sandbox no longer ask; a long subagent no longer gets its turn stopped; the review subagent reads work committed in earlier turns.
618
+ **Package installs in the company sandbox no longer ask.** Plain commands reach the usual package registries through a restricted proxy, long subagents keep running, and review reads earlier commits.
619
+
620
+ ### Added
621
+
622
+ - Installs from npm and other common registries run without approval through a proxy that allows only those hosts.
599
623
 
600
- ### Changes
624
+ ### Improved
601
625
 
602
- - Company sandbox: package installs from the usual registries no longer ask. A plain command reaches npm, PyPI, the Go proxy, crates.io, Maven Central, Gradle, Google's Maven, NuGet, RubyGems, Packagist, pub.dev, CocoaPods, Hex and public GitHub downloads (release assets, such as the Gradle Wrapper's distributions, and git dependencies) through a proxy that Piagent runs outside the sandbox. The proxy allows only those hosts (and the member's additions in `~/.piagent/sandbox-domains`, one host or `*.domain` per line), on ports 443 and 80, and never an IP address or a name that resolves to this machine or a private network. Any other host is refused, and the command's failure names it and points to `run_with_network`, which still asks. Registry credentials stay out of the sandbox. Subagents that only read keep no network. `piagent studio --doctor` checks npm through the proxy.
603
- - Bypass runs `run_with_docker` without asking, like `run_with_network`. It no longer asks about containers that mount folders outside the project or run privileged. Only what Bypass asks for any command still asks: pushes, deploys, registry logins, and deletes whose target is known only at run time.
604
- - Maven and Gradle use the proxy too: the JVM gets the proxy settings, and Maven, which reads its proxy only from `settings.xml`, gets a settings file in the sandbox's own home. A live check ran `./mvnw test` and `./gradlew test`, each downloading its distribution, plugins and JUnit through the proxy, and the next conversation ran `./mvnw -o test` offline from the project's cache.
626
+ - Add your own registry hosts in `~/.piagent/sandbox-domains`, one per line; registry credentials stay out of the sandbox.
627
+ - Bypass runs `run_with_docker` without asking; pushes, deploys, registry logins and unclear deletes still ask.
605
628
 
606
- ### Fixes
629
+ ### Fixed
607
630
 
608
- - A subagent that worked longer than 15 minutes (a verify running a long test suite while the main agent waited) was stopped with `managed-helper-cancelled`, and the turn ended with "Request was aborted". The dashboard stops a turn after 15 minutes without an event, and a working subagent sent none. While a subagent runs, the turn now sends a beat every minute. A turn is still limited to 6 hours, and each of the subagent's commands has its own time limit.
609
- - The review subagent said "no patch" when asked to review work committed in earlier turns: it read only the change since the turn began, which was nothing. It now takes `since` (a commit, a branch or `HEAD~N`) and reads the commits after it plus anything not committed yet. When the turn has changed nothing, it reads the branch's commits since it left the default branch (or, on the default branch, its unpushed commits). A `since` that HEAD does not descend from is refused with the reason. The review the harness requires still reads the turn's own change.
631
+ - A subagent working longer than 15 minutes was stopped and the turn aborted; it now keeps running.
632
+ - The review subagent said “no patch” for work committed earlier; it now reads commits since a given commit, branch or `HEAD~N`.
610
633
 
611
634
  ## v1.19.0 - 2026-10-08
612
635
 
613
- A company task with a checklist is carried to its end, every turn says how it ended, Docker in the company sandbox, and folders that hold several repositories.
636
+ **Checklist tasks carried to the end, Docker in the company sandbox.** The Harness carries a checklist task to its end, every turn says how it ended, Docker is available for approved commands, and multi-repo folders work.
614
637
 
615
- ### Changes
638
+ ### Added
639
+
640
+ - When the Harness requires a plan, it sends the agent on to the next open checklist step until done, stopped or stalled.
641
+ - Every company turn ends with a status line such as “Hoàn thành · n/n bước”, with Continue when the task is not finished.
642
+ - `run_with_docker` runs one approved command with internet and Docker, for test databases, builds or container tests.
643
+ - A folder holding several repositories shows “N repo”, with each repository's branch and changed files.
616
644
 
617
- - When the main agent ends its turn while its checklist still has open steps (it often stops between the items it was asked for: "STEP06 done, STEP07 next") and the team's Harness requires a plan, the harness sends it on to the next open step as a new run, as if the member had sent "continue": each round gets its own subagents, checks and review. It stops when every step is completed, when the member stops it or writes, when a round fails, after 2 rounds in a row that finish no step and change no code, or after 30 rounds. The model is told to ask with `ask_user` when it cannot go on without the member, and to put every item the member asked for in the checklist. Studio logs these rounds as "Harness cho làm tiếp" (`X-Agent-Purpose: continue`).
618
- - A checklist step can be marked `deferred` (left for later at the member's word, or no longer needed). The agent is told never to mark completed a step it did not do: in a live run where the member said to stop after STEP02, the model had marked the other four completed to end its turn; it now defers them, and the turn says "Dừng theo yêu cầu · 2/6 bước xong, 4 bước để sau". Deferred steps are not sent on and are left out of the steps Studio counts.
619
- - "tiếp tục" (or the Continue button) after a turn that stopped midway takes up the open checklist: the turn's end and the harness rounds follow it even when the agent does not update it again.
620
- - Every company turn ends with a line under the last answer, in the dashboard and the company Terminal: "Hoàn thành · n/n bước", "Dừng giữa chừng · còn x/y bước" (and why: two rounds without progress, the round limit, or a Harness that does not require a plan), "Lượt dừng vì lỗi" (which role) or "Bạn đã dừng lượt này", with Continue when the task is not finished. The sidebar shows the same for each conversation. The line never reaches the model.
621
- - A folder that holds several repositories (a workspace with the front end, the back end and other projects side by side) shows "N repo" where a repository shows its branch: in the chat header, the status bar and the sidebar. Its menu lists the repositories found one level down with their branches and changed files, as an editor's source control view does; picking one opens its branches to switch or create one there.
645
+ ### Improved
622
646
 
623
- - Company sandbox: Docker for approved commands. When Docker runs on the machine (Docker Desktop, Colima, OrbStack, Podman or the Linux daemon), the agent gets `run_with_docker`: one command the member approves runs with internet and the Docker engine, and nothing else is opened (`docker compose up -d` for a test database, `docker build`, Testcontainers tests). The Docker CLI gets its own settings without registry credentials: public images pull, private registries and `docker push` do not. Bypass still asks when a command or the project's compose file mounts a folder outside the project, mounts the Docker socket, or gives a container the host's processes, network or privileges. A plain command that tries Docker is pointed at `run_with_docker`; `piagent studio --doctor` checks Docker. The dashboard shows these commands as "Chạy với Docker".
624
- - Company sandbox: `./gradlew` reuses the Gradle distributions already unpacked in `~/.gradle/wrapper/dists`, as `./mvnw` does with Maven, so it runs without asking for network.
647
+ - Steps you postpone are marked deferred, never completed, and `./mvnw` and `./gradlew` reuse distributions already on the machine.
625
648
 
626
- ### Fixes
649
+ ### Fixed
627
650
 
628
- - A company run that could not be closed (the Mac went to sleep, the network or Agent Watch went away while it ended) threw out of the turn: no answer settled and nothing said what happened. The turn now ends as failed with the reason, the conversation takes the next message, and the run is recovered or abandoned when the conversation opens again.
629
- - A turn that committed its change (`git commit`) counted as "no code changed": the code was compared with HEAD, which the commit had moved. The code is now compared with the commit the turn started from, so required checks, the review (which reads the committed change) and the process report still apply.
630
- - Adding a folder failed with "Không thể thêm thư mục" once 200 folders had been added: the list only grew. A full list now forgets folders gone from the disk, then the ones added longest ago, and a folder added again moves to the newest place. The add dialog also says why a folder could not be added (the folder picker did not open, a drive root or a link, too many attempts).
631
- - Company sandbox: `./mvnw` failed without network ("curl: Failed to fetch apache-maven-…-bin.zip") even when the Maven it wants was already unpacked on the Mac, and a Maven downloaded through an approved command was gone in the next conversation. The Maven Wrapper now reuses the distributions in `~/.m2/wrapper/dists` (read-only) and keeps one it downloads in the project's cache, so `./mvnw -o` runs at once.
651
+ - A turn that committed its change counted as “no code changed”; checks and review now apply to committed work.
632
652
 
633
653
  ## v1.18.0 - 2026-10-08
634
654
 
635
- Switch the Git branch from the dashboard, retries for passing failures, and Claude Haiku 5.5.
655
+ **Switch Git branch from the dashboard, retries, Claude Haiku 5.5.** The branch in the dashboard becomes a switcher, passing model failures are retried before showing, and Claude Haiku 5.5 is available.
656
+
657
+ ### Added
658
+
659
+ - The Git branch in the header and status bar lists branches to switch to, or creates a new one from the current commit.
660
+ - Claude Haiku 5.5 can be used in company conversations when Studio offers it, and joins the personal Claude model scope.
636
661
 
637
- ### Changes
662
+ ### Improved
638
663
 
639
- - Claude Haiku 5.5 (`claude-haiku-5-5`, released 2026-10-07): company conversations can run it when Studio offers it, and `configure-model-scope` adds it to the personal Claude scope at `medium`, with the official numbers (1M context, 128k output, adaptive thinking low to max, $0.10/$0.50 per 1M tokens, five times that above 100k input tokens). The pinned Pi 0.87.1 does not list it yet, so the reviewed catalog supplies it.
640
- - A company answer that fails for a passing reason after Studio admitted it (the model's stream was cut or came back empty, the model or Studio's model gateway did not answer, Studio could not be reached) is asked again up to twice, 2 then 4 seconds apart, before the failure is shown; the dashboard keeps the turn running meanwhile. The failed attempt is left out of what the model sees and no tool runs twice. Quota, key, policy, rejected or refused requests and closed runs still fail at once. Pi decides by Studio's code, not by the words of the error.
641
- - Dashboard turns retry a passing failure twice instead of once, and a failure later in a turn is retried too: replay safety is judged on the model call that failed (no text shown, no tool of its own), not on everything the turn did before. Personal sessions get this as well.
642
- - The Git branch in the chat header and the status bar is a button: it lists the project's branches (local ones, then remote ones with no local branch yet) and switches the folder to one of them, or to a new branch typed in the menu, made from the current commit. A switch waits while any conversation in that folder runs, company ones included, so an agent never finds its files changed under it. Git does the switch itself, so it refuses what it refuses in a Terminal; the menu shows its reason in its own words (for example, uncommitted changes the switch would overwrite) and leaves the files as they were.
664
+ - A branch switch waits while any conversation in that folder runs, and shows Git's own reason when Git refuses.
665
+ - A company answer cut off for a passing reason is retried up to twice before the failure shows; quota or key errors fail at once.
643
666
 
644
667
  ## v1.17.0 - 2026-10-08
645
668
 
646
- The dashboard shows which Git branch each project is on.
669
+ **The dashboard shows each project's Git branch.** The dashboard shows which Git branch each conversation's project is on, and warns when HEAD is detached.
647
670
 
648
- ### Changes
671
+ ### Added
649
672
 
650
- - The dashboard shows the Git branch each conversation's project stands on: next to the project name under the chat title, in the status bar, and beside each project group in the sidebar. A detached HEAD shows its short commit in the warning colour, since work there belongs to no branch. The branch is read from the repository's own HEAD file (linked worktrees included), and a branch switched by the agent or in a Terminal shows at the next refresh, or when you come back to the tab.
673
+ - The branch shows under the chat title, in the status bar and beside each project group in the sidebar, worktrees included.
674
+ - A detached HEAD shows its short commit in the warning colour, since work there belongs to no branch.
651
675
 
652
676
  ## v1.16.3 - 2026-10-08
653
677
 
654
- A dashboard updated from its own button checks for the next release again.
678
+ **Dashboard keeps checking for updates after updating itself.** After an update from the dashboard's button, the dashboard checks for the next release again.
655
679
 
656
- ### Fixes
680
+ ### Fixed
657
681
 
658
- - The dashboard's update restarted the dashboard with update checks switched off (meant only for the install step), so after an update from the button it never checked the registry again and showed no newer release until the machine restarted. The restart now keeps checks on, and a dashboard started by an earlier release's update job turns them back on, so updating to 1.16.3 from any release fixes it.
682
+ - Updating from the button restarted the dashboard with update checks off until the machine restarted; this is fixed from any release.
659
683
 
660
684
  ## v1.16.2 - 2026-10-08
661
685
 
662
- The Terminal says what the dashboard says.
686
+ **The Terminal says what the dashboard says.** The Terminal now offers updates, a `/bypass` switch, and the dashboard's explanations for network commands and failures.
687
+
688
+ ### Breaking changes
689
+
690
+ - The company launcher changed: if `piagent studio` reports the setup changed, import it again in Agent Watch → Studio.
691
+
692
+ ### Added
693
+
694
+ - `pi` and `piagent studio` offer a new Piagent between turns with “Cập nhật ngay” or “Để sau”; `/piagent-update` checks at once.
695
+ - `/bypass` in `piagent studio` switches between asking first and Bypass, and the footer shows “Bypass” while on.
663
696
 
664
- ### Changes
697
+ ### Improved
665
698
 
666
- - A new Piagent is asked about in the Terminal too, in `pi` and in `piagent studio`: "Có bản Piagent mới" with **Cập nhật ngay** (runs `piagent-update`, then asks you to reopen) or **Để sau** (asked again after an hour), only between turns, with a footer line until you update. `/piagent-update` checks at once. Before, `pi` printed one line at session start and `piagent studio` said nothing.
667
- - `/bypass` in `piagent studio` switches the conversation between asking first and Bypass (`on`, `off`, or a choice), kept with the conversation like the dashboard's switch; the footer shows "Bypass" while it is on.
668
- - A network command in the company Terminal is confirmed with its reason, why Bypass still asks, and what allowing or declining does, as on the dashboard.
669
- - The company Terminal explains a failed request (quota, account, Harness, refused…) and a runtime that cannot start in the dashboard's Vietnamese words, with the code for support; the Harness's notes (checks, review findings, a subagent's objection, "bạn quyết định") read in Vietnamese.
699
+ - Network command prompts, failed requests and Harness notes read in the dashboard's Vietnamese wording.
670
700
 
671
- ### Fixes
701
+ ### Fixed
672
702
 
673
703
  - A slash command of a company Terminal extension was sent to the model as a message.
674
- - With Agent Watch 0.15.2, a Watch update that needs Keychain access again asks for it in a dialog and refreshes Piagent's company setup at once; before, `piagent studio` stopped with `managed-launch-binding-changed` until the member found the button.
675
704
 
676
- This release changes the company launcher: Agent Watch refreshes Piagent's setup on its next sync (within minutes); if `piagent studio` reports the setup changed, open Agent Watch → Studio and import it for Piagent.
705
+ Requires: Agent Watch 0.15.2 for the Keychain prompt after a Watch update.
677
706
 
678
707
  ## v1.16.1 - 2026-10-07
679
708
 
680
- New releases are announced in a dialog and checked every hour; a dashboard tab no longer gets stuck signed out.
709
+ **New releases announced in a dialog and checked every hour.** A dialog announces each new release, checks run hourly, and a dashboard tab no longer loses its sign-in to another local Piagent server.
681
710
 
682
- ### Changes
711
+ ### Added
683
712
 
684
- - When a new Piagent is out, the dashboard opens a dialog with what will change and **Update now**; **Later** asks again after an hour. After the update, the restarted dashboard says it worked.
685
- - The dashboard checks for a new release every hour (was 6 hours), and the Terminal notice every hour (was a day).
713
+ - A dialog shows what a new release changes with “Update now”; “Later” asks again after an hour.
686
714
 
687
- ### Fixes
715
+ ### Improved
688
716
 
689
- - A dashboard tab no longer loses its sign-in when another local Piagent server (the company runtime, another launch) signs in: the session cookie is named after its port.
690
- - A tab whose sign-in is gone (Piagent restarted, older than 8 hours) stops polling every 2 seconds with 401 and says how to open Piagent again (`piagent dashboard` or Agent Watch).
717
+ - The dashboard and the Terminal check for a new release every hour.
718
+
719
+ ### Fixed
720
+
721
+ - A dashboard tab lost its sign-in when another local Piagent server signed in; each port now has its own cookie.
722
+ - A signed-out tab stops polling and says how to reopen Piagent with `piagent dashboard` or Agent Watch.
691
723
 
692
724
  ## v1.16.0 - 2026-10-07
693
725
 
694
- Bypass for company conversations; a Harness change never interrupts your work.
726
+ **Bypass for company conversations.** Company conversations can run in Bypass, where network commands run without asking but anything that pushes or deletes still asks.
695
727
 
696
- ### Changes
728
+ ### Added
697
729
 
698
- - A company conversation can run in **Bypass** (new-chat options or the conversation header; "Hỏi trước" stays the default). In Bypass, commands that need the internet (package installs, downloads, `git pull`, tests with a server or browser) and fetching origin run without asking. You are still asked before anything that pushes or sends data out (`git push`, publish, deploy, uploads, `gh` writes, `ssh`/`scp`, remote `rsync`, cloud and cluster tools, `docker push`), database migrations, deletes whose target is only known at run time, `docker compose down -v`, and `sudo`; the request says why Bypass still asks.
699
- - Personal sessions with full access no longer ask before a broad `git add`; deletes, migrations and external actions are still asked.
730
+ - In Bypass, installs, downloads, `git pull` and tests with a server or browser run without asking; Ask first stays the default.
700
731
 
701
- ### Fixes
732
+ ### Improved
733
+
734
+ - Personal sessions with full access no longer ask before a broad `git add`.
735
+
736
+ ### Fixed
737
+
738
+ - A helper added to the Harness during a conversation can be used from the next message.
739
+
740
+ ### Security
702
741
 
703
- - A helper the company Harness adds while a conversation is open can be used in that conversation from the next message; with Studio 0.20.1 a run already running keeps going when the Harness is saved.
742
+ - Bypass still asks before `git push`, deploys, uploads, migrations, unclear deletes and `sudo`, and says why.
704
743
 
705
744
  ## v1.15.2 - 2026-10-07
706
745
 
707
- Long company conversations shrink again, earlier.
746
+ **Long company conversations compact again, and earlier.** Summaries of long company conversations work again and start at 90% of the model's window, never later than 300k tokens.
708
747
 
709
- ### Fixes
748
+ ### Improved
710
749
 
711
- - A long company conversation could not be summarised: Pi's summary request carried the company provider's placeholder key instead of the run's grant, Studio refused it (401 `authentication_required`, listed as "Chưa chọn tài khoản" / "CLI trực tiếp" in the request monitor) before every step, and the conversation kept growing past the model's window. Summaries now use the run's grant, and Studio logs them as `summary`.
712
- - A summary that fails is asked again after 1, 2, 4 … minutes (at most 30) instead of before every step.
750
+ - Compaction starts at 90% of the window and never later than 300k tokens, keeping about the last 20k tokens verbatim.
713
751
 
714
- ### Changes
752
+ ### Fixed
715
753
 
716
- - A company conversation is summarised at 90% of the model's window and never later than 300k tokens, as Codex does: 244.8k on a 272k GPT window (prices double above 272k), 300k on a 1M-token window instead of about 984k. The summary keeps about the last 20k tokens word for word, as before.
754
+ - Long company conversations could not be summarised and kept growing past the model's window; summaries now use the run's grant.
755
+ - A failed summary is retried after 1, 2, 4 … minutes (at most 30) instead of before every step.
717
756
 
718
757
  ## v1.15.1 - 2026-10-07
719
758
 
720
- Studio sees what each company model call is for; several conversations in one folder keep their changes apart.
759
+ **Studio sees what each company model call is for.** Each company model call tells Studio its purpose, and several conversations in one folder keep their changes apart.
721
760
 
722
- ### Changes
761
+ ### Added
723
762
 
724
- - Every company model call tells Studio what it is for: the answer to your message, a step after tools (with the tools the answer before it called), a turn the harness started, a summary of a long conversation, a subagent's brief or a web search. A subagent's brief also carries a one-line title of its job (the `delegate` tool takes an optional `title`; otherwise the brief's first line). No other prompt text is sent. Studio 0.20.0 shows them in Logs → "Lượt agent"; older Studios ignore them.
763
+ - Each company model call tells Studio what it is for, such as an answer, a summary or a subagent brief; no other prompt text is sent.
725
764
 
726
- ### Fixes
765
+ ### Improved
727
766
 
728
- - Several company conversations in one folder no longer take each other's edits for their own: a conversation records the files it changes (writes, edits, and commands compared before and after), and whether the run changed code, whether a check covers it, and what a review reads follow those files only. Before a conversation changes anything, a review reads the whole folder.
729
- - A new company conversation whose runtime fails to open says why (`company-<kind>`) instead of "resyncing", and Archive and Restart work on it without restarting the dashboard.
730
- - A build wrapper (`mvnw`, `gradlew`) whose download is blocked in company mode points to `run_with_network`.
731
- - `piagent doctor` and other `piagent <command>` forms run `piagent-<command>`; an unknown subcommand is named.
767
+ - `piagent doctor` and other `piagent <command>` forms run `piagent-<command>`.
732
768
 
733
- ## v1.15.0 - 2026-10-07
769
+ ### Fixed
734
770
 
735
- A refused subagent says why; long noisy commands finish.
771
+ - Several company conversations in one folder took each other's edits; checks and review now follow each conversation's own files.
772
+ - A new company conversation whose runtime fails to open says why, and Archive and Restart work without restarting the dashboard.
736
773
 
737
- ### Fixes
774
+ Requires: Agent Studio 0.20.0 to see call purposes.
738
775
 
739
- - A company subagent that Studio refuses now says Studio's reason, which Agent Watch 0.15.0 passes along, instead of "the key, harness or run changed in Studio" for every refusal. With Studio 0.19.0, a subagent whose role had no AI account when the run started takes a model that serves when it is called; when none serves, the member reads that no company AI account serves the role's model and an administrator has to link or enable one.
740
- - A company command that printed for more than about 25 seconds (a test suite, a build) stopped as `managed-tool-output-too-large`, although its result was about 50 KB: the 12 MB limit counted every progress update. The limit now applies to each message.
741
- - A company command that writes to `/tmp` (read-only on macOS in company mode) is told to use `$TMPDIR` or the project, instead of the general notice about credentials and the network.
742
- - `piagent-update` started from `npm exec` installs a lasting helper even when the version already matches, and `--no-host` with an incompatible Pi stops before changing either global package. On Windows, Pi is found in custom npm prefixes.
776
+ ## v1.15.0 - 2026-10-07
743
777
 
744
- ## v1.14.0 - 2026-10-06
778
+ **A refused subagent says why, long noisy commands finish.** A company subagent Studio refuses now gives Studio's reason, and long commands that print a lot are no longer stopped.
745
779
 
746
- Updates keep each member's Pi model choices.
780
+ ### Improved
747
781
 
748
- ### Features
782
+ - A company command writing to `/tmp` is told to use `$TMPDIR` or the project.
749
783
 
750
- - `piagent-update`, the dashboard's update and `piagent-setup` set Pi's default model and model list (`enabledModels`) only on a first install. Later they keep the member's default model and list, and add only models the release offers for the first time; a model the member removed is not added back. What Piagent offered is kept in `~/.pi/agent/piagent-model-scope.json`. `piagent-update -- --reset-model-scope` applies the preset over the member's choices as every update did before; `piagent-model-scope` run by hand still applies it.
784
+ ### Fixed
751
785
 
752
- ### Fixes
786
+ - Every refused subagent said the key, Harness or run had changed; it now gives Studio's actual reason.
787
+ - Commands that printed for more than about 25 seconds, such as test suites or builds, were stopped as too large; they now finish.
788
+ - `piagent-update` from `npm exec` installs a lasting helper, and on Windows Pi is found in custom npm prefixes.
753
789
 
754
- - `piagent-update` in WSL2 no longer warns that WSL2 is experimental and not release-gated: since 1.13.0 it is how Windows runs Piagent, and the Windows setup and the bubblewrap sandbox run in CI.
790
+ Requires: Agent Watch 0.15.0; Agent Studio 0.19.0 for model fallback.
755
791
 
756
- ### Docs
792
+ ## v1.14.0 - 2026-10-06
757
793
 
758
- - Windows installs with one PowerShell command (`irm https://raw.githubusercontent.com/Vt-mmm/agentwatch/main/windows/setup.ps1 | iex`): WSL2 and Ubuntu when missing, Piagent in Ubuntu, Agent Watch and the company key, and a Piagent Start-menu entry; running it again updates. The docs site has a "Cài trên Windows" page with the fixes for failed installs, and the Windows guide leads with the command.
794
+ **Updates keep each member's Pi model choices.** Updates set Pi's default model and model list only on first install, then keep yours and add only newly offered models.
759
795
 
760
- ## v1.13.1 - 2026-10-06
796
+ ### Added
761
797
 
762
- ### Fixes
798
+ - `piagent-update -- --reset-model-scope` applies Piagent's preset over your choices.
799
+ - Windows installs with one PowerShell command, and the docs site has a Windows install page with fixes for failed installs.
763
800
 
764
- - Opening a conversation no longer jumps to its first message. Each conversation keeps the place it was left while the dashboard stays open; one opened for the first time, or left at its end, opens at its newest message and follows an answer as it streams.
765
- - Text the agent writes between tool calls, and earlier answers of a turn, are formatted like the final answer instead of showing their markdown (`**`, backticks, `#`, `-`) as plain text. The first answer after opening the dashboard no longer shows as plain text for a moment.
801
+ ### Improved
766
802
 
767
- Updating from 1.13.0 needs no new Agent Watch import; from 1.12 or earlier, import again as described for 1.13.0.
803
+ - `piagent-update`, the dashboard update and `piagent-setup` keep your default model and list; a model you removed is not added back.
768
804
 
769
- ## v1.13.0 - 2026-10-06
805
+ ### Fixed
770
806
 
771
- Piagent on Windows through WSL2, with company conversations in a bubblewrap sandbox; personal mode on Windows itself as a preview.
772
-
773
- After updating, each member imports the Piagent configuration again in Agent Watch (macOS: Studio → Apply for Piagent; Windows: Connect Piagent in WSL). The company launcher changed, so the earlier import no longer verifies, and the dashboard says so.
774
-
775
- ### Features
776
-
777
- - Company conversations run on Linux, and so in WSL2 on Windows, with a bubblewrap sandbox that keeps the macOS promises:
778
- - The project, its package cache and a private temporary folder are writable.
779
- - The member's other folders are readable for reference, read-only; the home folder's hidden entries are not there at all.
780
- - Credential files read as empty.
781
- - A command without approval gets its own network namespace: it reaches only the servers it starts itself.
782
- - A command's processes end with it.
783
- - Windows programs cannot be started from inside.
784
- - `piagent studio --doctor` checks each of these.
785
- - Agent Watch for Windows binds Piagent in WSL. Piagent keeps WSL's interop variables when it starts the Windows broker, and keeps the company store in `$XDG_DATA_HOME/agentwatch` (`~/.local/share/agentwatch`) on Linux.
786
- - On Windows itself (preview of personal mode; `piagent-update` does not run there yet):
787
- - The dashboard's project picker is Windows' folder dialog; from WSL it is that dialog too, with the answer converted to a WSL path.
788
- - Links open in the Windows browser from WSL.
789
- - @ suggestions find `fd`/`fdfind` and git on PATH.
790
- - When the company runtime cannot start from WSL, the dashboard and `piagent studio` say what to do in Agent Watch for Windows instead of pointing at macOS Keychain.
791
- - [Windows](docs/en/windows.md) is the setup guide. A Windows workflow runs the guard, dashboard and path tests on Windows, and the Ubuntu job runs the Linux sandbox.
792
-
793
- ### Fixes
794
-
795
- - On Windows the guard treated a path on another drive (`D:\x`) as a project path, and `~\` was not the home folder; `AppData` is closed to reference reads like `~/Library`.
796
- - On Windows a command ending in `2>/dev/null` counted as a write (Git Bash's `/dev/null` is the null device), so read-only commands needed approval.
797
- - On Windows the dashboard, `piagent` and the update job could not start their TypeScript loader (a `C:\…` path given to `--import` reads as a URL scheme).
798
- - On Windows saving a task's journal or state failed: a file was flushed through a read-only handle, and a folder was flushed, which Windows refuses.
799
- - On Windows a second dashboard start could not take over from an earlier release's Gateway (its control pipe was linked like a Unix socket), and `piagent` could not register a `C:\…` project with the dashboard.
800
- - On Windows the dashboard did not find a globally installed Pi: npm keeps it in `%APPDATA%\npm\node_modules` or beside `node.exe`.
801
- - On Windows an image path such as `C:\Users\me\shot.png` or `.\shots\a.png` in a message was not attached.
802
- ## v1.12.1 - 2026-10-06
807
+ - `piagent-update` in WSL2 no longer warns that WSL2 is experimental.
803
808
 
804
- ### Fixes
809
+ ## v1.13.1 - 2026-10-06
805
810
 
806
- - A forked company conversation takes messages again. The fork was written where Pi keeps personal conversations, outside the member's company session folder, so the dashboard listed it but every message to it returned "The message was not sent". Forks made with 1.12.0 or earlier stay unreachable: fork the source conversation again after updating.
811
+ **Conversations keep their place, agent text is formatted.** Reopening a conversation no longer jumps to its first message, and text between tool calls is formatted like the final answer.
807
812
 
808
- ## v1.12.0 - 2026-10-06
813
+ ### Improved
809
814
 
810
- @ in the dashboard picks any file or folder on the Mac, and the agent reads folders outside the project for reference.
815
+ - Updating from 1.13.0 needs no new Agent Watch import; from 1.12 or earlier, import again as for 1.13.0.
811
816
 
812
- ### Features
817
+ ### Fixed
813
818
 
814
- - Typing @ in a conversation or a new chat offers the project's files and folders, matched loosely by name with git-ignored ones left out, and after `~/`, `/` or `../` any folder on this Mac. Arrow keys move, Enter or Tab picks, Escape closes. A folder stays open for the next name, and a path with spaces is quoted, as in Pi's terminal.
815
- - Company conversations read the folders a member points to outside the project — an @ mention, or "read ~/Documents/old-shop" — with read, ls, grep, find and commands. Those folders are read-only: changes go in the project only. Hidden files and folders of the home folder (shell files, histories, tool settings), `~/Library` and credential files (`.env`, `.npmrc`, `credentials`, `auth.json`) stay closed, and a command the member approved for network still reads the project only.
816
- - Personal conversations read those folders too, with read, ls, grep and find; protected paths are still refused.
817
- - A message typed and not sent stays where it was written — in each conversation and in the new chat — when another conversation is opened, and in this browser across a reload. Staged files and a send still being confirmed come back with it. Creating the chat or sending the message clears it.
818
- - Skills and commands kept for coding agents are Piagent's too: the project's `.claude/skills`, `.claude/commands`, `.codex/skills`, `.agents/skills` and `.pi` folders (from the project up to its repository root) and the member's `~/.claude`, `~/.codex`, `~/.agents` and `~/.pi/agent` ones. The model sees each skill by name and description; `/command`, `/skill:name` and `/skill-name` expand in company and personal conversations; a / at the start of a message lists them in the dashboard; the chat shows a skill call as typed. In company conversations the sandbox reads a skill's folder where it is installed, and nothing else of those folders.
819
- - Tests of the common languages run in company conversations:
820
- - Package caches (npm, pnpm, yarn, bun, deno, pip, uv, poetry, Go, Cargo, Gradle, Maven, NuGet, Composer, pub, gems) are kept per project under `~/Library/Caches/Piagent/sandbox`, so after one approved install, tests run offline. The member's own Go, Gradle, Maven and NuGet caches are read-only sources.
821
- - A test's own server and a local database on this Mac are reachable without approval — unless a local proxy (the system's, `*_PROXY`, or a proxy or VPN client's usual port) listens, since it would carry a command to the internet; the error then says to ask for approval.
822
- - JDKs under `~/Library/Java`, the Android SDK, the system Ruby gems, MacPorts and Playwright's browsers are available without approval; `JAVA_HOME` and `ANDROID_HOME` are set.
823
- - The sandbox uses the developer tools selected with `xcode-select`, so Swift package tests find XCTest; SwiftPM and xcodebuild run without their own nested sandbox, and xcodebuild builds into the project cache.
824
- - An approved command can restore .NET packages (TLS through the macOS Security framework); offline, .NET reads the packages the member already restored.
825
- - `piagent studio --doctor` lists the languages installed on the Mac and checks localhost and the package cache.
826
- - Docker and the iOS Simulator remain unavailable in the sandbox.
819
+ - Opening a conversation jumped to its first message; it now keeps its place, or opens at the newest message.
820
+ - Text between tool calls showed raw markdown; it is now formatted like the final answer.
827
821
 
828
- ### Fixes
822
+ ## v1.13.0 - 2026-10-06
829
823
 
830
- - In personal conversations the guard checked a path such as `~/notes.md` or `@~/notes.md` as if it were inside the project, while Pi's tools opened it in the home folder, so an edit there was allowed outside the project. The guard now checks the path the tool opens.
831
- - In company conversations a path starting with `~/` named the sandbox's own empty home folder; it now names the member's.
824
+ **Piagent on Windows through WSL2.** Company conversations run on Linux and WSL2 in a sandbox with the macOS guarantees; personal mode on Windows itself is a preview.
832
825
 
833
- ## v1.11.1 - 2026-10-05
826
+ ### Breaking changes
834
827
 
835
- Updates now end on the new release's dashboard, whichever way they ran.
828
+ - After updating, each member imports the Piagent configuration again in Agent Watch, since the company launcher changed.
836
829
 
837
- ### Fixes
830
+ ### Added
838
831
 
839
- - An update started from the dashboard installed the new release but could not restart the dashboard: the restart ran without the package's TypeScript loader, which an npm install needs under node_modules. It now starts the dashboard the way the `piagent` command does.
840
- - After `piagent-update` (or any reinstall), `piagent dashboard` reused the dashboard still running the earlier release, which kept showing that release's pages. A dashboard from another release is now stopped and started again on the installed one, and `piagent-update` says so when it finishes.
832
+ - The Linux sandbox keeps the project writable, other folders read-only, credentials empty and unapproved commands offline.
833
+ - Agent Watch for Windows binds Piagent in WSL, and `piagent studio --doctor` checks each sandbox guarantee.
834
+ - From WSL, the folder picker is the Windows dialog and links open in the Windows browser.
841
835
 
842
- ## v1.11.0 - 2026-10-05
836
+ ### Fixed
843
837
 
844
- The dashboard keeps Piagent and Pi up to date itself, and works like an editor:
845
- a status bar, a command palette and Settings that can be searched.
838
+ - Several Windows path, loader and file-saving bugs that stopped the guard, dashboard and `piagent` are fixed.
846
839
 
847
- ### Dashboard
840
+ ## v1.12.1 - 2026-10-06
848
841
 
849
- - Updates: the dashboard checks the registry when it opens and every 6 hours (the Gateway asks npm in the background; a source checkout and the company runtime never do). A newer release shows in the status bar ("Cập nhật Piagent X") and as a dot on Settings. Settings → Cập nhật shows Piagent and Pi as installed and as offered, when it last checked, and "Kiểm tra ngay".
850
- - One click updates Pi and Piagent together with `piagent-update`, after a confirmation that lists the change. Pi only ever moves to the version the new Piagent pins; a newer Pi is shown as not yet compatible. The button is locked while a conversation runs, and the update runs apart from the dashboard: when done, the dashboard restarts on the new release and opens in a new tab. Its output goes to `~/.pi/piagent-update-job.log`; a failure or an interrupted run is reported for a day. A release that changed the company launcher asks to connect the company key again in Agent Watch.
851
- - Status bar (wide screens): Gateway state, running conversations, the release and its update, and the command palette.
852
- - Command palette (⌘K / Ctrl+K): new chat, updates, the Workspace panel, Source Changes, theme, language, refresh, every Settings section and every conversation by name; matching ignores case and Vietnamese accents. ⌘, / Ctrl+, opens Settings.
853
- - Settings: a search box that finds a setting by what it does, sections grouped (Chung, Agent, Công cụ, Thông tin), a Shortcuts section, a description under each appearance setting, and the release at the foot of the list.
842
+ **Forked company conversations take messages again.** A forked company conversation now accepts messages; forks made with 1.12.0 or earlier must be forked again.
854
843
 
855
- ## v1.10.0 - 2026-10-05
844
+ ### Breaking changes
856
845
 
857
- A helper may object to the brief the main agent gave it. The main agent
858
- decides and has to answer; the same disagreement a second time goes to the
859
- member.
846
+ - Forks made with 1.12.0 or earlier stay unreachable: fork the source conversation again after updating.
860
847
 
861
- ### Managed team harness
848
+ ### Fixed
862
849
 
863
- - Every helper (scout, research, verify, review) reads the member's request verbatim, and the current plan, above the main agent's brief. A short follow-up such as "tiếp tục" brings the earlier message that states the task. Before, a helper saw only the brief, and a brief that dropped part of the request could not be seen to drift; the harness's own review after "tiếp tục" was told the request was "tiếp tục".
864
- - A helper ends its answer with `brief_issues` (wrong premise, conflicts with the request, ambiguous, out of scope), each with evidence. It objects only when acting on the brief as written would give a wrong or wasted answer; a guess the brief marks as a guess ("if any", "for example") is not an objection. The harness shows the objection in the conversation and adds a note to the main agent: answer it with a corrected brief, another approach, or a reason. An objection that no corrected brief followed is asked about once before the turn ends.
865
- - Objections to a brief the harness wrote itself (its review, its re-check) are not relayed: they only restate the member's request.
866
- - A second objection from the same helper for one message ends the exchange: the member decides, and the helper is refused (`managed-helper-disputed`) until the member's next message.
867
- - With a required review, an agent that answers a blocking finding instead of changing the code has its answer judged by the reviewer, who keeps or withdraws the finding. A kept finding goes to the member. A re-review after a fix also reads the answer that came with it.
868
- - With a required verify, a claim the verify helper marked failed goes back to the agent once, then the verify helper checks it again with the agent's answer. A claim outside the member's request that the result does not depend on is set aside as unverifiable; a claim that still fails goes to the member.
869
- - A turn whose disagreement went to the member ends as `disputed`, with or without a code change. Process report version 3 adds `objections`, `objections_answered` and `disputes`; a Studio or Agent Watch that does not list it receives version 2 with the outcome it had before.
850
+ - Every message to a forked company conversation returned “The message was not sent”; forks now work.
870
851
 
871
- - The main agent asks the member when the request leaves a decision open (`ask_user`): 1–4 questions, each with 2–4 numbered options and "Other" in the member's own words. It waits for the answer, then goes on with it. In the Terminal each question is a selector; with no screen to ask on, the agent states the assumption it makes and goes on.
872
- - A question the member stopped before answering (or whose screen went away) tells the agent the decisions are still the member's: on "tiếp tục" it asks again instead of choosing for them. The tool also says not to add an "Other" option of its own.
873
- - A helper's receipt (its tokens, the patch it read) stays in the conversation for the member but is no longer part of the main agent's context, where it read as a message from the member ("you sent a line 'Review: … tokens'").
874
- - A check command that fails by returning an error result, rather than throwing, counts as a failed check (main agent, network commands and helper checks), so a required check never passes on a failing run.
875
- - A helper refused for its account's usage, resting, or whose account went away starts once more, and Studio gives it the next model of its role (a Harness "Model dự phòng").
876
- - A patch larger than one reviewer reads (120 KB) is reviewed in parts of whole files, one after another under the review grant, and the findings merge. A file too large to read, or a repository cloned inside the project, is named as not read instead of stopping the review.
877
- - Requests of one role running side by side share one grant renewal, so none voids another's token. The main agent's prompt cache key follows the conversation, not the turn.
852
+ ## v1.12.0 - 2026-10-06
878
853
 
879
- ### Dashboard
854
+ **@ any file or folder, skills with /, tests in the company sandbox.** @ picks any file or folder, agents read outside folders read-only, existing skills work with /, and common test suites run in the sandbox.
880
855
 
881
- - A question from the main agent is a card above the conversation: numbered options with their meaning, "Khác" with a text field, "Để agent tự quyết" and "Gửi câu trả lời". Number keys choose, Enter sends; the turn shows "chờ bạn trả lời câu hỏi" while it waits. A company conversation's question is read and answered through the company Gateway; a card answered in another tab, or withdrawn, leaves within seconds. A waiting question keeps the turn alive past the 15-minute silence limit.
882
- - A tab whose browser session was replaced by a newer launch in the same browser (Agent Watch's WebUI button clicked again) no longer has every change refused: a refused change reads the browser's current session once and is sent again.
883
- - Objections, the reviewer judging an answer, failed claims and disagreements appear in the turn; the conversation row says "Cần bạn quyết". A step that asks nothing of the agent no longer hides its last answer behind "this turn has no answer".
884
- - Harness roles are named Subagent scout, research, verify and review, and process notes keep the usual English terms (check, fix, blocking, claim, plan).
856
+ ### Added
885
857
 
886
- ## v1.9.3 - 2026-10-03
858
+ - Typing @ offers the project's files and folders, and after `~/`, `/` or `../` any folder on this Mac.
859
+ - Agents read folders you point to outside the project, read-only; hidden home files, `~/Library` and credential files stay closed.
860
+ - Skills and commands in the project's and your agent folders, such as `.pi` and `.agents/skills`, work with `/command` or `/skill:name`.
861
+ - Tests of common languages run in company conversations, with per-project package caches and local servers reachable.
887
862
 
888
- Typing Vietnamese no longer sends or creates twice, and helpers read less of
889
- each web page.
863
+ ### Improved
890
864
 
891
- ### Dashboard
865
+ - An unsent message stays in each conversation and the new chat across switching and reloads.
892
866
 
893
- - An Enter that commits text from an input method (Vietnamese Telex/VNI and others; Safari reports key code 229) only finishes the word and never sends. Shift+Enter is still a new line.
894
- - Pressing Enter twice, or Enter and the send button, before the page re-renders creates one conversation and sends one message. Before, a second press could start a second identical conversation, and a member saw two created two seconds apart.
867
+ ### Security
895
868
 
896
- ### Managed team harness
869
+ - Personal conversations could edit `~/` paths outside the project; the guard now checks the path the tool actually opens.
897
870
 
898
- - A helper reads at most 20,000 characters of a web page, and 12,000 unless it asks for more. The main agent keeps 30,000 and 100,000. A helper's pages stay in its context for every later request of its run: a news question had read 217,000 tokens in a single research request. The tool description asks for the page or section that answers the question rather than a whole site.
871
+ ## v1.11.1 - 2026-10-05
899
872
 
900
- ## v1.9.2 - 2026-10-03
873
+ **Updates end on the new release's dashboard.** Whether started from the dashboard or `piagent-update`, an update now ends with the dashboard running the installed release.
901
874
 
902
- Web work in company sessions goes to the research helper, search results name
903
- their engine, and sending a message no longer jumps the dashboard to the top.
875
+ ### Fixed
904
876
 
905
- ### Managed team harness
877
+ - An update from the dashboard installed the release but could not restart the dashboard on npm installs; it now restarts.
878
+ - After `piagent-update`, `piagent dashboard` reused the old release's dashboard; it now restarts on the installed one.
906
879
 
907
- - With a research helper in the Harness, the web is the helper's work. The main agent has no `web_search` or `web_fetch`: searches and pages are read on the research model, and only its summary with sources reaches the main agent. Before, a question about the news ran search and page reading on the main model.
908
- - Without a research helper, the main agent keeps its own web tools.
909
- - A search result now names the engine that answered: Tavily, Exa or Parallel through the company search pool, or the model provider's own search. Before, the agent told the member it did not know which engine it used.
910
- - The agent introduces itself as Piagent, the company coding assistant, even when the model account's system line gives another product name.
880
+ ## v1.11.0 - 2026-10-05
911
881
 
912
- ### Dashboard
882
+ **One-click updates and an editor-style dashboard.** The dashboard checks for and installs Piagent and Pi updates itself, and gains a status bar, a command palette and searchable Settings.
913
883
 
914
- - Sending a message in a long company conversation no longer jumps the page to the top. When a turn started, the "company mode is off" check remounted the whole history, even though company mode was running, and the page lost its height for a moment. That check now reloads the history only when company mode comes back after being seen down, and the reload keeps the history on the page until the new read arrives.
915
- - The helper count in the conversation header and the Workspace panel shows the number of helpers the Harness enables (up to four) instead of a fixed 2. A Harness without helpers shows no count.
884
+ ### Added
916
885
 
917
- ## v1.9.1 - 2026-10-03
886
+ - The dashboard checks for a new release on open and every 6 hours, and shows it in the status bar and Settings.
887
+ - One click updates Pi and Piagent together, with Pi kept on the version Piagent pins; it is locked while a turn runs.
888
+ - A command palette (⌘K / Ctrl+K) reaches actions, settings and conversations by name, ignoring Vietnamese accents.
889
+ - Settings can be searched by what a setting does, with grouped sections and a Shortcuts section.
918
890
 
919
- Two more company helpers (scout and verify) and web search for every company
920
- role through the team's search pool. The company sandbox now runs type
921
- checks, Vitest and end-to-end suites that it used to stop. The installer no
922
- longer advertises commands 1.9.0 retired.
891
+ ## v1.10.0 - 2026-10-05
923
892
 
924
- ### Install
893
+ **Agent asks when unclear, subagents can object to a brief.** The main agent asks you numbered questions when a decision is open, and subagents can object to a brief with evidence.
925
894
 
926
- - `piagent-install` no longer ends its next steps with `/workflow task Implement <task>`, a command 1.9.0 retired; typed in Pi, it would have reached the model as a message and started a paid turn. Work is requested in plain language.
927
- - `/subagents-doctor` is listed in those next steps only when the install includes pi-subagents, which provides it: `piagent-install` adds it only with `--with-subagents` or when it is already installed.
928
- - `piagent-setup` lists `/mcp` and `/subagents-doctor` in its next steps only when that run installed them (not with `--no-mcp`, `--no-subagents` or `--project-only`), and no longer lists the retired `/onboard` and `/onboard run`; its daily flow says to ask in plain language instead of `/workflow task`. `piagent-init` no longer lists `/onboard` either. A test checks that no install script prints a command 1.9.0 retired.
895
+ ### Added
929
896
 
930
- ### Managed team harness
897
+ - The main agent asks 1–4 questions with numbered options and “Other” when the request leaves a decision open, then waits.
898
+ - Subagents read your request verbatim and can object to a brief with evidence; a second objection goes to you.
931
899
 
932
- - Two more helpers when the company Harness enables them, beside research and review. **Scout** reads the project only (no web, no commands) and answers with `file:line` facts. **Verify** checks a result on its own: it runs the repository's checks and confirms claims against the code and primary sources, then answers pass, fail or unverifiable for each claim, with evidence. Its commands run offline, and the project is read-only for them.
933
- - A check that verify ran and passed counts toward the turn's process, the same as one the main agent ran.
934
- - The main agent is offered only the helpers its Harness enables, and the prompt says when to use each one. With scout enabled, research is meant for questions that need the web. A call to a helper that the Harness lacks fails at once (`managed-helper-not-configured`).
935
- - The dashboard counts running helpers against the number enabled, not against two.
936
- - Every company request names the client to Studio as `piagent/<version>` (model requests and web search), so Studio's reports show Piagent and its version instead of an unknown tool.
937
- - Company `web_search` asks Studio's search pool first, for every role: the team's search keys, then keyless providers. A Claude or Codex role falls back to its provider's own search tool when the pool is missing (an older Studio) or finds nothing. A role on an API-key vendor model (DeepSeek, MiMo and others), which has no search tool of its own, can now search. The pool request carries the run token and the role id, never a model or effort.
900
+ ### Improved
938
901
 
939
- ### Company sandbox
902
+ - A subagent out of quota or whose account is resting runs again on the Harness's fallback model.
903
+ - A patch larger than 120 KB is reviewed in parts and the findings merge, instead of stopping the review.
940
904
 
941
- - `auth.json` is blocked only at the project root and in dot folders, where credentials live (Composer, `.codex`). A translation file such as `src/locales/en/auth.json` is readable, so type checks of i18n projects pass.
942
- - Credential files (`.env*`, `credentials*`, `.npmrc`, `.netrc` and those `auth.json`) are hidden as well as unreadable. A tool that loads them when present (Vite, Vitest, Next) runs without them instead of failing with `EPERM`.
943
- - Committed templates (`.env.example`, `.env.sample`, `.env.template`, `.env.dist`, `.env.defaults`) are ordinary files.
944
- - In a folder that is not a git repository, a command that only reads (`ls`, `cat`, `grep`, `git status`…, with nothing written to a file) no longer counts as a code change, so a turn that only read files and ran checks no longer reports "code changed". A command that writes still counts.
945
- - End-to-end tests run through `run_with_network`. An approved command may start a local server and drive Playwright's Chromium against it, using:
946
- - listening on loopback;
947
- - the member's Playwright browsers;
948
- - Chromium's own rendezvous services.
905
+ ### Fixed
949
906
 
950
- Other system services, Keychain among them, stay closed. The sandbox cannot tell loopback from all interfaces, so the approval card says that a server the command starts accepts connections while it runs.
951
- - A command's own timeout, up to 30 minutes, now extends the 10-minute limit, so a build followed by an end-to-end suite fits.
907
+ - A check that returns an error result now counts as failed, so a required check never passes on a failing run.
952
908
 
953
- ## v1.9.0 - 2026-10-02
909
+ ## v1.9.3 - 2026-10-03
954
910
 
955
- Freeform sessions and the managed team harness. This release retires the task
956
- contract and the workflow commands; work is requested in plain language and the
957
- guard checks every tool call.
911
+ **Vietnamese typing no longer sends twice, helpers read less.** Enter used by an input method no longer sends, a double Enter sends once, and helpers read less of each web page.
958
912
 
959
- ### Freeform sessions
913
+ ### Improved
960
914
 
961
- - Retired the task contract: a session no longer creates a contract, declared scope, work plan, acceptance receipt, completion gate or recovery handoff, and no write waits for one. Task records written by earlier releases under `.pi/piagent-state/tasks` stay readable as history.
962
- - Retired `/workflow`, `/fresh` (and `/fresh-*`), `/onboard`, `/onboard-project`, `/commands`, `/piagent-commands`, `/model-options`, `/profiles`, `/profile-tech` and the prompt-template aliases (`/task`, `/scout`, `/be-to-fe`, `/plan`, `/discuss`, `/review`, `/commit`, `/pr`, `/platform-improve`). Pi no longer loads `packages/piagent-core/prompts`. Project onboarding is a plain request recorded with `piagent_project_onboarding_record`.
963
- - Retired the task-bound tools `piagent_task_start`, `piagent_task_progress`, `piagent_task_gate_check`, `piagent_context_record`, `piagent_verify_record`, `piagent_trace_record` and `piagent_memory_citation_record`; a tool group never re-activates them. `piagent_document_read` and `piagent_source_checkout` remain.
964
- - The input hook passes text through unchanged: pasted checklists are no longer collapsed and long prompts are not stored in a task inbox.
965
- - Delegation allows up to two fresh read-only helpers; token-saving estimates are telemetry, not an admission gate (bounded-delegation-v2).
966
- - Kept for freeform turns: protected and read-only paths, permission profiles, the context budget for large files, confirmation for destructive and external-provider actions, and the stale read-to-edit check, which was keyed to the task run and now uses the session.
915
+ - A helper reads at most 20,000 characters of a web page (12,000 by default), cutting token use on research.
967
916
 
968
- ### Managed team harness
917
+ ### Fixed
969
918
 
970
- - Added the managed harness for company sessions imported by Agent Watch (`piagent studio`, `--web`): Studio chooses the main, research and review routes; tools run in a sandboxed worker with per-run authority.
971
- - Per-turn process from the team's Harness in Studio: plan, checks and review, each `suggest` or `require`, with bounded fix loops. A plan guard refuses edits (including shell edits) until a plan exists and reports `planSkipped` after three refused answers; invented tool names are counted.
972
- - Process report v2 (`plan_skipped`, `unknown_tools`) is negotiated: Studio lists `process_versions`, Agent Watch advertises `process-v2`.
973
- - Detached processes are stopped at turn end; stopping during a helper reports `aborted`/`managed-helper-cancelled` instead of a send failure.
919
+ - An Enter that commits text from a Vietnamese input method sent the message; it now only finishes the word.
920
+ - Pressing Enter twice could create two identical conversations; it now creates one and sends one message.
974
921
 
975
- ### Security and fixes
922
+ ## v1.9.2 - 2026-10-03
976
923
 
977
- - The runtime dependency audit accepts three denial-of-service advisories in `brace-expansion` 5.0.9 (GHSA-q2hr-2g5m-vwhr, GHSA-qhr7-859c-m2p7, GHSA-6j4f-fj2g-mc7p) until 2026-10-31: every published Pi host, 1.0.0 included, pins that version through its npm-shrinkwrap, so no Piagent change can update it. The exceptions live in `scripts/runtime-advisory-exceptions.json`, apply only at the Pi host's own copy, print on every audit and end on their own; any other finding still blocks.
978
- - Redacted Agent Studio credentials (`as_live_`, `as_device_`, `as_run_`). Write/edit previews and runtime command output are redacted before they are split or truncated, the gateway stream no longer flushes half a credential on a long line, and the client live file label recognises Studio tokens.
979
- - A shell command can no longer create a new file in a shared source-checkout cache by spelling the path through an alias such as `/var` for `/private/var`.
980
- - WebUI approvals: an allowed decision is now consumed by the guard, so the decision request receives its receipt and the approval leaves the queue. Before, every decision without a task stayed pending and could fill the broker.
981
- - Removed the WebUI runtime actions that still sent `/commands` and `/onboard ...`; with those commands gone they would have reached the model as a message and started a paid turn. A test now ties every WebUI runtime action to a registered command.
982
- - `piagent-explain` no longer lists task-contract, task-scope or lifecycle gates.
983
- - The sandbox allows signals within the same sandbox, which fixes `grep` EPERM, timeouts and orphaned cancelled commands.
984
- - The dashboard relay no longer freezes when `project.paths` exceeds the default control response limit.
924
+ **Web work goes to the research helper, chat stays in place.** With a research helper, web work runs on its model and only a summary reaches the main agent; sending no longer jumps the page.
985
925
 
986
- ### Dashboard and company mode, from live runs
926
+ ### Improved
987
927
 
988
- - A company turn now settles once, after its harness rounds (the check request, the review, the fixes). Before, the dashboard treated the turn as finished at the first answer: Stop disappeared, the later rounds were not streamed, and for a moment the turn read "no answer yet, press Continue".
989
- - `run_with_network` works: the network sandbox now allows the system resolver socket, so an approved command can resolve host names. Before, every approved network command failed with `ENOTFOUND`. When an approved command still cannot reach the network, the agent is told the network is unreachable instead of being pointed back to `run_with_network`.
990
- - The header and the Workspace panel show a review subagent while it runs ("Subagent 1/2"); its start and end now refresh the conversation.
991
- - A company conversation opened while company mode is not running (after a restart, a crash or an update) says so and offers Reconnect in place. Reading still never starts company mode, since starting may ask for Keychain access.
992
- - A conversation whose history cannot be read no longer shows the previous conversation's messages under its title.
993
- - Approval cards: the network approval shows the exact command; task, tool-call and provider references are gone; paths inside the project are shown relative to it (the project folder reads "The whole project folder"); known reasons and consequences are shown in Vietnamese. The exec-policy reason now reads "Confirmation required: the command runs git push" instead of naming a "legacy policy pattern".
994
- - An `apply_patch` step is shown as an edit of its files with the patch's diff, like `edit`, in the history and while it runs.
928
+ - With a research helper in the Harness, searches and page reads run on its model and only its summary with sources returns.
929
+ - Each search result names the engine that answered it.
995
930
 
996
- ### Many members at once, from a 20-developer run
931
+ ### Fixed
997
932
 
998
- - A company request that Studio refuses because every company model account that can serve the conversation is busy (`session_account_busy_retry_later`, `session_account_not_ready_retry_later`, `concurrency_limit`, `account_capacity_unavailable`, `request_rate_limit`) now waits in line and is asked again, for up to 20 minutes. These refusals come before any model is asked, so nothing is sent twice; a failure after admission is still never replayed. The wait is a step of the running turn in the dashboard ("Wait for a free company account") and the working line in the Terminal; Stop ends it. Before, the turn failed after Studio's 30-second wait.
999
- - Dashboard commands are outdated only when their own conversation changed. Before, any change to any conversation made every other command stale, so with several conversations running a new conversation could fail with `session-revision-stale`. A failure to create a conversation is now shown as a sentence instead of a code. Stop no longer fails while the agent works through quick steps: a running turn changes its conversation after every step, so Stop is bound to the operation it names, not to the page's last read; if Stop still fails, the dashboard says so instead of doing nothing.
1000
- - A company request refused before the model did any work because the account's sign-in was being renewed (`upstream_auth_required`, `execution_precondition_failed`) is asked again up to three times, 3, 6 and 9 s apart; an account that really has to sign in again still says so.
1001
- - Opening a company conversation, starting a run and granting a subagent ask Studio again when it is too busy to answer in time (`serverUnavailable`), as does a request Studio could not check in time (`operation_unavailable`). Under load, most company conversations opened from the dashboard used to fail to open, and most required reviews ended as "review could not run". A review that still cannot run keeps its reason as a code in the conversation file.
1002
- - The dashboard stays fast with many conversations: listing them read every session file in full on every catalog (863 conversations: about 4 s each time, far more under load, so pages waited 30–40 s and timed out). Unchanged files now keep what was read before and only changed ones are read again, by Pi itself (44 ms instead of about 4 s).
1003
- - A member's session can read the skills Pi lists for it where they are installed (the package's and the user's); the guard used to refuse that read as "outside the project". Writes there stay refused.
1004
- - A new conversation whose creation takes longer than the dashboard's 30-second answer (the first one after the Gateway starts, a company runtime opening) is no longer reported as "could not be created" while it is created and runs: the page sends the same command again, which waits behind the create and returns its receipt, for up to two minutes; if it still has no answer it says the conversation may exist. Before, a member who believed the message was lost sent it again and two runs edited the same project.
1005
- - A dashboard message that stays unconfirmed is released after two minutes: its command now expires then, so it can no longer run, and the draft is kept to send again. Before, the composer stayed locked until the page was reloaded.
1006
- - Company sessions recover after the Mac sleeps: a run grant that lapsed under a request (Studio's clock catches up at once after a sleep, and grants last two minutes) is renewed and the request asked again, and an Agent Watch helper killed by a request that outlived the sleep is replaced when the next turn starts. Before, every company conversation failed with `invalid_run_grant` or "the Agent Watch helper stopped" until it was reopened.
1007
- - A request the model's provider declines under its usage policy (seen when a member asked to print an `.env` file encoded in base64) is reported as such, with its own dashboard copy ("ask in a different way"), instead of "the request could not be sent".
1008
- - An answer stream that ended with nothing in it ("stream ended without a stop reason") is reported as "the model returned no response" (`upstream_incomplete`) instead of "the request could not be sent"; it is not sent again, and "tiếp tục" continues. A company failure no code names keeps its own words, redacted, in the conversation file (not shown) so it can be told apart later.
1009
- - Two project folders with the same name (two clones of one repository) show where each one is in the new-conversation menu.
1010
- - A message sent right after Stop reaches the conversation on a busy machine. Every catalog the dashboard built opened and parsed every conversation file to learn its model and thinking level (929 files, 140 MB: about a second of blocked Gateway each time, 1–6 s under load); a Stop then took up to 50 s and the next messages stayed unconfirmed with the composer locked for minutes. A file's facts are now kept until its size, modification time or inode changes: catalogs take 0.1–0.5 s under the same load, and a stop-then-send probe that failed 3 of 4 times passes.
1011
- - A Gateway that is busy is no longer replaced by a second one. `piagent dashboard open` and the company launch took a Gateway that did not answer within 1.5 s for gone and started another; the new one took over the control socket while the first kept running unreachable, serving its pages and holding its conversations (three were found running at once). A Gateway that answers late is waited for (up to 30 s), only a socket nobody listens on is replaced, and an old Gateway that exits no longer removes the running one's socket.
1012
- - `piagent-doctor` lists `enabledModels` patterns that match no model Pi knows (Pi warns about each on every start), and `piagent-model-scope --prune` removes only those; patterns of a provider that is only signed out are kept.
1013
- - Public text names no other agent product or project; the wording check enforces it across docs, the docs site and the core package.
933
+ - Sending a message in a long company conversation jumped the page to the top; the history now stays in place.
934
+ - The helper count shows the number the Harness enables instead of a fixed 2.
1014
935
 
1015
- ### Experiment loops and test audits
936
+ ## v1.9.1 - 2026-10-03
1016
937
 
1017
- - The guard covers experiment-loop tools that an optional Pi package can add. `run_experiment` runs its command through `bash -c` itself, so the guard checks that command like `bash` (protected paths, the exec policy, confirmations, read-only profiles). `log_experiment` commits every change when an idea is kept and erases every uncommitted change otherwise, outside the guard, so `init_experiment` and `log_experiment` run only on an `experiment/` branch or a linked worktree, and `init_experiment` only with nothing uncommitted outside `.auto/`. A loop config that moves the commands to another folder is refused. The dashboard shows an experiment run as the command it runs.
1018
- - New packaged skill `test-audit` (`/skill:test-audit`, also chosen by the model when it writes or changes tests): decide whether a new test earns its place, and find tests that cost more than they protect, with a read-only review table before any edit.
938
+ **Scout and verify helpers, web search for every company role.** Two more company helpers, web search for every role through the team's search pool, and type checks and end-to-end tests in the sandbox.
1019
939
 
1020
- ### Guard cleanup
940
+ ### Added
1021
941
 
1022
- - Removed the guard code that only ran with a task contract: the completion hook, task change and verification recording, the task-bound branches of tool authorization (read-only task rules, opaque-shell rule, semantic repair, phase decisions, performance review), and the phase-tool, semantic-repair and independent-acceptance runtimes it created. The guard went from 4993 to 4139 lines; protected and read-only paths, permission profiles, the context budget, the stale-edit check and confirmations are unchanged.
1023
- - Reopening a session that ran a task before 1.9.0 no longer resumes, re-binds or warns about that task; its records stay as history.
942
+ - Scout reads the project only and answers with `file:line` facts; verify runs checks offline and rates each claim with evidence.
943
+ - Company `web_search` uses the team's search pool for every role, so roles on API-key models can search too.
1024
944
 
1025
- ### Models
945
+ ### Improved
1026
946
 
1027
- - Added reviewed Sonnet 5.5 metadata to explicit Claude/full model-scope setup on Pi 0.87.1: native 1M context, 128K output, adaptive thinking, no unsupported off/minimal modes or temperature override. Existing custom endpoints and model entries are preserved. This does not establish account entitlement.
1028
- - Included Sonnet 5.5 and Opus 5.5 in model selection presets. Agent Watch can supply the same model through a Studio key without changing personal authentication.
947
+ - A command's own timeout, up to 30 minutes, now extends the 10-minute limit.
1029
948
 
1030
- ### Tests and evidence
949
+ ### Fixed
1031
950
 
1032
- - Retired the test suites that only exercised the task contract (task lifecycle, acceptance gating, workflow dispatch and the scripted production journeys that asserted task records); they remain at commit 85f76db. Security assertions that used a task as setup were rewritten to run without one, and the reconnect, lost-receipt and single-turn HTTP/WebSocket journeys now run as freeform turns.
1033
- - The historical P3 phase-tool counterfactual reports `counterfactual-baseline-retired` instead of a ratio, because its baseline tools no longer exist.
1034
- - Benchmark and journey results published for earlier releases were measured with task contracts and are historical.
1035
- - Live verification on the installed release: 9 personal dashboard scenarios and 4 company scenarios (plan, checks and review; Stop during the review; a network install after approval; a message sent during a turn) pass; 27/27 browser tests.
1036
- - A busy test fixture that ignores SIGTERM now exits when its test runner is killed, instead of spinning a CPU core.
1037
- - Docs site: an Ecosystem page (Piagent, Agent Watch, Agent Studio), a 1.9.0 What's new with dashboard screenshots, and pages that still described the task contract updated. The screenshots are served by the site and not shipped in the npm package.
951
+ - Type checks, test runners and end-to-end suites that the sandbox used to stop now run, with credential files hidden.
952
+ - `piagent-install` and `piagent-setup` no longer suggest commands that 1.9.0 retired, which would have started a paid turn.
1038
953
 
1039
- ### Install and update
954
+ ## v1.9.0 - 2026-10-02
1040
955
 
1041
- ```sh
1042
- npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1
1043
- npm install -g --ignore-scripts @piagent/platform@1.9.0
1044
- piagent-install --stable
1045
- piagent-doctor --offline
1046
- ```
956
+ **Freeform sessions and the team Harness.** The task contract and workflow commands are gone: you ask in plain language, the guard checks every tool call, and company mode runs the team's Harness.
1047
957
 
958
+ ### Breaking changes
1048
959
 
1049
- ## v1.8.0 - 2026-09-23
960
+ - Retired the task contract and `/workflow`, `/fresh`, `/onboard` and related commands; ask in plain language instead.
1050
961
 
1051
- - Pinned Pi host and Pi AI to 0.87.1 so Codex-authenticated sessions and the WebUI can list GPT-6 Astra, Sol, and Luna. Pi's authenticated catalog remains the authority for availability and supported thinking levels.
1052
- - Added a new parent-routing map: Luna Medium for bounded work, Sol Medium/High for everyday and higher-risk work, and Astra Extra High for broad ambiguous work. Parent routing stays off by default; explicit model pins remain unchanged. If a GPT-6 target is unavailable, the router records a legacy 5.6 fallback instead of silently substituting it. The historical v1 mapping and benchmark corpus remain frozen.
1053
- - New setup and WebUI sessions prefer GPT-6 Sol High when authenticated. Existing sessions and explicit user settings are not rewritten by the package. Astra's unsupported `off` level is omitted from WebUI choices.
1054
- - Verified the release without paid provider turns; the prior 108-session comparison is historical evidence for v1.7.1, not a GPT-6 performance or token-saving claim.
962
+ ### Added
1055
963
 
1056
- ### Install and update
964
+ - Company sessions run the team's Harness from Studio: plan, checks and review each turn, suggested or required, with bounded fix loops.
1057
965
 
1058
- ```sh
1059
- npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.87.1
1060
- npm install -g --ignore-scripts @piagent/platform@1.8.0
1061
- piagent-install --stable
1062
- piagent-doctor --offline
1063
- ```
966
+ ### Improved
1064
967
 
1065
- ## v1.7.1 - 2026-09-23
968
+ - When every company model account is busy, a request waits in line for up to 20 minutes instead of failing.
1066
969
 
1067
- The v1.7.0 tag was not published: both tag workflow attempts reached the
1068
- 40-minute macOS job limit during offline verification, even though the same
1069
- commit passed the pull-request matrix. v1.7.1 keeps the runtime and benchmark
1070
- boundary below and raises that CI limit to 75 minutes. No additional provider
1071
- sessions were run.
1072
-
1073
- ### Session recovery, context, and accounting
1074
-
1075
- - Updated the supported Pi host to 0.86.1. Preserved the selected model and
1076
- thinking level while correcting SDK lifecycle, usage, and WebUI settlement.
1077
- - Added `piagent_wait` for requested pauses inside an open session. The local
1078
- timer does not call the model while waiting; cancellation, session changes,
1079
- and replay retain explicit interrupted or pending state.
1080
- - Bound task usage, edit/verifier timing, and context delivery to the active
1081
- task. Filtered unsupported context files before selection and kept scoped
1082
- native-read recovery when no context pack can be delivered.
1083
- - Extended source-bound acceptance and bounded executor checks, preserving
1084
- rejection of verified failures and finite handoff for unsupported work.
1085
- - Set acceptance proof to diagnostic by default. Unproved criteria remain
1086
- pending with an explicit no-quality-claim completion note; task contract,
1087
- scope, passing verification, and trace remain hard gates. Reviewed package
1088
- policies can select strict `enforce` mode when required.
1089
-
1090
- ### Diagnostic benchmark closure
1091
-
1092
- - Separated recovered command errors from terminal failures in the controlled
1093
- comparison collector and added exact failed-attempt selection for diagnostics.
1094
- - Clarified three public task contracts and verification examples, and corrected
1095
- reconnect grading to compare public state while allowing internal cleanup.
1096
- - The historical 108-session run remains 49/54 Piagent PASS and 45/54 comparison
1097
- PASS. A separate selected rerun passed all 14 formerly failed attempts;
1098
- the other 94 attempts were not rerun. Inputs changed for three scenarios, so
1099
- these results are not combined into a new 108-session score.
1100
- - The selected rerun used 640,121 fresh tokens and 3,010,425 including cache.
1101
- Fresh usage increased 23.0% across that subset. This release makes no new
1102
- aggregate token-saving or production-performance claim. The operator closed
1103
- the paid benchmark cycle; release validation does not open provider sessions.
1104
-
1105
- ### Install and update
1106
-
1107
- ```sh
1108
- npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.86.1
1109
- npm install -g --ignore-scripts @piagent/platform@1.7.1
1110
- piagent-install --stable
1111
- piagent-doctor
1112
- ```
970
+ ### Fixed
1113
971
 
1114
- ## v1.7.0 - not published
972
+ - Approved network commands always failed with `ENOTFOUND`; `run_with_network` now resolves host names.
973
+ - The dashboard was slow with many conversations and left messages sent after Stop unconfirmed; both are fixed.
1115
974
 
1116
- The annotated tag exists, but its macOS tag gate timed out twice at 40 minutes.
1117
- The publish job was skipped, and no `@piagent/platform@1.7.0` npm package or
1118
- GitHub Release was created. Use v1.7.1 for installation.
975
+ ### Security
1119
976
 
1120
- ## v1.6.1 - 2026-08-26
977
+ - Agent Studio credentials are now redacted in edit previews, command output and the gateway stream.
1121
978
 
1122
- ### Runtime continuity and truthful WebUI state
1123
-
1124
- - Kept queued same-session work under one operation identity and prevented a
1125
- pending durable task from emitting a completed message or a success bubble.
1126
- Final-looking drafts remain hidden until the task reaches a terminal state,
1127
- preserving user-message then assistant-response ordering without a stale
1128
- processing indicator.
1129
- - Reconciled Activity from canonical tool evidence. Handled multi-target search
1130
- warnings finish normally, nested result envelopes are classified correctly,
1131
- and rejected or evidence-free helper calls remain visible as failures instead
1132
- of later replaying as passed.
1133
- - Captured the latest real operator request for model-owned task startup while
1134
- bounding and redacting the durable copy, so attachments and workflow wrappers
1135
- no longer replace the user's actual intent.
1136
-
1137
- ### Safe external source review
1138
-
1139
- - Detects GitHub, GitLab and Bitbucket references and activates only the minimal
1140
- source-checkout surface needed for a review. A successful checkout grants
1141
- session-scoped read access to that exact canonical tree, with an eight-source
1142
- bound and automatic cleanup at session end.
1143
- - Preserved protections around shared caches, sibling paths, symlink escape,
1144
- credentials, `.env`, `.git` and all mutation paths. Read-only inspection may
1145
- use bounded `read`, `grep`, `find` and `ls` flows without widening the project
1146
- mutation contract.
1147
-
1148
- ### Solo-first cost and context controls
1149
-
1150
- - Added direct subagent preflight with a one-helper ceiling, bounded calls,
1151
- turns and runtime, read-only role enforcement, no automatic retry/fork/worker
1152
- expansion, and truthful durable helper usage. Repeated helper results are
1153
- compacted without changing the model or thinking level.
1154
- - Hardened adaptive context accounting, exact verifier reuse, task-evidence
1155
- refresh and bounded runtime emission so token-saving decisions fail closed
1156
- when evidence is incomplete and cannot be relabeled as a Codex-relative cost
1157
- claim.
1158
-
1159
- ### Benchmark assurance
1160
-
1161
- - Added provider-free runtime-conformance and Codex-relative efficiency gates,
1162
- bound token/cost evidence to exact workload and provider attempts, and kept
1163
- the historical v1.6.0 production result explicitly separate from any new
1164
- subscription-spend or 30–40% cost claim.
1165
- - Preserved the 108-session production gate as an operator-authorized quota
1166
- step; this release ships runtime and benchmark safeguards without claiming a
1167
- new provider-backed result.
979
+ Requires: Pi 0.87.1.
1168
980
 
1169
- ## v1.6.0 - 2026-08-24
981
+ ## v1.8.0 - 2026-09-23
1170
982
 
1171
- ### Context efficiency and source safety
1172
-
1173
- - Replaced overlapping automatic discovery and criterion snapshots with one
1174
- criterion-aware initial pack. It prioritizes explicit targets and their
1175
- linked tests, excludes unrelated graph-only files, uses bounded snippets for
1176
- large files and records content/payload receipts for every injected item.
1177
- - Corrected context-efficiency accounting so exact repeated reads are measured
1178
- only within a session/task/model/thinking partition, missing evidence remains
1179
- visible as unavailable, fallback rereads do not reward retrieval ranking, and
1180
- tool-schema share is reported against the complete system-plus-tool prefix.
1181
- Duplicate-output and retrieval-confidence rates now exclude unclassified
1182
- historical rows and expose their partial coverage instead of treating them
1183
- as zero waste. The aggregate context-waste score is now `null` unless every
1184
- weighted telemetry lane is complete; partial data is labeled only as a
1185
- diagnostic estimate.
1186
- - Sanitized automatic source snapshots before provider injection while
1187
- preserving pure dynamic credential references. Sensitive literals, including
1188
- short values and numeric fallbacks, are redacted in common source syntax and
1189
- structured YAML, XML, HTML, CSS and Objective-C inputs with line-count-
1190
- preserving receipts. A redacted item retains only a digest of the sanitized
1191
- text; neither the raw-content digest nor another guessable verifier for the
1192
- original bytes is persisted. Sanitization of deeply nested calls is bounded.
1193
- - Preserved one planned criterion source and its focused test when retrieval is
1194
- unavailable or stale, and retained complete per-item receipts for automatic,
1195
- command and tool-delivered context packs.
1196
- - Cleared task identity, repeated-result state and pending context delivery at
1197
- terminal boundaries while preserving terminal-turn usage attribution. A new
1198
- request or workflow in the same session now starts clean, including after a
1199
- missing binding or terminal session restart.
1200
-
1201
- ### Forty-percent benchmark contract and spend control
1202
-
1203
- - Raised the canonical production-v1 contract to require a fixed-workload,
1204
- family-clustered fresh-token upper-95 ratio at or below `0.60`. The estimator
1205
- includes all three predeclared attempts per surface in every family, including
1206
- exact provider-started failed-attempt usage, and does not condition token
1207
- measurement on task outcome. Every declared scenario/repeat must still have
1208
- an exact finite grade pair with no Piagent quality regression, and all Piagent
1209
- sessions must satisfy the independent continuity gates.
1210
- - Added a separate GPT-5.6 Luna API-equivalent text-token cost diagnostic. It
1211
- prices exact text-token buckets, remains distinct from OAuth/provider billing,
1212
- and does not block the token-focused production claim.
1213
- - Added duration comparison globally, by workload band and by family as
1214
- observational evidence. The canonical contract allows Piagent to be slower
1215
- when fresh-token, paired-intelligence and task-continuity gates still pass.
1216
- - Froze production-v1 to Luna Medium and a ledger-bound S0/12/36/72/108 spend
1217
- sequence. Only S108 is claim-eligible; every earlier pause recomputes a
1218
- provider-free diagnostic and prints the exact bounded resume command.
1219
- - Bound seed, surfaces, model, thinking, repeats, zero retries, paired terminal
1220
- stop and clean source identity before paid work. Reserved built-in suite IDs
1221
- cannot be impersonated by external suites, including through direct report
1222
- summarization.
1223
- - Added a privacy-safe causal context receipt for every Piagent measurement.
1224
- The receipt binds telemetry provenance, current prompt/terminal order and the
1225
- exact offer/delivery/injection lifecycle before dropping paths, hashes and
1226
- identifiers. Missing, malformed, orphaned or mismatched evidence preserves
1227
- the paid ledger row but blocks S12 advancement and the final token claim.
1228
- S12 now reports aggregate pack tokens, zero-selection reasons, managed-prefix
1229
- compaction, successful direct fallback reads and shell-call exposure.
1230
- - Reconstructs a missing terminal stop from the accepted ledger before any paid
1231
- resume, so a crash between the durable append and stop marker cannot spend the
1232
- rest of an authorized window.
1233
- - Finalizes a complete ledger or valid final post-guard WAL without live auth,
1234
- provider preflight or installed Pi/Codex executables. Finalization rehashes the
1235
- current candidate, suite, runtime-dependency tree and ledger while reusing the
1236
- frozen command/auth/preflight identities bound to the accepted measurements.
1237
- - Preserved the completed 108-session r3 ledger as observational evidence under
1238
- its original successful-pair contract. It is not retroactively promoted: only
1239
- a new provider run on the exact final candidate, after this estimand and suite
1240
- digest are frozen, can approve a 40% claim.
1241
-
1242
- ### Runtime intelligence and context integrity
1243
-
1244
- - Bound context evidence to the exact turn, session and task run that observed
1245
- it. Planning selections no longer masquerade as delivered context, and stale
1246
- evidence cannot cross a task boundary or complete a later task.
1247
- - Added bounded context-efficiency telemetry, delivery qualification, prefix
1248
- accounting and provider-wire fingerprints without exposing prompts,
1249
- credentials or raw provider payloads.
1250
- - Preserved authenticated Codex model identifiers and supported reasoning
1251
- levels end to end. New installations default visibly to GPT-5.6 Sol with
1252
- High thinking while still allowing the user to choose another available
1253
- model for any message or session.
1254
- - Added one fail-closed CAP-12 correction after a current exact verifier when
1255
- the model discovers an omission in a file it already authored in the same
1256
- task/run/session. The runtime opens repair only after an exact structured
1257
- mutation succeeds, permits no second source edit, and requires the exact
1258
- verifier again before completion.
1259
-
1260
- ### WebUI continuity and operator clarity
1261
-
1262
- - Added a canonical live-state bootstrap and replay-gap recovery path so reloads
1263
- and multiple browser tabs agree on the running operation before reporting the
1264
- Gateway as live.
1265
- - Added inactivity, absolute-runtime, termination and projection watchdogs.
1266
- Concurrent Stop requests share one termination, and uncertain ownership is
1267
- quarantined instead of being projected as an idle session.
1268
- - Kept the conversation surface success-only: drafts, tool failures, retries,
1269
- completion-gate work in progress and abort details stay in Activity. Empty or
1270
- non-rendering provider output can no longer create a blank success bubble.
1271
- - Made operation settlement first-terminal-wins and retained recent failures
1272
- independently from high-volume event traffic, preventing a retry or catalog
1273
- refresh from presenting contradictory outcomes.
1274
-
1275
- ### Deeper benchmark and assurance contracts
1276
-
1277
- - Expanded the deep-logic benchmark with a multi-package temporal billing close
1278
- problem, stricter held-out variants, provider-wire checks, usage provenance,
1279
- statistical comparison gates and explicit Codex CLI controls.
1280
- - Hardened benchmark accounting so unknown usage, infrastructure retries or an
1281
- unmatched provider attempt cannot support a token or production claim.
1282
- - A provider-backed token-reduction claim is published only when a complete
1283
- zero-retry 108-session run passes on the exact clean tagged candidate. An
1284
- interrupted, historical or different-SHA run remains diagnostic evidence.
983
+ **GPT-6 Astra, Sol and Luna models.** Pins Pi to 0.87.1 so authenticated sessions and the WebUI can list GPT-6 Astra, Sol and Luna, and adds a GPT-6 routing map.
1285
984
 
1286
- ## v1.5.5 - 2026-08-21
985
+ ### Added
1287
986
 
1288
- ### WebUI command execution hotfix
1289
-
1290
- - Fixed provider tool-call identifiers containing characters outside the
1291
- public WebUI reference alphabet. Gateway approvals now bind those opaque
1292
- identifiers to private deterministic references instead of falling back to
1293
- a terminal confirmation that does not exist in WebUI.
1294
- - Prevented search commands such as `rg` and `grep` from being mistaken for
1295
- migration execution merely because their search arguments contain
1296
- `migrate`. Real migration commands still require explicit confirmation.
1297
- - Made Stop cancel the exact pending approval before aborting the model
1298
- operation, so a session cannot remain stuck waiting for an approval after
1299
- the user stops it. Gateway approval failures now deny immediately rather
1300
- than waiting indefinitely.
1301
- - Corrected activity reporting so a tool call remains requested until native
1302
- execution actually starts, and strengthened Dashboard restart to wait for
1303
- the previous process to exit instead of silently reusing a hung instance.
987
+ - GPT-6 Astra, Sol and Luna appear in authenticated sessions and the WebUI; Pi's catalog decides availability.
988
+ - New parent-routing map: Luna Medium for bounded work, Sol Medium/High for everyday work, Astra Extra High for broad work.
1304
989
 
1305
- ## v1.5.4 - 2026-08-20
990
+ ### Improved
1306
991
 
1307
- ### WebUI workflow hotfix
1308
-
1309
- - Fixed new WebUI sessions incorrectly reporting
1310
- `session-command-effect-unknown` even though Pi had accepted the selected
1311
- workflow and started the model turn. The Gateway now retains operation
1312
- ownership across Pi's deferred workflow dispatch and settles it only after
1313
- the nested agent turn reaches its canonical lifecycle boundary.
1314
- - Added a fail-safe reconciliation path when the Gateway can identify the
1315
- created session but cannot yet prove the command effect. The UI opens the
1316
- known session, explains that synchronization is in progress, and explicitly
1317
- prevents a blind resend that could run the same request twice.
1318
- - Localized internal uncertainty status and reconciled workflow-prefixed
1319
- persisted messages with their optimistic UI form so completed turns no
1320
- longer appear twice in the transcript.
1321
- - Prevented a slow background model-catalog refresh from replacing a model or
1322
- thinking choice the user had just made. Session-option controls now reject
1323
- stale responses, and the browser regression test deliberately reproduces the
1324
- delayed-response ordering that previously left the change button disabled.
992
+ - Parent routing stays off by default and explicit model pins are unchanged.
993
+ - New setup and WebUI sessions prefer GPT-6 Sol High; existing sessions and explicit settings are not rewritten.
994
+ - If a GPT-6 target is unavailable, the router records a 5.6 fallback instead of substituting it silently.
1325
995
 
1326
- ## v1.5.3 - 2026-08-20
996
+ Requires: Pi 0.87.1.
1327
997
 
1328
- ### WebUI and Terminal parity
1329
-
1330
- - Brought the Terminal workflow surface into Session Hub with ten explicit
1331
- per-message workflows. A workflow no longer binds the whole session: after a
1332
- message is sent, the composer returns to Freeform so the same conversation
1333
- can move to a different task under the user's control.
1334
- - Simplified the new-session composer around the essential project, model and
1335
- send controls. Advanced workflow, thinking, permission and attachment choices
1336
- now sit behind a progressive `+` control, while the default is named
1337
- explicitly as GPT-5.6 Sol with High thinking.
1338
- - Added typed Project Controls for runtime and usage inspection, onboarding and
1339
- profile state, Context Engine, memory and MCP governance. Read-only actions
1340
- do not open a model turn; mutating and semantic-compaction actions require an
1341
- explicit confirmation and retain the existing session and revision guards.
1342
-
1343
- ### Deeper logic evaluation
1344
-
1345
- - Added the `deep-logic-v1` diagnostic suite: six generated-variant, large
1346
- problems covering event reconciliation, dependency scheduling, layered
1347
- policy, context graphs, resumable streams and transactional configuration.
1348
- Its default paired run uses Piagent and `codex-cli` on GPT-5.6 Luna Medium for
1349
- 24 model sessions.
1350
- - Expanded `capability-v1` from four to six multi-component families, including
1351
- durable session control and causal timeline recovery, with 28 contract
1352
- clauses and 69 atomic checks plus stronger mutation and equivalent-solution
1353
- validation.
1354
- - Added a provider-free WebUI parity benchmark for workflows, runtime controls,
1355
- contracts, security, Chromium flows and bounded performance stress before
1356
- any model quota is spent.
998
+ ## v1.7.1 - 2026-09-23
1357
999
 
1358
- ## v1.5.2 - 2026-08-18
1000
+ **Pi 0.86.1, requested pauses and diagnostic acceptance.** Replaces the unpublished v1.7.0, updates Pi to 0.86.1, adds a wait tool for requested pauses and makes acceptance proof diagnostic by default.
1359
1001
 
1360
- ### Fixed
1002
+ ### Added
1361
1003
 
1362
- - The new-chat composer now accepts a dragged or pasted document, not only one
1363
- chosen through the paperclip. The file picker already carried attachments into
1364
- a new session; drag and drop was the one entry point that silently did
1365
- nothing, so a document dropped on that screen was lost with no message.
1366
- - A dropped file that misses the composer no longer navigates the Gateway away
1367
- from the page, matching the guard the session composer already had.
1004
+ - Added a wait tool for pauses you request inside a session; it does not call the model while waiting.
1368
1005
 
1369
- ## v1.5.1 - 2026-08-17
1006
+ ### Improved
1370
1007
 
1371
- ### Release repair
1372
-
1373
- - Supersedes v1.5.0, which was tagged but never published: its release matrix
1374
- failed on macOS, so the publish job never ran and the registry stayed on
1375
- v1.4.1. The content of this release is v1.5.0's, plus the fix below.
1376
- - Fixed a race in the WebUI composer end-to-end test. Changing the model right
1377
- after changing thinking acknowledged the effect scope without waiting for the
1378
- panel to clear it, so on a slower runner the reset landed afterwards and left
1379
- the confirm button permanently disabled.
1380
-
1381
- ## v1.5.0 - 2026-08-17
1382
-
1383
- ### Document workspace and attachments
1384
-
1385
- - Added a bounded document workspace to the Session Hub for project Markdown,
1386
- text, PDF and DOCX material, including safe extraction, redaction,
1387
- truncation, protected-path enforcement and readable in-browser previews.
1388
- - Added document and image attachment staging to New chat and active-session
1389
- composers. Sent files remain visible as compact durable cards instead of
1390
- dumping extracted document bodies into the conversation.
1391
- - Moved attachment storage and validation into the shared core runtime so the
1392
- terminal package and WebUI use one authority boundary, one reservation
1393
- protocol and the same session identity rules.
1394
-
1395
- ### Conversation and session experience
1396
-
1397
- - Replaced large tool-result blocks in chat with a compact live activity
1398
- timeline for file reads, image inspection, commands, edits, search, context
1399
- optimization and verification. Raw tool labels remain available on demand in
1400
- the Activity inspector.
1401
- - Added deterministic, zero-model-turn session titles and previews. Internal
1402
- fresh-session routing commands are hidden from the transcript and catalog,
1403
- while user-visible titles stay bounded and preserve redaction markers.
1404
- - Hid delegated runtime helper sessions from the user conversation catalog and
1405
- kept attachment metadata, live events and resumed session projections bound
1406
- to the exact public session.
1407
-
1408
- ### Project import and capability visibility
1409
-
1410
- - Hardened native project-folder selection across macOS and Linux, including
1411
- multi-folder import and fail-closed cancellation or unsupported-host results.
1412
- - Added exact Web search and image-input capability facts to Providers & models
1413
- without copying provider credentials or adding a model turn to dashboard
1414
- inspection.
1415
-
1416
- ### Contracts, security and release coverage
1417
-
1418
- - Added the versioned document-workspace contract and extended attachment,
1419
- transcript, session-command and capability contracts with bounded additive
1420
- fields and generated TypeScript projections.
1421
- - Added regression coverage for large/invalid documents, attachment claim and
1422
- retry, stale session revisions, Linux project import, hidden helper sessions,
1423
- durable file cards and live tool activity.
1424
- - Kept every browser-facing file, title, provider fact and tool label behind the
1425
- existing redaction, protected-path, schema and capability-integrity gates.
1008
+ - Updated Pi to 0.86.1, keeping the selected model and thinking level while correcting usage and WebUI settlement.
1009
+ - Acceptance proof is diagnostic by default: unproved criteria stay pending; strict mode remains available by policy.
1010
+ - Task usage, timing and context delivery are bound to the active task, and unsupported context files are filtered out.
1011
+ - The release CI limit is raised to 75 minutes after the v1.7.0 macOS gate timed out.
1426
1012
 
1427
- ## v1.4.1 - 2026-08-17
1013
+ Requires: Pi 0.86.1.
1428
1014
 
1429
- - Local installs now synchronize the terminal helper and WebUI Gateway from the same checkout before registering the Pi package, preventing a stale global Gateway from enforcing older session/task lifecycle rules.
1015
+ ## v1.7.0 - not published
1430
1016
 
1431
- ### Integrity boundary
1017
+ **Not published; use v1.7.1.** The tag exists, but its macOS gate timed out twice at 40 minutes, so no npm package or GitHub Release was created.
1432
1018
 
1433
- - The runtime integrity graph skipped shell entrypoints entirely, so a pinned command could execute an unpinned program: `piagent-usage` ran a 567-line reader of `~/.pi/agent/sessions/**` that the lock had never seen, because the path was built from `$SCRIPT_DIR` and the repository-relative literal never appeared in the source. Shell sources are now scanned, and a sibling reached through a computed directory is followed.
1019
+ ### Improved
1434
1020
 
1435
- - The published package ships the built browser bundle and not the sources it came from, so on an installed platform that 725 KB of JavaScript could not be regenerated or checked against anything — while it runs inside the origin that holds the session cookie and the CSRF token, with the authority to drive session commands, source mutation and provider auth. The server that serves it was pinned; what it served was not. The served bundle is now pinned, document included, because the document names which script runs.
1021
+ - No `@piagent/platform@1.7.0` package exists; install v1.7.1 instead.
1436
1022
 
1437
- - A TypeScript module imported by its emitted name — `./x.js` for `x.ts`, the ordinary TypeScript convention — resolved to nothing and was dropped in silence. No module was outside the lock because of it, but a module that decides what the guard enforces could have been, while the graph still claimed to be complete.
1023
+ ## v1.6.1 - 2026-08-26
1438
1024
 
1439
- ### Agent control
1025
+ **Truthful WebUI state and read-only source review.** The WebUI no longer shows success before a task ends, Git host links can be reviewed read-only, and subagent use is capped at one helper.
1440
1026
 
1441
- - Command-only test/build/typecheck/package requests now enter an execution-capable governed task even when the operator forbids source edits; read-only remains a strict inspection mode instead of failing halfway through the first verifier command.
1027
+ ### Added
1442
1028
 
1443
- - A terminal Task Contract used to terminate the conversation with it: WebUI swallowed the next operator message before Pi persisted it, the Gateway could only report `session-command-effect-unknown`, and `piagent_task_start` then demanded a fresh Pi session. Conversations may now bind sequential Task Contracts. The closed task remains immutable, paused/stopping tasks remain closed, and the terminal boundary admits only new conversation input plus the exact successor-task start transition.
1029
+ - A GitHub or other Git host link can be checked out for read-only review, up to eight sources, cleaned up at session end.
1444
1030
 
1445
- - `OwnedWorkCeilings` advertised eight limits and six of them were never read: the per-role ceilings were real but fixed at one apiece, so raising `maxScoutPasses` in a profile did nothing while `maxTotalHelpers` beside it took effect. Half-honoured configuration reads as working configuration. The ceilings are now read from the object the caller passes; every default is one, so no shipped behaviour changes, and automatic mode is pinned against widening.
1031
+ ### Improved
1446
1032
 
1447
- - A blocked tool call is the only conversation most operators have with this policy, and it was one-sided: of 43 distinct refusals, three said what to do next. Remedies are now attached at the single point every decision leaves through, so a refusal added later is answered without anyone remembering to. The refusal that stops the whole session says which command explains it.
1033
+ - Subagents are limited to one read-only helper with bounded calls, turns and runtime, and no automatic retry.
1448
1034
 
1449
- - `piagent explain '<command>'` reports conclusive static refusals and the guard readers that found them. A static pass is now explicitly `indeterminate` until the live Pi runtime evaluates Task Contract, scope, permission, lifecycle, approval and budget state; the standalone CLI can no longer issue an "exact allow" that the real guard later blocks. `--scope` lists the static boundary in effect.
1035
+ ### Fixed
1450
1036
 
1451
- ### Redaction and evidence
1037
+ - A pending task could show a completed message or success bubble; drafts now stay hidden until the task ends.
1038
+ - Rejected or evidence-free helper calls could later show as passed in Activity; they now stay visible as failures.
1039
+ - Attachments and workflow wrappers no longer replace your actual request when a task starts.
1452
1040
 
1453
- - An npm token was recognised only where something named it, so `//registry.npmjs.org/:_authToken=npm_…` — the whole of an `.npmrc`, and what a failing publish prints — went through unredacted. Every other provider here is matched by the shape of its token.
1041
+ ## v1.6.0 - 2026-08-24
1454
1042
 
1455
- - Redaction runs before tool-result compaction, and that order was the only thing keeping a credential out of the capture written to project state. Nothing pinned it; reversing the two calls would have written credentials to disk and passed every test.
1043
+ **Leaner context, redacted snapshots, steadier WebUI.** One criterion-aware context pack replaces overlapping discovery, source snapshots are redacted before reaching the model, and the WebUI recovers after reloads.
1456
1044
 
1457
- - An observation that states neither an exit code nor an error flag no longer satisfies a claim of success. It is unreachable through the recorded shapes, but a reader of the function that guards forged verification should not have to prove that.
1045
+ ### Improved
1458
1046
 
1459
- ### Cost and clarity
1047
+ - One criterion-aware initial context pack replaces overlapping discovery and puts explicit targets and their tests first.
1048
+ - New installations default to GPT-5.6 Sol with High thinking; you can still pick another model per message or session.
1049
+ - Reloads and multiple browser tabs agree on the running operation, and concurrent Stop requests share one termination.
1050
+ - A token-reduction claim is published only after a complete zero-retry 108-session run on the exact tagged release.
1460
1051
 
1461
- - `piagent-usage` reports fresh tokens and the cache hit rate, using the benchmark's own definition of a fresh token so the terminal and the published measurement cannot mean two different things. The rate is reported beside the count and never instead of it: in the published benchmark the baseline surface held the higher hit rate while spending more than twice the fresh tokens.
1052
+ ### Fixed
1462
1053
 
1463
- - Capability verification derived the ancestor set on every cache hit, which at 296 pinned files cost more than every `lstat` it performed put together. Deriving it once per snapshot took a hit from 4.28 ms to 1.61 ms with no loss of tamper detection.
1054
+ - Empty provider output could create a blank success bubble in the conversation; it no longer does.
1464
1055
 
1465
- - The WebUI opens in the language the browser asked for instead of always starting in Vietnamese; the confirmation for full access focuses the safe choice, so a reflex Enter dismisses it rather than granting it; and the file a diff shows is derived from the list that is loaded, so no later clear can leave the pane asking for a file beside a list holding one.
1056
+ ### Security
1466
1057
 
1467
- ### Install and uninstall
1058
+ - Automatic source snapshots are redacted before reaching the provider, including short and numeric secret values.
1468
1059
 
1469
- - Running the documented two-command install downgraded the machine-wide Pi package to whatever pin the project being initialised happened to carry, including a project the operator only meant to open once. One resolved value served both scopes and read the project pin first, so a pin that is authority over its own project quietly became authority over the machine. The two scopes now resolve separately: the global install takes the running helper, the project keeps its pin, an explicit `--package-source` still beats both, and a divergence between them is printed instead of silently resolved.
1060
+ ## v1.5.5 - 2026-08-21
1470
1061
 
1471
- - Uninstall removed nothing on any machine whose helper sits under a non-default npm prefix — the fallback the installer takes when the configured global root is not writable, and whatever `piagent-update --npm-prefix` was given. `npm uninstall -g` resolves against the configured prefix, so the run exited `0` and reported completion over an install that was still there. The prefix is now derived from where the running helper actually is, the same way the updater derives it, and the follow-up command printed for the operator to copy carries that prefix too. An npx cache root is still never claimed, because it owns no bin on anyone's PATH.
1062
+ **WebUI command execution hotfix.** Fixes approvals that fell back to a missing terminal prompt, search commands mistaken for migrations, and sessions stuck after Stop.
1472
1063
 
1473
- ### Agent control coverage
1064
+ ### Fixed
1474
1065
 
1475
- - A stop request only counts as pending if its `commandId` is truthy, so an empty one records the stop and then reports nothing pending — the single outcome an operator pressing stop must never get. The journal writers never check the shape, and the only thing preventing it was a regex in the browser command validator that no test named. Malformed identifiers are now pinned as rejected at that boundary, together with the proof that a well-formed one still passes, so the guard cannot be loosened or widened into blanket refusal without a test failing.
1066
+ - Some tool calls fell back to a terminal confirmation that does not exist in the WebUI; they are now approved in the WebUI.
1067
+ - `rg` and `grep` with `migrate` in their arguments were treated as migrations; real migrations still need confirmation.
1068
+ - Stop could leave a session waiting on an approval; it now cancels the pending approval first.
1069
+ - Dashboard restart could silently reuse a hung instance; it now waits for the old process to exit.
1476
1070
 
1477
- ### The dashboard starts without the MCP adapter
1071
+ ## v1.5.4 - 2026-08-20
1478
1072
 
1479
- - `piagent dashboard` could not start on any machine where `pi-mcp-adapter` was not installed under the agent directory — an install run with `--no-mcp`, or anyone trying the package through `npx` before setting anything up. The gateway is spawned with `PIAGENT_PINNED_TS_TRANSFORM_ROOT` pointing at that adapter, and the TypeScript loader called `realpath` on it before deciding anything. That function answers one question — is the file being loaded inside the pinned adapter — and it threw instead of answering "no", so the throw escaped the loader on the first `.ts` file of any kind and killed the process. It now answers "no", which falls back to `strip`: the stricter of the two modes, so this can only ever refuse a transform, never grant one. The exception for the reviewed adapter, its exact version, and containment within its root are all unchanged.
1073
+ **WebUI workflow hotfix.** New WebUI sessions no longer report an unknown command effect after the turn started, and completed turns no longer appear twice.
1480
1074
 
1481
- - The failure was also unreadable. The gateway child was spawned with its stderr discarded, so a process that died on its first line looked exactly like a slow one: twelve seconds of waiting, then `gateway-start-timeout` and nothing else. The child's stderr is now kept, bounded, and reported, an early exit stops the wait instead of running out the clock, and the two cases are named differently — a process that died and a process that never answered are different problems.
1075
+ ### Improved
1482
1076
 
1483
- ### Bilingual documentation
1077
+ - While sync is still in progress, the UI opens the known session and blocks a resend that could run the request twice.
1484
1078
 
1485
- - The language gate proved a Vietnamese peer existed, which is not the same as saying the same thing: editing the English side and forgetting the other passed every check in this repository, and left a reader with a document describing a design that had changed. Each pair now records the content digest of both sides as of the last time somebody confirmed them consistent, and a side that moves alone fails the gate naming the file that has to follow. A two-sided edit is reported separately, because it is probably a paired edit and calling it drift would teach people to skip the gate. What it cannot do is read the two documents and decide they agree; it records that a human looked.
1079
+ ### Fixed
1486
1080
 
1487
- ### Google Workspace and document conversion
1081
+ - New WebUI sessions reported an unknown command effect although Pi had started the turn; this is fixed.
1082
+ - Completed turns appeared twice in the transcript; they now appear once.
1083
+ - A slow model-catalog refresh could undo a model or thinking change you just made and leave the button disabled.
1488
1084
 
1489
- - Added Google's own remote MCP servers for Drive, Gmail, Docs and Sheets, one per product rather than a single server holding every scope, because that separation is the point: reading a spreadsheet should not cost a grant over Drive and every document in it, let alone the mailbox. Each has its own preset, so the narrowest useful grant is always available.
1490
- - Google Workspace MCP is Developer Preview and has no credentialed Pi OAuth E2E proof in this release. The four entries are marked experimental, print that status through catalog/preset output, and stay out of the generic `documents` preset as well as every default preset. Official endpoints and readonly scopes remain available through explicitly named Google presets for controlled testing.
1085
+ ## v1.5.3 - 2026-08-20
1491
1086
 
1492
- - None of them appear in `core` or `popular`. `core` is what an install writes when nobody names a preset and `popular` is what people pick without reading the list, so an entry in either would hand an operator mail and file access they never chose. A test fails if one leaks in, if a catalog server exposes direct tools instead of going through the approval gate, or if a server that needs credentials ships without saying so.
1087
+ **WebUI and Terminal parity.** The Session Hub gains ten per-message workflows, a simpler new-session composer and Project Controls, plus a new deep-logic benchmark.
1493
1088
 
1494
- - Connecting Gmail changes the threat model rather than extending it: until now the untrusted input reaching an agent was source code, and it becomes any mail anyone can send. The approval gate still stands between a message and an action, but the documentation now states plainly what the product cannot prevent, and recommends read-only scopes and the narrowest preset.
1089
+ ### Added
1495
1090
 
1496
- - Added MarkItDown for converting local `.docx`, `.xlsx`, `.pptx`, `.pdf` and `.html` to Markdown. It runs offline for `file:` URIs, which is the reason to prefer it: a document worth converting is usually one worth not uploading. It is pinned at its published alpha, and needs `uv`.
1091
+ - The Session Hub offers ten per-message workflows; after sending, the composer returns to Freeform.
1092
+ - Project Controls cover runtime, usage, onboarding, Context Engine, memory and MCP; changes ask for confirmation.
1093
+ - Added the `deep-logic-v1` benchmark: six large problems, run with Piagent and `codex-cli` on GPT-5.6 Luna Medium.
1497
1094
 
1498
- ### Adoption measurement
1095
+ ### Improved
1499
1096
 
1500
- - GitHub serves repository traffic as a rolling 14-day window and discards everything older, with no endpoint that returns it. `traffic-snapshot` archives clones, views, referrers and paths daily into growing CSV files on a separate `traffic-data` branch, so the history survives and the product branch is not buried under a row a day. A day still filling when the run happens is overwritten by the next run rather than frozen partial, and a gap under 14 days loses nothing. The traffic endpoints need push access, so a 403 names the exact fix — a fine-grained token with `Administration: read` stored as `TRAFFIC_TOKEN` — instead of leaving a nightly job red.
1097
+ - The new-session composer shows project, model and send; advanced choices sit behind a `+` control.
1098
+ - `capability-v1` grows from four to six families with 69 atomic checks.
1501
1099
 
1502
- - The documentation site now carries Vercel Web Analytics, which is cookieless and stores no browser identifier, so the site still owes no consent banner. The snippet is emitted from the site shell rather than any page, so both locales and every future page inherit it, and a test fails if a generated page ships without it or if a script from another origin appears. The runtime remains free of any network call: `telemetry()` writes locally and the package has no install hook.
1100
+ ## v1.5.2 - 2026-08-18
1503
1101
 
1504
- ### Documentation parity
1102
+ **Drag and drop in the new-chat composer.** A document dragged or pasted onto the new-chat composer is now attached instead of being silently lost.
1505
1103
 
1506
- Four documents restated something the code already knew, and each had drifted. They are now checked against their source, so the next drift fails a test instead of reaching a reader.
1104
+ ### Fixed
1507
1105
 
1508
- - `install-global.sh --help` omitted `--default-model` and `--subagents-model-scope`, which had been accepted for four releases. The help text now carries every flag with its valid values, and the parity check reads the flag list out of the parser.
1106
+ - A document dropped or pasted on the new-chat screen was silently lost; it is now attached.
1107
+ - A file dropped outside the composer no longer navigates the page away.
1509
1108
 
1510
- - The `piagent-usage --json` documentation described two of the six top-level keys. `scope`, `projects`, `tools` and `generatedAt` were undocumented, including the record of which filters produced the report — without which a saved report cannot explain itself. All six are documented with their fields, and compared against the emitted object in both directions.
1109
+ ## v1.5.1 - 2026-08-17
1511
1110
 
1512
- - The architecture documents listed nine physical layers while `architecture/layers.json` enforced fifteen: every WebUI layer was enforced and undocumented, in both languages. The seven are now described with what they own and may not own, alongside why they form a second dependency spine rather than a branch of the first.
1111
+ **Release repair for v1.5.0.** Publishes the content of v1.5.0, which was tagged but never published, plus a fix for a composer test race.
1513
1112
 
1514
- - The team release history stopped at `1.2.11` while releases continued to `1.4.0`, and `1.1.1` had been skipped earlier. Twelve entries were added, and the list is now checked against the changelog from its own oldest entry forward, so a gap anywhere in it fails.
1113
+ ### Improved
1515
1114
 
1516
- - The repository layout in the README showed one package where there are two, leaving `piagent-webui` — the dashboard, its client, server, gateway and ownership layers — invisible to anyone reading the map before the tree.
1115
+ - Ships everything from v1.5.0, whose macOS release matrix failed before publishing.
1517
1116
 
1518
- ## v1.4.0 - 2026-08-15
1117
+ ### Fixed
1519
1118
 
1520
- ### Local Session Hub and WebUI
1521
-
1522
- - Added a local, one-per-profile Gateway and `piagent dashboard` experience for
1523
- creating, reopening, resuming, renaming, pinning, archiving, unarchiving, and
1524
- forking durable Pi sessions without starting an extra model turn for views.
1525
- - Rebuilt the browser client as a conversation-first MUI application with a
1526
- compact composer, project and model controls, light/dark themes, Vietnamese
1527
- and English UI, responsive layouts, and an Agent Inspector for tasks, source
1528
- changes, activity, verification, usage, and handoff evidence.
1529
- - Added exact Gateway-owned chat streaming, held-message queues, bounded
1530
- attachments, model/thinking controls, lifecycle controls, and Pi-owned
1531
- approval cards while preserving one authoritative writer per session.
1532
-
1533
- ### Source review, recovery, and security
1534
-
1535
- - Added Task Changes, Working Tree, and Staged projections with bounded diffs,
1536
- provenance, criterion/verifier links, protected-path enforcement, and guarded
1537
- stage, unstage, revert, and editor handoff actions.
1538
- - Added durable session leases, terminal compatibility ownership, restart and
1539
- stale-owner recovery, idempotent command receipts, replay/resync, doctor with
1540
- explicit repair, and corrupt-state fail-closed behavior.
1541
- - Hardened the TypeScript loader, local control socket creation, runtime
1542
- integrity inventory, browser authentication, redaction, event bounds, and
1543
- provider/MCP credential handling.
1544
-
1545
- ### Documentation and release gates
1546
-
1547
- - Classified every root operating document by language, retained canonical
1548
- English/Vietnamese entry points, and added a gate that rejects unclassified
1549
- or unindexed Vietnamese documentation.
1550
- - Added a provider-neutral product-language gate while retaining third-party
1551
- names only where they describe real integrations, dependencies, or operator
1552
- commands.
1553
- - Added the executable WUI5-18 release matrix covering durable sessions,
1554
- ownership, recovery, approvals, protected data, transport validation,
1555
- accessibility, themes, and zero-model-turn navigation.
1119
+ - Fixed a WebUI composer test race that left the confirm button disabled on slower runners.
1556
1120
 
1557
- ## v1.3.1 - 2026-08-13
1121
+ ## v1.5.0 - 2026-08-17 (not published)
1558
1122
 
1559
- ### Security and reliability hardening
1560
-
1561
- - Extended the capability integrity inventory to include the TypeScript loader,
1562
- CLI dispatcher, and the remaining task-state, verification, and backend
1563
- decision modules that can affect runtime enforcement.
1564
- - Replaced repeated full-file capability hashing on every tool call with a
1565
- fail-closed metadata cache. Session start may re-pin an unchanged grant to a
1566
- new installed build; build drift discovered during a running session blocks
1567
- that session until restart instead of silently rewriting its lock.
1568
- - Removed shell interpolation from the `pdftotext` availability probe while
1569
- preserving the existing PDF extraction behavior.
1570
- - Made local JSONL state locks publish their complete owner atomically and
1571
- recover a hard-killed normal writer without exposing an empty lock. Recovery
1572
- ownership is deliberately fail-closed: if that recovery process itself is
1573
- killed, an operator must remove its `.recovery` lock before writes resume.
1123
+ **Document workspace and attachments.** Adds a document workspace, attachments and a compact activity timeline to the Session Hub; tagged but not published, shipped as v1.5.1.
1574
1124
 
1575
- ## v1.3.0 - 2026-08-12
1125
+ ### Added
1576
1126
 
1577
- ### Stable Intelligence Engine release
1578
-
1579
- - Promoted the exact IE9 product tree to stable without changing model-facing
1580
- runtime behavior. The Criterion Graph, bounded current-source context,
1581
- stable tool surface, one-continuation ceiling, current-tree verification,
1582
- durable resume/handoff and conservative broad defaults remain unchanged.
1583
- - Published the first stable package with Pi host `0.84.1` and installed-package
1584
- parity for every terminal command. Stable installs use npm `latest` and the
1585
- pinned Git tag `v1.3.0`; prerelease `next` remains historical.
1586
- - Preserved the completed 108-session Luna Medium IE7 run as exact
1587
- public-regression evidence for the unchanged product runtime. It is not
1588
- relabelled as an exact v1.3.0 measurement and does not prove private-holdout
1589
- generalization, field stability or real-model long-horizon performance.
1590
- - Kept solver and phase tools in shadow, acceptance and performance assurance
1591
- advisory, semantic repair off, helpers recommend-only, parent routing off,
1592
- recovery on and a maximum of one system continuation for broad defaults.
1127
+ - A document workspace in the Session Hub for Markdown, text, PDF and DOCX, with redaction and in-browser previews.
1128
+ - Attach documents and images in New chat and in active sessions; sent files show as compact cards.
1129
+ - Session titles and previews are generated without a model turn.
1593
1130
 
1594
- ## v1.3.0-ie.9 - 2026-08-12
1131
+ ### Improved
1595
1132
 
1596
- ### Installed-package runtime parity
1597
-
1598
- - Added a package-owned TypeScript loader for terminal entry points so the npm
1599
- installation can load the same audited TypeScript runtime that Pi loads,
1600
- even when the package lives under `node_modules`.
1601
- - Made the global benchmark helper use the matching exact Pi package Git source
1602
- installed by `piagent-install --stable`. It refuses to invent Git identity or
1603
- run against a mismatched helper/package version.
1604
- - Replaced the symlink-only binary smoke with a real packed-and-installed test:
1605
- all global commands print help from `node_modules`, and the installed benchmark
1606
- completes a provider-free dry run from an exact temporary Git source.
1607
- - Preserved IE8 as the first successfully published package. Its helper,
1608
- installer, doctor and capability commands work, but the route and benchmark
1609
- binaries cannot load TypeScript from `node_modules`; IE9 supersedes it on the
1610
- npm `next` channel. Product/model behavior remains unchanged from IE7/IE8.
1133
+ - Large tool-result blocks in chat are replaced by a compact live activity timeline.
1134
+ - Project folder import is more reliable on macOS and Linux, including several folders at once.
1135
+ - Providers & models shows whether each model supports web search and image input.
1611
1136
 
1612
- ## v1.3.0-ie.8 - 2026-08-12
1137
+ ## v1.4.1 - 2026-08-17
1613
1138
 
1614
- ### Reproducible prerelease publishing
1615
-
1616
- - Made the tag-driven publish job fetch the complete Git/tag history required
1617
- by rollback tests and install the same `ripgrep` prerequisite used by the
1618
- native Ubuntu verification lane.
1619
- - Preserved `v1.3.0-ie.7` as immutable failed-before-publish evidence. Its
1620
- workflow stopped during deterministic tests, before `npm publish`, so the
1621
- registry was not modified.
1622
- - Kept the product runtime identical to IE7. The completed 108-session Luna
1623
- Medium benchmark remains exact IE7 runtime evidence and is not relabelled as
1624
- an exact IE8 benchmark; IE8 is a distribution-only correction.
1625
-
1626
- ## v1.3.0-ie.7 - 2026-08-12
1627
-
1628
- ### Source-derived public return-contract guidance
1629
-
1630
- - Extended the bounded return-representation classifier to recognize helper
1631
- parameters seeded from object properties, including stable graph traversals
1632
- that call `visit(item.name)` and later push that name into the public result.
1633
- - Surfaces the existing names-versus-objects representation in the first model
1634
- turn before mutation. This preserves the public API without enabling a hard
1635
- semantic gate, adding a continuation, or changing the benchmark prompt,
1636
- variant, grader, outcome floor, or measured IE6 evidence.
1637
- - Preserved the terminal IE6 production run as immutable NO-GO evidence. IE7
1638
- uses a new candidate digest and production seed and must pass a single paired
1639
- workspace-order canary before another full release benchmark is authorized.
1139
+ **Integrity, redaction and install fixes.** Closes gaps in the runtime integrity lock, redacts npm tokens, fixes install and uninstall bugs, and lets the dashboard start without the MCP adapter.
1640
1140
 
1641
- ## v1.3.0-ie.6 - 2026-08-12
1141
+ ### Added
1642
1142
 
1643
- ### Candidate-only finite benchmark stop
1143
+ - Added Google Drive, Gmail, Docs and Sheets MCP servers as experimental, kept out of every default preset.
1644
1144
 
1645
- - Aligned the paired terminal stop with the production evaluator: a Piagent
1646
- outcome below the frozen floor stops after its pair, while a Codex-only miss
1647
- remains candidate-only dominance and does not prevent later coverage.
1648
- - Kept helper wall-clock timing observational under parallel host load; exact
1649
- retrieval, token reduction, lifecycle, writer and privacy invariants remain
1650
- the release-gating properties.
1651
- - Preserved the terminal `v1.3.0-ie.5` canary as immutable evidence; it is not
1652
- resumed or relabelled after this correction.
1145
+ ### Fixed
1653
1146
 
1654
- ## v1.3.0-ie.5 - 2026-08-12
1147
+ - The two-command install could downgrade the global Pi package to a project's pin; the two scopes now resolve separately.
1148
+ - Uninstall did nothing under a non-default npm prefix yet reported success; it now uses the helper's actual prefix.
1149
+ - `piagent dashboard` failed to start when the MCP adapter was not installed; it now starts.
1655
1150
 
1656
- ### Finite release benchmark and prerelease publishing
1151
+ ### Security
1657
1152
 
1658
- - Added a release-only paired outcome stop that finishes the current Piagent/Codex
1659
- pair, records a terminal non-resumable receipt, and starts no later provider
1660
- session after an outcome falls below the frozen suite floor.
1661
- - Bound prerelease packages to the npm `next` dist-tag in both package identity
1662
- and the tag-driven publish workflow, preserving `latest` for stable releases.
1663
- - Preserved the failed `v1.3.0-ie.4` measurement as immutable evidence; no suite,
1664
- grader, prompt, or measured result was rewritten for this candidate.
1153
+ - The integrity lock now covers shell entrypoints and the served WebUI bundle, which could previously run unpinned code.
1154
+ - npm tokens in `.npmrc` lines and in publish output are now redacted.
1665
1155
 
1666
- ## v1.3.0-ie.4 - 2026-08-11
1156
+ ## v1.4.0 - 2026-08-15
1667
1157
 
1668
- ### Symmetric native CI prerequisites
1158
+ **Local Session Hub and WebUI.** Adds `piagent dashboard`: a local Gateway and browser client to create, resume and review Pi sessions without extra model turns.
1669
1159
 
1670
- - Installed the exact ripgrep test prerequisite on both Ubuntu and macOS CI.
1671
- This keeps the helper evaluation identical across native platforms; no
1672
- product gate, benchmark evaluator, or provider behavior was relaxed.
1673
- - Kept the integration waits finite while giving the full parallel suite room
1674
- for native filesystem contention. The helper and immutable-snapshot product
1675
- assertions remain unchanged; only their test-harness deadlines moved.
1160
+ ### Added
1676
1161
 
1677
- ## v1.3.0-ie.3 - 2026-08-11
1162
+ - `piagent dashboard` opens a local Gateway to create, reopen, resume, rename, pin, archive and fork sessions.
1163
+ - A conversation-first browser client with light and dark themes, Vietnamese and English UI, and an Agent Inspector.
1164
+ - Streaming chat, held-message queues, attachments, model and thinking controls, and approval cards in the browser.
1165
+ - Task Changes, Working Tree and Staged views with bounded diffs and guarded stage, unstage and revert actions.
1678
1166
 
1679
- ### Deterministic cross-platform helper gate
1167
+ ### Improved
1680
1168
 
1681
- - Kept helper retrieval timing as an observational metric, but made the release
1682
- gate depend on exact retrieval correctness, model-visible token reduction,
1683
- lifecycle, budget, writer and privacy invariants. This removes filesystem and
1684
- process-startup timing noise from native Linux CI without weakening the
1685
- product property the helper is intended to provide.
1169
+ - Sessions recover after restarts and stale owners, and corrupt state fails closed.
1686
1170
 
1687
- ## v1.3.0-ie.2 - 2026-08-11
1171
+ ### Security
1688
1172
 
1689
- ### Runtime and release-gate refresh
1173
+ - Hardened the TypeScript loader, local control socket, browser authentication, redaction and credential handling.
1690
1174
 
1691
- - Raised the exact Pi Coding Agent and Pi AI host pin to `0.84.1` and TypeBox
1692
- to `1.3.7`. The new host tree audits clean at moderate and above, replacing
1693
- the expired `0.82.0` advisory exception; provider-free host compatibility,
1694
- package lifecycle and release identity are re-gated on the new pin.
1695
- - Scoped CodeQL away from the byte-pinned Hono benchmark fixture while keeping
1696
- all Piagent product and benchmark harness code analyzed, and made Ubuntu CI
1697
- install the ripgrep dependency exercised by helper evaluation.
1175
+ ## v1.3.1 - 2026-08-13
1698
1176
 
1699
- ## v1.3.0-ie.1 - 2026-08-11
1177
+ **Security and reliability hardening.** Widens the integrity inventory, speeds up per-call integrity checks with a cache, and lets local state locks recover safely.
1700
1178
 
1701
- ### Intelligence-engine candidate
1702
-
1703
- - Added a deterministic Criterion Graph projection and bounded current-source
1704
- context delivery so Luna Medium can plan against operator criteria without a
1705
- repository-index dependency or an extra model turn. Mechanical task truth,
1706
- exact verification, current-tree evidence and permissions remain unchanged.
1707
- - Kept every advanced capability in the package while broad defaults leave
1708
- solver and phase tools in shadow, acceptance and performance assurance
1709
- advisory, semantic repair off, helpers recommend-only and parent routing off.
1710
- - Added a fail-closed IE6 release protocol for Piagent versus controlled Codex
1711
- CLI on Luna Medium: 18 production families, three repeats, two surfaces, 108
1712
- sessions, six-session inspected chunks, retry zero and explicit platform,
1713
- cohort, private-holdout, long-horizon and operator gates.
1714
- - Preserved RC.1 and RC.2 as immutable historical NO-GO evidence. The IE train
1715
- uses its own prerelease identity and does not relabel or resume either RC.
1179
+ ### Improved
1716
1180
 
1717
- ## v1.3.0-rc.2 - 2026-08-11
1181
+ - Integrity checks use a metadata cache instead of rehashing files on every tool call; build drift mid-session blocks until restart.
1718
1182
 
1719
- ### Finite FS6 correction
1183
+ ### Fixed
1720
1184
 
1721
- - Added one intake-only efficiency correction after the exact RC.1 Migration
1722
- gate: map every operator criterion to implementation and focused-test
1723
- coverage, batch independent operations, and perform one criterion review
1724
- before the first exact verifier. No completion gate, continuation budget,
1725
- capability mode, benchmark evaluator, or scenario behavior was relaxed.
1726
- - Bound the pinned Hono 4.13.1 zero-install E2 fixture into the clean source and
1727
- package, excluded the test-only `core-services.js` barrel from distribution,
1728
- and made the control-byte gate accept valid empty upstream JavaScript files
1729
- without weakening checks for non-empty binary source.
1185
+ - A hard-killed writer no longer leaves a state lock stuck; if recovery itself is killed, remove its `.recovery` lock.
1730
1186
 
1731
- ## v1.3.0-rc.1 - 2026-08-11
1187
+ ### Security
1732
1188
 
1733
- ### Operator product journey
1734
-
1735
- - Added deterministic parent model routing with versioned
1736
- `low|medium|high|ultra` capability bands, explicit pin/default provenance,
1737
- intelligence/balance/cost objectives, exact authenticated-catalog matching,
1738
- and fail-closed shadow/recommend/auto modes. `piagent-route` provides the only
1739
- explicit prelaunch enforcement path; extension auto does not mutate the Pi
1740
- user default or switch models mid-conversation.
1741
- - Added a bounded retrieval route (read-only grep/find/read, up
1742
- to eight parallel searches and four rounds, recommendation-only), a 240-case
1743
- offline routing gate, and a resume-locked 144-session static-versus-adaptive
1744
- protocol dry-run. No authenticated benchmark is implied by these local gates.
1745
-
1746
- - Extended task preflight with stable human/JSON projections for intent, risk,
1747
- scope, runtime provenance, solver route, phases, tools, helper budget,
1748
- execution boundary, readiness, approvals, and blockers. Read-only and
1749
- authorization-sensitive requests never display implementation permission.
1750
- - Extended `/piagent-status` with persisted task, trajectory, checkpoint,
1751
- verifier, recovery, helper, resume, terminal receipt, and bounded efficiency
1752
- evidence. Completion remains hard-gate dependent and same-runtime evidence is
1753
- described as operational assurance, not independent audit.
1754
- - Added one `/piagent-inspector` namespace with an automatic compact status line
1755
- below Pi's native TUI footer and
1756
- menu views for task-versus-working-tree diff, test files and line counts,
1757
- tool/command outcomes, safety warnings, verifier evidence, and context budget.
1758
- It reuses existing lifecycle hooks, does not call a model, marks mixed dirty
1759
- baselines explicitly, and never invents per-tool token attribution.
1760
- - Hardened terminal receipts to fail closed unless the current-tree completion
1761
- gate passes, and hardened RC local readiness so every published routing,
1762
- safety, helper/writer, recovery, phase-tool, and host-boundary gate is
1763
- decisive. The RC matrix pins each P0-P6 evidence input by SHA-256 and the
1764
- generated report records the verified bytes and composite input digest.
1765
- - Extended offline doctor readiness and `/usage efficiency` with install/update
1766
- recovery guidance and exact-or-unavailable task metrics joined through hashed
1767
- session/task/run identity. Raw task text and child output are not retained;
1768
- unmeasurable time, tokens, cost, and invocation counts remain null.
1769
-
1770
- ### Durable runtime evidence
1771
-
1772
- - Fixed automatic long-prompt intake, repository-aware scope resolution,
1773
- idempotent bounded task IDs, runtime verifier defaults, and full-prompt
1774
- acceptance extraction. Phase enforcement now uses dependency-ready work-plan
1775
- evidence, keeps provider tool schemas cache-stable, treats `shell`/`exec` as
1776
- `bash`, and applies one phase decision to direct, shell, patch, and MCP
1777
- mutation carriers. Manual/high-risk planning and every read-only task remain
1778
- mutation-free; exact verifiers and bounded repair retain their intended path.
1779
- - Recalibrated the public capability suite around explicit contracts and 47
1780
- weighted critical atomic checks across 16 prompt clauses. Each clause has a
1781
- named killed mutation and sensitivity rationale; independently shaped search
1782
- and migration implementations pass without object-identity, module-provenance,
1783
- fixture-name, or representation coupling. Historical benchmark evidence is
1784
- retained unchanged and is not regraded as a new performance claim.
1785
- - Hardened Piagent-versus-Codex benchmarking with named, candidate-only runtime
1786
- treatments preserved across dry-run, resume, replay, and reports. Token-saving
1787
- claims now fail closed unless controlled Codex isolation, model/thinking pins,
1788
- randomized paired order, and exact treatment provenance pass; reports expose
1789
- paired resolved/quality/safety outcomes and token ratios by benchmark band.
1790
- - Stabilized Task Contract v2 with identity-bound journal checkpoints, strict
1791
- acceptance receipts, current-tree verification evidence, bounded retries, and
1792
- immutable terminal outcomes. Journal hashes and receipts are operational
1793
- evidence produced by the same runtime, not independent attestation.
1794
- - Added adaptive context planning, cited repository-memory hints, model
1795
- capability facts, verification intelligence, and a fail-closed execution
1796
- backend descriptor. The parent model remains operator-pinned, no solver or
1797
- automatic parent routing is shipped, and unavailable isolation adapters do
1798
- not silently fall back to host mutation.
1799
- - Added benchmark measurement schema v1 with exact-or-unavailable context usage
1800
- and bounded task/acceptance evidence. Route, phase, and helper measurements
1801
- remain absent until their later schemas and runtime behavior are implemented.
1802
- - Extracted bounded registration adapters and operator catalogs from the Pi
1803
- composition root, locked the root against growth, and extended runtime
1804
- integrity/package coverage for the new modules.
1805
-
1806
- ### Controlled RC readiness
1807
-
1808
- - Added a pinned RC evaluation matrix and local-only readiness evaluator across
1809
- quality/routing, security/privacy, reliability/performance, and disposable
1810
- install/migration/rollback gates. It records candidate content and catalog
1811
- digests without storing credentials or gaining release-write capabilities.
1812
- - Added cross-process helper lock waiting/stale-lock recovery and synthetic
1813
- disk-full/permission-denied state tests after the concurrency gate exposed an
1814
- immediate-lock-failure race.
1815
- - Retained conservative defaults: solver and phase tools stay shadow, recovery
1816
- stays on, helpers stay recommend, and parent routing/automatic workers stay
1817
- off. GA remains blocked on controlled cohorts, human usability, Linux,
1818
- candidate benchmark, RC package/identity, and explicit operator approval.
1819
-
1820
- ### Bounded recovery and handoff
1821
-
1822
- - Added deterministic failure classification and a cross-attempt recovery
1823
- matrix with one source repair or exact transient retry ceiling. Environment,
1824
- provider, permission, policy, scope, and unknown failures never gain source
1825
- mutation authority; `PIAGENT_AUTO_RECOVERY=off` preserves the prior handoff
1826
- path.
1827
- - Added owner-only Handoff v1 projections and safe resume reconstruction bound
1828
- to task/session identity, journal integrity, trajectory phase, the actual
1829
- current tree, and exact verifier evidence. Stale passes are invalidated;
1830
- corrupt or symlink-unsafe state blocks mutation.
1831
- - Extended acceptance receipts with optional runtime-observed recovery
1832
- provenance. Criteria/status truth is unchanged and the receipt stores only
1833
- bounded digests, counts, dispositions, and state references rather than raw
1834
- logs or source.
1835
-
1836
- ### Role-bound helpers
1837
-
1838
- - Added strict RolePolicy v1 and HelperRequest v1 contracts for retriever,
1839
- scout, planner, worker, reviewer, Oracle, and researcher roles. Requests bind
1840
- hashed parent identity, bounded scope/tools/model/effort/budgets/output/stops,
1841
- cannot broaden parent authority, and never delegate approvals.
1842
- - Added deterministic authenticated-catalog role binding that preserves the
1843
- user-pinned parent and reports unavailable instead of silently substituting a
1844
- model or effort. Worker remains disabled by default.
1845
- - Added owner-only Piagent-owned helper budgets with two-concurrent/three-total,
1846
- per-role and one-writer ceilings, deduplication, orphan recovery, terminal
1847
- cancellation, and digest-only usage receipts. `PIAGENT_HELPERS_MODE` defaults
1848
- to `recommend`; automatic worker delegation is not enabled.
1189
+ - The integrity inventory now covers the TypeScript loader, the CLI dispatcher and the remaining enforcement modules.
1190
+ - Removed shell interpolation from the PDF tool availability check.
1849
1191
 
1850
- ## v1.2.17 - 2026-08-03
1192
+ ## v1.3.0 - 2026-08-12
1851
1193
 
1852
- ### Bilingual public documentation
1194
+ **First stable intelligence engine release.** Promotes the ie.9 tree to stable with Pi 0.84.1 and unchanged runtime behaviour; stable installs come from npm `latest`.
1853
1195
 
1854
- - Added a complete English peer for all 17 public documentation pages under
1855
- `/en`, while preserving existing Vietnamese URLs at the site root.
1856
- - Added same-topic VI/EN switching, localized navigation and copy feedback,
1857
- canonical URLs, and `hreflang` metadata without adding a client-side i18n
1858
- framework or language bundle.
1859
- - Extended build, release-identity, scaffold, link-integrity, and locale-parity
1860
- gates to cover all 34 generated pages.
1861
- - Fixed the multi-page grid breakpoint that kept desktop sidebar and TOC
1862
- columns active on mobile, restoring a single-column content layout.
1196
+ ### Added
1863
1197
 
1864
- ## v1.2.16 - 2026-08-03
1198
+ - First stable package with Pi 0.84.1, where every terminal command works from the installed package.
1865
1199
 
1866
- ### Codex default
1200
+ ### Improved
1867
1201
 
1868
- - Changed the default Codex configuration to `openai-codex/gpt-5.5:high`
1869
- across setup, global install, model-scope configuration and the global
1870
- settings template. Explicit `xhigh` selections remain supported.
1871
- - Changed the no-thinking-suffix fallback to `high` and added an executable
1872
- regression test covering default settings, scoped models and explicit
1873
- `xhigh` overrides.
1202
+ - Stable installs use npm `latest` and the Git tag `v1.3.0`; the prerelease `next` channel is now historical.
1203
+ - Runtime behaviour is unchanged from ie.9, with conservative defaults: parent routing off, recovery on, one continuation.
1204
+ - The 108-session Luna Medium run from ie.7 is kept as evidence and not relabelled as a v1.3.0 measurement.
1874
1205
 
1875
- ## v1.2.15 - 2026-08-03
1206
+ Requires: Pi 0.84.1.
1876
1207
 
1877
- ### Global update reliability
1208
+ ## v1.3.0-ie.9 - 2026-08-12
1878
1209
 
1879
- - Fixed stable updates from machines whose existing Piagent registration is a
1880
- local path. Pi displays user-local sources relative to its agent directory,
1881
- while `pi remove` resolves input from the caller's working directory; the
1882
- installer now removes the discovered registration by its absolute path.
1883
- - Added a regression assertion that fails if the installer passes Pi's displayed
1884
- relative path back to `pi remove`, covering updates launched outside the Pi
1885
- agent directory.
1210
+ **Installed-package runtime parity.** Commands installed from npm can now load the TypeScript runtime, fixing the route and benchmark commands that failed in ie.8.
1886
1211
 
1887
- ## v1.2.14 - 2026-08-03
1212
+ ### Improved
1888
1213
 
1889
- ### Runtime architecture
1890
-
1891
- - Split session lifecycle, input routing, context usage, tool-result filtering,
1892
- tool activation and task intake out of the guard entrypoint into focused
1893
- runtime modules while preserving the existing behavior and command surface.
1894
- - Added machine-enforced architecture layers, dependency directions and file
1895
- size budgets so new runtime code cannot silently grow back into the guard.
1896
- - Extended capability integrity locks to pin every extracted runtime module;
1897
- the test suite now rejects any runtime file omitted from that trust boundary.
1898
- - Added paired English and Vietnamese maintainer documentation with a language
1899
- parity gate. Vietnamese docs preserve operational terms such as agent,
1900
- terminal, workflow, MCP, session, token, model and benchmark.
1901
-
1902
- ### Session and migration reliability
1903
-
1904
- - Stopped registering a custom `/name` command so Piagent no longer shadows
1905
- Pi's native session command. Native rename events continue to update task
1906
- bindings and Agent Watch records; `/setname` remains a compatibility alias.
1907
- - Hardened legacy task migration so long task identifiers retain a unique hash
1908
- suffix, the source contract is archived before the v2 write, and path aliases
1909
- cannot delete a newly written current contract on macOS.
1910
- - Added integration, runtime isolation, migration-collision, architecture and
1911
- documentation tests for the extracted boundaries and release behavior.
1214
+ - The global benchmark helper uses the exact Pi package source installed by `piagent-install --stable`.
1215
+ - A packed-and-installed test now checks that every global command prints its help.
1912
1216
 
1913
- ## v1.2.13 - 2026-08-03
1217
+ ### Fixed
1914
1218
 
1915
- ### Benchmark evidence
1916
-
1917
- - Published a dedicated static benchmark page with the verified production-v1
1918
- scores, median usage, paired fresh-token comparison, confidence interval,
1919
- category coverage and release provenance.
1920
- - Added lightweight CSS charts for score bands, token usage and paired wins;
1921
- the page has no charting dependency or client-side data fetch and remains
1922
- readable on desktop and mobile.
1923
- - Added the sanitized v1.2.12 production snapshot to the benchmark guide and
1924
- README while keeping the raw report private because its root seed can
1925
- reproduce synthetic secrets.
1926
- - Documented that the full model run measured the release candidate before its
1927
- metadata bump, and kept the claim scoped to the controlled public suite
1928
- rather than presenting it as a universal model or repository result.
1219
+ - In ie.8 the route and benchmark commands could not load TypeScript from `node_modules`; they now work.
1929
1220
 
1930
- ## v1.2.12 - 2026-08-03
1221
+ ## v1.3.0-ie.8 - 2026-08-12
1931
1222
 
1932
- ### Production benchmark
1933
-
1934
- - Added `production-v1`, a 108-session release benchmark covering 18 independent
1935
- scenario families across backend, frontend, data, platform, reliability and
1936
- security, with small/medium/large tasks, five profiles, cold-start and
1937
- steady-state lifecycles, generated variants and private hidden oracles.
1938
- - Added category/profile/lifecycle/difficulty bands, Wilson quality intervals,
1939
- complete-family efficiency evidence and a scenario-clustered 95% confidence
1940
- interval for paired fresh-token ratios. Production claims now require all 18
1941
- families, three repeats, quality/reliability/workflow/category scores of at
1942
- least 9, perfect safety and an upper token-ratio bound no greater than 1.
1943
- - Added controlled `codex-cli` comparison with a fresh private `CODEX_HOME` for
1944
- every measured session and retry, paired seeded execution blocks, strict JSONL
1945
- usage parsing, bounded diagnostics and streaming required/forbidden output
1946
- checks.
1947
- - Added infrastructure-only retries for zero-usage process failures. Timeout or
1948
- any run that consumed provider usage remains a measured reliability result;
1949
- retries are recorded separately and cannot improve task scores silently.
1950
- - Validated the release candidate with 108/108 resolved sessions against Codex
1951
- CLI on the same model/thinking configuration. Piagent reached 10.00 quality,
1952
- safety, reliability and efficiency, 9.58 workflow and 9.92 overall; the
1953
- paired fresh-token estimate was 51.11% lower with a 95% ratio interval of
1954
- 0.3809 to 0.6276.
1955
-
1956
- ### Harness refinements
1957
-
1958
- - Kept automatic bounded intake for safe prompts while exposing explicit task
1959
- intake when a legitimate high-risk request mentions a protected path.
1960
- - Rendered every verifier as a separate shell call throughout intake, recovery,
1961
- compaction and final-gate guidance. Recovery now reports only verifier commands
1962
- whose observed passing evidence is missing, avoiding accidental pipelines and
1963
- repeated successful checks.
1964
- - Documented the distinct smoke and production workflow thresholds while keeping
1965
- every failed workflow check visible in JSON, text and HTML reports.
1223
+ **Reproducible prerelease publishing.** Fixes the publish job that stopped ie.7 before publishing; the runtime is identical to ie.7.
1966
1224
 
1967
- ## v1.2.11 - 2026-08-02
1225
+ ### Improved
1968
1226
 
1969
- ### Breakthrough task harness
1970
-
1971
- - Added Task Implementation Contract schema v2 with unique `taskRunId`, Pi
1972
- `sessionId`/`sessionName` binding, `source-change` versus `read-only` mode,
1973
- bounded attempts, prior failure summaries, work-plan progress, and baseline,
1974
- observed, final and declared changed-file evidence.
1975
- - Enforced one Pi session per task. Session rename updates the bound contract;
1976
- resume maps legacy state only when Pi custom trace identifies the task. Retry
1977
- starts in a fresh session, inherits prior evidence and cannot raise the limit
1978
- fixed by attempt one.
1979
- - Source mutation now requires a task, a Git working tree, declared scope and a
1980
- meaningful verifier. Read-only inspection remains available before a task and
1981
- in scout mode. Terminal contracts are immutable.
1982
- - Final completion now requires every exact verify command to have a passing Pi
1983
- bash observation after task start. The gate reconciles changed-file claims
1984
- against Git baseline digests and tool results, rejects out-of-scope files and
1985
- records both source and destination of staged renames. The assistant
1986
- completion hook catches a premature DONE claim even when the agent skips the
1987
- explicit gate call.
1988
- - Added `piagent_task_progress`, failed work-plan steps, dependency/cycle checks,
1989
- failure phase/reason/ruled-out evidence and deterministic retry handoff.
1990
-
1991
- ### Context and performance
1992
-
1993
- - Replaced routine model-driven intake/context/evidence/trace/gate choreography
1994
- with lifecycle hooks. Runtime now creates bounded task contracts before the
1995
- first model turn, deriving path/glob scope from the request and bounded Context
1996
- Engine navigation. Broad, high-risk, ambiguous, or protected-path requests
1997
- fail over to explicit intake instead of silently widening scope.
1998
- - Automatic source tasks expose zero Piagent management schemas and need no
1999
- `task_start` round trip. Manual intake validates every scope entry as a
2000
- project-relative path/glob, keeps the active tool surface cache-stable, and
2001
- adds recovery schemas only when the selected lane requires them.
2002
- - Routine tasks no longer advertise the duplicate `piagent-ops` skill to the
2003
- model. Runtime states that root project instructions are already loaded, so
2004
- the agent does not spend tool calls re-reading platform policy or root
2005
- `AGENTS.md`; the skill remains available for explicit manual/recovery use.
2006
- - A bounded automatic task can receive a current-turn Context Engine snapshot
2007
- of relevant source/tests before its first model action. The snapshot is capped
2008
- at 900 estimated tokens, restricted to source/test roots, filtered by the
2009
- active exclusion policy and skipped for stale/low-confidence indexes; the
2010
- agent re-reads only missing regions or edit mismatches.
2011
- - Node-family runtime intake resolves the generic verifier to concise existing
2012
- package scripts such as `npm test`, while preserving the profile's fail-closed
2013
- command when package metadata is absent or invalid.
2014
- - Removed the Piagent tool-loader schema from the default session and task
2015
- surface. Prompt classification activates the required group directly, while
2016
- explicit diagnostics can still request the loader; ordinary turns therefore
2017
- carry no unused management schema.
2018
- - Verification evidence is bound to a SHA-256 digest of the current working
2019
- tree. A later edit invalidates prior proof; running a verifier no longer looks
2020
- like a mutation. Files edited and restored to their baseline digest do not
2021
- satisfy the final changed-file gate.
2022
- - Added one bounded automatic continuation for automatic/assisted tasks when an
2023
- agent stops with missing evidence, including the “existing tests pass but no
2024
- relevant diff” case. The continuation uses Pi `followUp`, never loops, reports
2025
- projected final-gate reasons, and recognizes Vietnamese completion wording.
2026
- Set `PIAGENT_AUTO_RECOVERY=off` for rollback.
2027
- - Added lifecycle-native read-only plans: tiny scouts complete from observed
2028
- reads, normal scouts retain one explicit evidence review, and high-risk or
2029
- custom plans keep manual checkpoints.
2030
- - Auto Context Engine packing now skips follow-up turns once a task is active,
2031
- avoiding repeated navigation payloads during verification or recovery.
2032
- - Automatic navigation also skips prompts that already name a concrete path,
2033
- including protected dotfiles such as `.env`; the agent reads the bounded
2034
- target directly instead of paying for an unrelated context pack.
2035
- - Benchmark workflow scoring accepts exactly one persisted intake source:
2036
- runtime intake with zero model calls, or manual intake with one `task_start`.
2037
- It still requires zero routine context/evidence/gate choreography and exposes
2038
- failed checks instead of awarding 10/10 to expensive management loops.
2039
-
2040
- - Auto-context is cached by project, session and prompt. A repeated prompt in
2041
- one session is not reinjected; a manual pack with the same query returns a
2042
- compact reuse marker unless refresh is requested. Another session still gets
2043
- its own pack.
2044
- - Reduced automatic/manual context budgets, kept dynamic tools/default-on
2045
- telemetry, added conservative UTF-8 token estimation and verified accented or
2046
- unaccented Vietnamese retrieval.
2047
- - Profile source verifiers now fail closed instead of printing a successful
2048
- placeholder. Node-family profiles run configured checks; DevOps verification
2049
- cannot hide one failing verifier behind another passing tool.
2050
- - Added `piagent-benchmark`, a one-command paired Raw Pi versus Piagent runner.
2051
- It creates isolated Git fixtures, alternates execution order, grades hidden
2052
- correctness/scope/safety and Piagent workflow evidence, reads exact usage from
2053
- Pi session JSONL, and emits private JSON, HTML, text, and JSONL reports.
2054
- - The same command can now compare `piagent` with `codex-cli`. Controlled mode
2055
- runs Codex ephemeral in a workspace-write sandbox and a private temporary
2056
- Codex home, excluding global `AGENTS.md`, user config/rules, hooks, plugins,
2057
- sessions, and caches while linking the existing credential without copying it;
2058
- disables available optional integrations discovered from that CLI version,
2059
- requires command-line-pinned model/thinking parity, and keeps native mode as
2060
- an explicit full-product comparison.
2061
- - Added fail-closed streaming parsing for Codex exec JSONL, including UTF-8
2062
- chunk boundaries and output larger than the retained log tail. Fresh input
2063
- excludes cached input, reasoning is not counted twice, full stdout is hashed
2064
- without being stored, and unavailable OAuth currency cost remains `n/a`.
2065
- - The automatic benchmark prepares Piagent fixtures as initialized, onboarded
2066
- steady-state projects before the measured model run. It no longer charges
2067
- every task repeat for one-time onboarding, while post-baseline context/index
2068
- mutations remain visible to the scope gate.
2069
- - Benchmark reporting separates hidden correctness from scope and end-to-end
2070
- reliability, shows median usage across every measured run, and records only
2071
- tool-name histograms so failed expensive runs cannot disappear from the
2072
- headline while tool arguments and outputs remain private. These orthogonal
2073
- metrics are emitted as benchmark report schema v2.
2074
- - Benchmark score bands cover quality, safety, reliability, workflow and fresh
2075
- token efficiency. A token-saving verdict requires quality/reliability at
2076
- least `9/10`, perfect safety/workflow, non-inferior quality, at least three
2077
- same-model successful usage pairs, and a paired geometric-mean fresh-token
2078
- ratio below `1`. The report keeps marginal medians as diagnostics, and adds
2079
- pair wins plus median paired delta so task scale cannot silently reverse the
2080
- conclusion. Manual benchmark recording remains backward compatible.
2081
-
2082
- ### State, migration and security
2083
-
2084
- - `piagent-update` now keeps host and helper updates in the writable npm prefix
2085
- that owns the active command. This prevents an `/opt/homebrew` installation
2086
- from being shadowed by a second copy under `/usr/local` or a user fallback
2087
- when `npm config get prefix` points somewhere else.
2088
- - Added idempotent v1-to-v2 task migration to session startup and
2089
- `piagent-update --project`. Preflight refuses corrupt state before project
2090
- writes; v1 is archived only after v2 exists. Existing onboarded projects keep
2091
- their grants and do not need onboarding again.
2092
- - Added a shared local-state path boundary for task state, Context Engine,
2093
- telemetry, bash evidence, traces and captures. It accepts a project opened
2094
- through a legitimate cwd symlink but refuses `.pi` or any descendant ancestor
2095
- symlink that escapes the project.
2096
- - JSONL state is owner-only, size bounded and rotated under a cross-process
2097
- lock. Oversized records become audit markers. Tool-result captures are pruned
2098
- to 500 files, 128 MiB and 30 days; readers/pruners tolerate concurrent
2099
- rotation and deletion.
2100
- - Task v2 readers reject unknown fields, malformed timestamps, invalid nested
2101
- plans, dependency cycles and taskRunId/filename mismatches. Git snapshots now
2102
- remain truthful in unborn repositories and across staged renames.
1227
+ - The runtime is unchanged from ie.7; this release corrects distribution only.
2103
1228
 
2104
- ## v1.2.10 - 2026-07-31
1229
+ ### Fixed
2105
1230
 
2106
- ### Security
1231
+ - The tag-driven publish job now fetches the full tag history and installs the test prerequisites it needs.
2107
1232
 
2108
- - `contextIndexV2Status` giờ yêu cầu `excludePatterns` tường minh như năm
2109
- Context Engine API còn lại. Status không còn báo `policyStale: false` khi
2110
- caller chưa cung cấp policy để đối chiếu, nên caller mới không thể vô tình bỏ
2111
- qua rebuild của index được tạo bằng luật yếu hơn.
1233
+ ## v1.3.0-ie.7 - 2026-08-12 (not published)
2112
1234
 
2113
- - Đã xóa fallback đọc exclusion list từ metadata cũ. Active policy luôn đến từ
2114
- caller đã resolve project policy; index metadata chỉ còn là giá trị stored để
2115
- so digest.
1235
+ **Return-shape guidance before the first edit.** The first model turn now shows whether a public result returns names or objects, so edits keep the public API intact.
2116
1236
 
2117
- - Context index storage giờ dùng directory mode `0700` và mode `0600` cho
2118
- SQLite database, WAL và SHM. Mỗi connection bật cả SQLite core
2119
- `secure_delete` lẫn FTS5 `secure-delete`, nên source bị xóa trong refresh bình
2120
- thường không còn nằm lại trong raw index bytes.
1237
+ ### Improved
2121
1238
 
2122
- - Exclusion policy version `2` buộc index cũ tự migrate một lần khi mở bằng
2123
- policy hiện hành. Migration dựng lại toàn bộ FTS index từ content table đã
2124
- lọc, checkpoint WAL rồi `VACUUM` để purge cả tombstone FTS và free-page bytes
2125
- được tạo bởi bản cũ. Digest mới và `purgePending: 1` được commit cùng nhau
2126
- trước pha purge; cờ chỉ clear sau khi toàn bộ chuỗi thành công. Nếu app hoặc
2127
- máy dừng giữa chừng, lần mở sau tự retry.
1239
+ - Detects whether helper results return names or objects, including graph traversals, and shows it before the first edit.
1240
+ - No hard gate, extra continuation or benchmark change is added.
2128
1241
 
2129
- - Full FTS rebuild và `VACUUM` chỉ chạy khi exclusion digest đổi hoặc một purge
2130
- cũ còn pending. Incremental rebuild cùng policy không nhận chi phí này.
1242
+ ## v1.3.0-ie.6 - 2026-08-12
2131
1243
 
2132
- - Image path trong chat giờ chỉ được auto-attach khi target thật nằm trong
2133
- project hoặc `additionalReadRoots`, không khớp protected path, nằm trong
2134
- capability read scope hiện hành và có bytes đúng định dạng ảnh. Symlink ra
2135
- ngoài root, ảnh trong `.pi/piagent-state/**` và file giả đuôi `.png` đều bị
2136
- từ chối trước khi nội dung được đưa vào model.
1244
+ **Benchmark stop aligned with the evaluator.** The paired benchmark stops only when a Piagent outcome falls below the floor; a miss by the baseline alone no longer ends coverage.
2137
1245
 
2138
- - MCP approval gate và `piagent-mcp doctor` giờ nhận diện cả `directTools` đặt
2139
- trên từng server. Repository server bật direct tool trong khi
2140
- `toolPrefix: "none"` sẽ fail-closed vì tên tool không còn mang server origin.
1246
+ ### Improved
2141
1247
 
2142
- - `piagent-reviewer` giờ là read-only thật: manifest chỉ cấp `read`, `grep`,
2143
- `find`, `ls`; autofix phải chuyển sang `piagent-worker`. Test package ghim
2144
- mọi subagent có `acceptanceRole: read-only` vào allowlist read-only.
1248
+ - A Piagent outcome below the frozen floor stops the run after its pair; a baseline-only miss does not.
1249
+ - Helper timing under parallel load is observational; correctness, token reduction and privacy gate the release.
2145
1250
 
2146
- ## v1.2.9 - 2026-07-31
1251
+ ## v1.3.0-ie.5 - 2026-08-12
2147
1252
 
2148
- ### Security
1253
+ **Finite release benchmark and `next` publishing.** Benchmark runs stop after a below-floor pair, and prerelease packages publish to npm `next`, keeping `latest` for stable releases.
2149
1254
 
2150
- - Context Engine CLI và runtime giờ dùng chung một policy resolver. Base policy,
2151
- profile `extends`, `protectedPaths`, `shellProtectedPaths`, `readOnlyPaths` và
2152
- custom context-index path cùng tạo ra một canonical exclusion list; context
2153
- search/pack không còn đọc một view khác với guard.
1255
+ ### Added
2154
1256
 
2155
- - Context index metadata ghi versioned exclusion digest. Search, pack, impact và
2156
- auto-context rebuild incremental khi digest hiện hành khác digest đã build,
2157
- đồng thời lọc lại candidate ở read time. Index cũ tạo bằng luật yếu hơn vì vậy
2158
- tự loại nội dung protected trước khi model nhận context.
1257
+ - A release benchmark stops after the current pair once an outcome falls below the floor, starting no new paid session.
2159
1258
 
2160
- - Context Engine từ chối source-shaped symlink và canonical path đi ra ngoài
2161
- project ở cả build, stale check và pack read.
1259
+ ### Improved
2162
1260
 
2163
- - API build, ensure, search, pack và impact giờ fail-closed nếu caller không
2164
- truyền `excludePatterns` tường minh. `[]` vẫn được hỗ trợ cho low-level tool
2165
- chủ ý chạy không loại trừ; caller mới không còn vô tình quay về permissive
2166
- default.
1261
+ - Prereleases publish to the npm `next` dist-tag; `latest` stays reserved for stable releases.
2167
1262
 
2168
- ### Fixed
1263
+ ## v1.3.0-ie.4 - 2026-08-11
2169
1264
 
2170
- - `piagent-update --dry-run --project ...` báo trực tiếp khi helper thiếu project
2171
- migrator thay vì chạy Node rồi trả stack `MODULE_NOT_FOUND`.
1265
+ **Matching CI prerequisites on Ubuntu and macOS.** CI installs the same search tool on Ubuntu and macOS and gives integration waits more room; no product gate was relaxed.
2172
1266
 
2173
- ### Documentation
1267
+ ### Improved
2174
1268
 
2175
- - Tài liệu ghi rõ dynamic tools, auto context và Context Engine telemetry bật mặc
2176
- định; telemetry vẫn chỉ lưu metadata/hash đã redact, không lưu prompt hay tool
2177
- output thô.
1269
+ - CI installs the same test prerequisite on Ubuntu and macOS, and integration test deadlines allow for filesystem load.
2178
1270
 
2179
- ## v1.2.8 - 2026-07-31
1271
+ ## v1.3.0-ie.3 - 2026-08-11
2180
1272
 
2181
- ### Changed
1273
+ **Deterministic cross-platform helper gate.** The release gate now depends on helper correctness and token reduction, not on timing that varied on Linux CI.
2182
1274
 
2183
- - Global setup/update now installs `pi-web-access@0.17.0` by default so builtin researcher subagents can browse/search/fetch external sources instead of being limited to local repo/docs. Machines that cannot use web research can opt out with `--no-web-access`.
1275
+ ### Improved
2184
1276
 
2185
- ### Fixed
1277
+ - Helper timing stays as a metric, but the release gate checks retrieval correctness, token reduction and privacy.
2186
1278
 
2187
- - Global install/update now removes older platform-owned `pi-web-access` registrations before installing the reviewed exact version, forcing Pi's shared npm package tree to refresh stale transitive dependencies.
1279
+ ## v1.3.0-ie.2 - 2026-08-11
2188
1280
 
2189
- ## v1.2.7 - 2026-07-31
1281
+ **Pi 0.84.1 host pin.** Raises the Pi host pin to 0.84.1, which passes the dependency audit and replaces an expired advisory exception.
2190
1282
 
2191
- ### Security
1283
+ ### Improved
2192
1284
 
2193
- - Updated the pinned MCP and subagent add-ons to `pi-mcp-adapter@2.15.0` and `pi-subagents@0.38.0`. Their resolved runtime tree uses patched `fast-uri@3.1.4`, `@hono/node-server@2.0.12`, and MCP SDK `1.30.0`; a clean resolution reports no add-on advisories.
1285
+ - Pi Coding Agent and Pi AI are pinned to 0.84.1, with host compatibility and package lifecycle checked again.
2194
1286
 
2195
- - Raised the runtime release gate from high/critical to moderate/high/critical. The only remaining accepted finding is the separately documented `brace-expansion` denial of service pinned inside Pi host `0.82.0`.
1287
+ ### Security
2196
1288
 
2197
- ### Fixed
1289
+ - The new host tree audits clean at moderate and above, so the expired 0.82.0 advisory exception is removed.
2198
1290
 
2199
- - Global install/update now removes older registrations for platform-owned MCP and subagent add-ons before installing their reviewed exact versions. This forces npm to refresh stale transitive dependencies instead of retaining a vulnerable version from an older shared Pi package lock.
1291
+ Requires: Pi 0.84.1.
2200
1292
 
2201
- - An existing `pi-subagents` installation is detected and upgraded during a normal platform update. Clean machines still require `--with-subagents`, and `--no-subagents` remains an explicit opt-out.
1293
+ ## v1.3.0-ie.1 - 2026-08-11
2202
1294
 
2203
- ## v1.2.6 - 2026-07-31
1295
+ **Intelligence engine candidate.** Adds a Criterion Graph and bounded current-source context so Luna Medium can plan against your criteria without an extra model turn.
2204
1296
 
2205
1297
  ### Added
2206
1298
 
2207
- - Added Pi Context Engine v2: a local incremental SQLite FTS5 index with symbol and import extraction, hybrid Reciprocal Rank Fusion and personalized PageRank retrieval, hard-budget context packs, reverse-import test impact, and the `piagent-context` terminal command.
1299
+ - A Criterion Graph and bounded current-source context let the model plan against your criteria without a repository index.
2208
1300
 
2209
- - Added Agent Watch compatible context telemetry keyed by Pi session ID and session name. It records model/thinking metadata, active tool counts, usage, retrieval confidence, context-pack utilization, duplicate reads/output, and transparent context-waste metrics without duplicating raw prompts or tool output.
1301
+ ### Improved
2210
1302
 
2211
- ### Changed
1303
+ - Advanced capabilities ship but stay off or advisory by default; verification and permissions are unchanged.
1304
+ - rc.1 and rc.2 remain historical evidence; the ie line uses its own prerelease identity.
2212
1305
 
2213
- - Piagent now starts with a one-tool loader and activates governance, policy, code retrieval, knowledge, onboarding, and usage groups by task shape. Tiny tasks expose 11 of 30 Piagent tools and ordinary tasks expose 15, while runtime guards remain active regardless of the visible tool schema.
1306
+ ## v1.3.0-rc.2 - 2026-08-11
1307
+
1308
+ **Criterion coverage before the first verifier.** Before the first verifier, the agent maps each criterion to implementation and tests, batches independent steps and reviews once.
2214
1309
 
2215
- - Task and scout workflows are risk-adaptive. Unfamiliar work receives one bounded Context Engine pack, low-confidence retrieval permits at most one read-only finder pass, repeated read/search results collapse to a delta marker, and session compaction preserves task state instead of raw logs.
1310
+ ### Improved
2216
1311
 
2217
- - Quality benchmarks now record fresh input, output and cache-read tokens, first-correct-edit time, rework count, and a context-efficiency snapshot so token savings are compared against acceptance and verification quality.
1312
+ - The agent maps every criterion to code and focused tests, batches independent steps and reviews once before verifying.
2218
1313
 
2219
1314
  ### Fixed
2220
1315
 
2221
- - Release installation now removes an older local `@piagent/platform` registration as well as older Git registrations before installing the pinned release, preventing the local checkout and released package from loading together.
1316
+ - A test-only file is no longer shipped in the package, and valid empty JavaScript files pass the source check.
2222
1317
 
2223
- ## v1.2.5 - 2026-07-30
1318
+ ## v1.3.0-rc.1 - 2026-08-11
2224
1319
 
2225
- ### Fixed
1320
+ **Routing, inspector, recovery and helpers.** Adds prelaunch model routing with `piagent-route`, a `/piagent-inspector` view, richer `/piagent-status`, bounded recovery and role-bound helpers.
2226
1321
 
2227
- - `piagent-update` now accepts npm 12's singleton-array `npm view --json` output when resolving the target helper version and its pinned Pi host peer dependency. Empty or multi-entry metadata still fails closed, so the updater never guesses which release or host to install.
1322
+ ### Added
2228
1323
 
2229
- ## v1.2.4 - 2026-07-30
1324
+ - `piagent-route` picks a model by capability band before launch; it never switches models mid-conversation.
1325
+ - `/piagent-inspector` adds a status line and views for diffs, tests, tool outcomes, warnings and context budget.
1326
+ - Failures are classified with at most one source repair or retry; `PIAGENT_AUTO_RECOVERY=off` keeps the old handoff.
1327
+ - Role-bound helpers with budgets and a single writer; `PIAGENT_HELPERS_MODE` defaults to `recommend`.
2230
1328
 
2231
- ### Changed
1329
+ ### Improved
2232
1330
 
2233
- - `piagent-update` remains a global machine update first; optional `--project <path>` now runs a post-update legacy project migration and strict-share doctor when a maintainer wants that extra check.
1331
+ - `/piagent-status` shows task, checkpoint, verifier, recovery, helper and resume evidence.
2234
1332
 
2235
- - Documented the global `npm exec --package @piagent/platform@X.Y.Z -- piagent-update ...` bootstrap command for machines that do not have the global `piagent-update` helper yet.
1333
+ ### Fixed
2236
1334
 
2237
- - `piagent-update` now falls back to a user-writable npm global prefix when the default prefix is locked by the OS, avoiding `/usr/local/lib/node_modules` permission failures during team rollout.
1335
+ - Fixed long-prompt intake, scope resolution and verifier defaults; read-only tasks stay free of edits.
2238
1336
 
2239
- ## v1.2.3 - 2026-07-30
1337
+ ## v1.2.17 - 2026-08-03
2240
1338
 
2241
- ### Added
1339
+ **English documentation for every public page.** All 17 documentation pages now have an English version under `/en`, with VI/EN switching and Vietnamese URLs unchanged.
2242
1340
 
2243
- - Added short runtime command namespaces for team use: `/commands`, `/usage`, `/context`, `/permission`, `/memory`, `/onboard`, `/name`, and `/fresh`.
1341
+ ### Added
2244
1342
 
2245
- - Added a compatibility rewrite for `/piagent-workflow` so older muscle memory routes to `/workflow` instead of becoming a normal agent prompt.
1343
+ - Added an English version of all 17 public documentation pages under `/en`.
1344
+ - Each page links to the same topic in the other language, with localized navigation.
2246
1345
 
2247
- ### Changed
1346
+ ### Fixed
2248
1347
 
2249
- - Consolidated workflow launchers under `/workflow ...` and fresh-session launches under `/fresh task|scout|be-to-fe ...`, reducing accidental scout/log chatter before a user reaches the menu.
1348
+ - On mobile the docs kept desktop sidebar columns; the layout is now a single column again.
2250
1349
 
2251
- - Updated onboarding, quickstart, operator, deployment, and docs-site command references to separate Pi native commands from PiAgent runtime commands. Pi native `/model`, `/session`, `/resume`, `/compact`, and `/mcp` remain unclaimed by PiAgent.
1350
+ ## v1.2.16 - 2026-08-03
2252
1351
 
2253
- ### Removed
1352
+ **GPT-5.5 with high thinking becomes the default.** Setup, global install and the settings template now default to `openai-codex/gpt-5.5:high`; explicit `xhigh` still works.
2254
1353
 
2255
- - Removed prompt-file versions of runtime help commands that should execute locally rather than asking the agent to inspect docs.
1354
+ ### Improved
2256
1355
 
2257
- ## v1.2.2 - 2026-07-29
1356
+ - The default model is now `openai-codex/gpt-5.5:high` across setup, global install and model scope.
1357
+ - A model without a thinking suffix now falls back to `high`; explicit `xhigh` selections are kept.
2258
1358
 
2259
- ### Added
1359
+ ## v1.2.15 - 2026-08-03
2260
1360
 
2261
- - Added compact tool-result rendering for oversized Pi outputs. Small results still pass through unchanged; large redacted outputs now show a bounded preview in Pi and are captured under `.pi/piagent-state/tool-results/` with an `index.jsonl` for offline Agent Watch/reporting.
1361
+ **Stable updates work from local-path installs.** Updating a machine whose Piagent was registered from a local path no longer fails when started outside the Pi agent directory.
2262
1362
 
2263
- - Added `/piagent-logs`, a local slash command that shows the compact-log policy and recent oversized output captures without calling the model or tailing logs in realtime.
1363
+ ### Fixed
2264
1364
 
2265
- - Added `/setname <task/session name>` so an already-open Pi session can be renamed for resume lists, Agent Watch mapping, and weekly reports without restarting Pi.
1365
+ - Stable updates failed on machines with a local-path Piagent registration; the installer now removes it by absolute path.
2266
1366
 
2267
- ### Changed
1367
+ ## v1.2.14 - 2026-08-03
2268
1368
 
2269
- - `/piagent-usage` and `/task-preflight` now render concise status lines instead of long markdown reports while keeping structured details available to the runtime.
1369
+ **Runtime split into modules and native `/name` restored.** The guard is split into focused, integrity-locked modules, and Piagent no longer hides Pi's own `/name` command.
2270
1370
 
2271
- - Workflow prompts and Vietnamese operator docs now tell agents and team members to summarize verify/build failures, quote only relevant lines, and use `/piagent-logs` or narrower commands instead of pasting full terminal dumps into the session.
1371
+ ### Improved
2272
1372
 
2273
- ## v1.2.1 - 2026-07-28
1373
+ - Session, input, context and task intake logic moved out of the guard into modules, with behavior unchanged.
2274
1374
 
2275
1375
  ### Fixed
2276
1376
 
2277
- - The approval gate never covered direct MCP tools. It looked for a tool named `mcp__<server>__<tool>`; the adapter builds a name by joining the server's own name to the tool's, so `github` exposes `github_create_issue` and nothing ever matched. Every server was reachable with one `directTools` setting, which `piagent-mcp add --direct-tools` offers and the docs recommend for small servers. Attribution now runs against the configured server names across every prefixing mode.
1377
+ - Piagent registered its own `/name` and shadowed Pi's command; Pi's `/name` works again and `/setname` stays as an alias.
1378
+ - Legacy task migration keeps long task ids unique and can no longer delete a newly written contract on macOS.
2278
1379
 
2279
- A repository-carried config that sets `directTools` with `toolPrefix: "none"` leaves no evidence of a server in any tool name, so there is nothing to check a decision against. Every tool call in that session is refused while the setting stands. Refusing only the `mcp` proxy, as the first fix did, closed nothing: the proxy is the one form that still names its server, and the bare names it was protecting went straight through.
1380
+ ### Security
2280
1381
 
2281
- The v1.2.0 notes, `docs/mcp-and-tools.md` and the documentation site all stated the direct form was covered. It was not, and the test that asserted it asserted the same invented name shape.
1382
+ - Capability integrity locks now pin every extracted runtime module.
2282
1383
 
2283
- - A repository could reach servers the gate never enumerated through the adapter's `imports` key. `.mcp.json` naming `vscode` pulls servers out of `.vscode/mcp.json`, which travels with the clone, while the gate reported no repository servers at all. Servers reachable through a repository-relative import are now collected and gated whichever layer declares the import, and a repository scope that imports any kind has those servers gated too. `piagent-mcp doctor` names the file and the kinds, and reports a config layer it cannot parse instead of counting it as empty.
1384
+ ## v1.2.13 - 2026-08-03
2284
1385
 
2285
- One kind cannot be enumerated at all: `codex` keeps its servers in TOML, and nothing here parses TOML. Listing the servers of the five readable kinds says nothing about that one, so a repository declaring it has every tool call refused rather than the servers that happened to be readable gated and the rest let through.
1386
+ **Dedicated benchmark page.** A static benchmark page shows the verified production-v1 scores, token usage and paired comparison with simple charts.
2286
1387
 
2287
- - `piagent-mcp doctor` and `list` reported "No MCP servers configured" and exited 0 in exactly the states where the guard was refusing every tool call, and `list` went on to suggest seeding a baseline. Both now report the config that stopped the session and exit 1. The condition is decided in one place that the guard and the CLI both read, because the two disagreeing is what turned a blocked session into an unexplained one.
1388
+ ### Added
2288
1389
 
2289
- - A server imported from a repository-relative file was reported `ready` when a global config declared the import, while the gate treated it as a repository server awaiting approval. Scope answers which layer named the import, not where the definitions came from; a `global` config importing `vscode` reads them out of the clone. Whether a server needs approval is now decided where servers are collected, so both surfaces give the same answer, and the reason names the file the definition actually came from.
1390
+ - Published a benchmark page with production-v1 scores, median usage, paired token comparison and confidence interval.
2290
1391
 
2291
- - `piagent-capability vendor` emptied its destination before checking containment and only tested the immediate parent for a symlink. A repository shipping `.pi` as a symlink had the recursive delete and the fetch land outside the project. The whole path is now verified against the resolved project root before anything is created or removed.
1392
+ ### Improved
2292
1393
 
2293
- Emptying the destination first was also not recoverable: a fetch that failed for any reason — no network, a hostile archive rejected by the symlink check — left the project with neither the new source nor the reviewed one it had been running on. The fetch now lands beside the destination and moves into place only once it has passed every check, so a failed re-vendor leaves the working tree exactly as it was.
1394
+ - Charts are plain CSS with no charting library or data fetch, and read well on desktop and mobile.
1395
+ - The claim is scoped to the controlled public suite, not presented as a universal result.
2294
1396
 
2295
- - The shell guard followed nested interpreters four levels deep and then stopped looking, so a payload wrapped in five layers of `bash -c` was permitted on the strength of a level nobody read. The walk now goes to sixteen levels and refuses a command that nests past it, rather than falling silent.
1397
+ ## v1.2.12 - 2026-08-03
2296
1398
 
2297
- - An artifact shipped by a vendored capability source could change content while the lock still classified as `repin`. Artifact bytes stay on the build side for packs the platform ships — pinning them would stop a policy correction reaching the projects that reference it — but that reasoning does not transfer to a source the project vendored in, whose manifest digest pins the artifact list rather than its contents.
1399
+ **Production benchmark with 108 sessions.** A 108-session benchmark across 18 scenario families measured Piagent at 9.92 overall and about 51% fewer fresh tokens than `codex-cli`.
2298
1400
 
2299
- - A credential in an MCP server URL was stored and displayed in clear text. `add` now refuses userinfo and credential-shaped query parameters the same way it refuses them in `--env` and `--header`, and `list` and `get` mask a URL already on disk.
1401
+ ### Added
2300
1402
 
2301
- - `piagent-mcp approve`, `reject` and `reset` reported success when the approval store could not be written, leaving the operator waiting on a gate that was still blocking. All three now fail with the path that could not be written.
1403
+ - Added `production-v1`: 108 sessions over 18 scenario families, three task sizes, five profiles and hidden oracles.
1404
+ - Added a controlled comparison against `codex-cli` on the same model and thinking, isolated per session.
2302
1405
 
2303
- - A server using `bearerTokenEnvVar` reported `ready` with the variable unset. The field names its variable directly rather than through a `${VAR}` reference, so the scan that finds referenced variables never saw the one setting that guarantees a credential is needed.
1406
+ ### Improved
2304
1407
 
2305
- - A capability pack could declare `activation.mode: "profile"` with no profiles list and crash resolution with a TypeError. The validator requires the list, the same way it already required triggers for trigger activation.
1408
+ - Piagent scored 9.92 overall with a paired fresh-token estimate 51.11% lower (95% ratio 0.3809 to 0.6276).
1409
+ - Recovery guidance now lists only verifier commands still missing passing evidence, each as a separate shell call.
2306
1410
 
2307
- - Every script that takes `--flag <value>` read the next argument without checking it was a value. `--preset full --settings --dry-run` wrote a settings file named `--dry-run`, exited 0 and reported success, having skipped the dry run it was asked for and never touched the real settings file. `init-project.sh` and `setup.sh` checked only that an argument was present, which catches a flag at the end of the line and nothing else. All eight scripts now refuse a flag-shaped value, and the suite asserts it for every value-taking option in `scripts/`, including ones added later.
1411
+ ## v1.2.11 - 2026-08-02
2308
1412
 
2309
- - The shell guard did not see a path reached through an inline interpreter script, an unbalanced quote, or a shell variable with a default. `node -e "require('fs').readFileSync('.env')"`, `cat .env'` and `cat .${X:-env}` all read a protected path without matching one. Literals inside an inline script are now extracted, tokenizing survives a quote with no partner, and a variable's default value is expanded when nothing else defines it.
1413
+ **Task harness v2: one session per task, evidence-gated completion.** Tasks bind to one Pi session, completion requires passing verify evidence, and routine tasks start with no management round trips.
2310
1414
 
2311
- - ANSI-C quoting hid a path from the guard entirely. `$'...'` decodes its escapes before the word is passed on, so `cat $'\x2eenv'` opens `.env` while the guard saw the literal `x2eenv`; a redirection target was not handled at all, so `printf x >$'.env'` truncated a protected file. The same trick reached the exec policy: `rm -rf $'\x2f'` was permitted, having been read as a removal of something called `x2f`. Escapes are decoded — hex, octal, short and long unicode, and the named ones — in tokenizing and in redirection targets alike.
1415
+ ### Added
2312
1416
 
2313
- - The destructive-command checks read raw shell words, so a catastrophic target written as a substitution was compared as literal text and matched nothing. `rm -rf /` was refused while `rm -rf $(printf /)`, `rm -rf $(echo /)`, `` rm -rf `printf /` `` and `find $(printf /) -delete` were all permitted; nothing downstream caught them either, since `/` is not a protected path. `printf` and `echo` with literal arguments are pure text and are now evaluated, so those resolve and the same refusal applies, and a variable holding the target (`D=/; rm -rf "$D"`) is expanded the way the path checks already expand it.
1417
+ - Each task is bound to one Pi session; a retry starts a fresh session and inherits prior failure evidence.
1418
+ - Completion requires every verify command to pass after task start, and changed files are checked against Git and scope.
1419
+ - Added `piagent-benchmark`, a one-command paired comparison of raw Pi, Piagent or `codex-cli` with private reports.
2314
1420
 
2315
- A target only the shell can produce — `rm -rf $(mktemp -d)`, `find $(mktemp -d) -delete` — is a confirmation rather than a refusal: refusing outright takes a common idiom away, and permitting silently is how the check above was walked around.
1421
+ ### Improved
2316
1422
 
2317
- Evaluation is also limited to the `printf` formats the renderer reproduces: `%s` with no flags, width, precision or positional argument, and a format with no conversions at all. Everything else transforms its argument rather than printing it — `%.0s` truncates it away and prints the rest of the format, `%*s` consumes an argument as the width, `%q` requotes, `%b` decodes — so substituting the raw argument produced a value bash never printed. `rm -rf $(printf %.0s/ x)`, `$(printf %*s 0 /)`, `$(printf %.*s 1 /)` and `$(printf %q /)` are all `/` in a shell and were all permitted. `%%` and a format with more arguments than conversions (which bash reuses and this does not) are excluded for the same reason.
1423
+ - Runtime creates bounded task contracts before the first model turn, so routine tasks need no setup tool calls.
1424
+ - One automatic follow-up runs when an agent stops with missing evidence; set `PIAGENT_AUTO_RECOVERY=off` to disable.
2318
1425
 
2319
- The same renderer fed the protected-path scan, so `cat $(printf %.0s.env x)` and `printf data > $(printf %.0s.env x)` reached `.env` without matching it. A `printf` format's literal text arrives in its output whatever the conversions do with the arguments, so it is now read as a path candidate in its own right — with the conversions taken out and what is left closed up, because a conversion that prints nothing lets the text on either side meet: `.e%.0snv` is `.env`, and reading the pieces separately gave `.e` and `nv`, neither of which is a file anybody protects. `printf %.0s.env x` on its own stays permitted, because printing a name is not opening it.
1426
+ ### Fixed
2320
1427
 
2321
- Single quotes suspend substitution, and quoting is gone by the time a word is tokenized, so `rm -rf '$(printf /)'` — a file with an awkward name — was refused as a root removal. Whether the segment contains a substitution the shell would actually run is now read from the raw text, and the scan that reads substitution bodies skips single-quoted text as well: `rm -rf $(printf /) '$(a;b)'` really does remove `/`, and reading the literal beside it as a body made the whole segment unevaluable, dropping a refusal to a confirmation.
1428
+ - `piagent-update` could install a second copy under another npm prefix; it now stays in the prefix that owns the command.
2322
1429
 
2323
- Evaluation is limited to a substitution body that is one plain command and its literal operands. A separator puts a second command after the one being read, so `$(printf /; echo)` is `/` and `$(printf /; printf /)` is `//` however little `printf /` says so; a nested body cannot be located by pattern at all, since a pattern for `$(...)` matches the inner half of `$(printf $(printf /))` and describes a substitution nobody asked about; and quoting is applied before a word is tokenized, so `$(printf '\x2f')` arrives here as `$(printf x2f)`, which evaluates to a value the shell never had. Permitting on a wrong value is worse than not resolving, so any body carrying a separator, a nested substitution, a redirection, a variable, quoting or an escape gives up on evaluation and asks. A substitution still present after the resolution is not treated as resolved.
1430
+ ## v1.2.10 - 2026-07-31
2324
1431
 
2325
- Every round of this so far reported a `printf` format, and reading one operand shape per round is how the same class kept coming back. Four more forms are closed together. Brace expansion runs before every other expansion and was not modelled at all, so `rm -rf {/,}` removed root and `cat {.env,}` opened a protected file while both read as ordinary words — the empty alternative is the whole trick, making a one-word expansion out of a form that does not look like one; it is now performed, and only where the shell would perform it, since quoting suspends it and `"{/,}"` really is one awkwardly named file. `--` ends `printf`'s options, so `$(printf -- /)` prints `/` while the format was read as `--`; any other `printf` option is now treated as one this does not model, since `-v NAME` assigns the result and prints nothing. A target that is nothing but a parameter expansion can be any value, root included: `${HOME:0:1}` is `/`, substring expansion is not modelled, and the word stayed exactly as written — so the shape decides rather than the operator, and a recursive removal of an unresolved whole-word expansion is asked about instead of permitted, while `$TMPDIR/build` is untouched because it cannot become root. And escapes are decoded inside a substitution body the same way they already were elsewhere: `$(echo -e '.en\x76')` and `$(printf %b '.en\x76')` both print `.env`, and the backslash is gone by the time the body is tokenized, so it is read back off the raw text.
1432
+ **Context index hardening and read-only reviewer.** The context index is owner-only and purges deleted source, image auto-attach is scoped, and `piagent-reviewer` is now truly read-only.
2326
1433
 
2327
- The `printf` renderer substituted the raw argument for every conversion and ran the format once, so its output was not what `printf` writes and the protected-path scan never consulted it at all — it was offered the format's literal text and the raw arguments separately. A name assembled out of both went unseen: `.e%.1sv` with `nv` is `.env` while the pieces on offer were `.ev` and `nv`, `au%.2s.json` with `thX` is `auth.json`, and because bash reuses a format while arguments remain, `%s` with `.e` and `nv` is also `.env`. `cat $(printf .e%.1sv nv)`, `printf data > $(printf %s .e nv)` and `printf %s au th.json | xargs cat` all reached a protected file with nothing matching. The renderer now applies precision, width and format reuse, and its output is a path candidate in its own right; printing a name on its own stays permitted, as before.
1434
+ ### Security
2328
1435
 
2329
- Because the rendering is now accurate for those formats, the destructive check no longer merely asks about them: a constant precision or width and format reuse are reproduced byte for byte, so `rm -rf $(printf %.0s/ x)` and `rm -rf $(printf %s / /)` are refused rather than confirmed — they are `/` and `//` in any shell. `*` stays a confirmation even though the renderer now follows one: the width it consumes has its own rules, and a modelling slip there becomes a refusal of something nobody asked for. `%q`, `%b`, the numeric conversions and `%%` are unchanged and still confirmed.
1436
+ - Context index files are owner-only and securely delete removed source; older indexes migrate once to purge leftovers.
1437
+ - Images named in chat are auto-attached only from allowed, non-protected project paths and must be real images.
1438
+ - `piagent-reviewer` now has only read tools; autofix moves to `piagent-worker`.
1439
+ - MCP approval and `piagent-mcp doctor` now detect `directTools` set on individual servers.
2330
1440
 
2331
- Brace expansion was applied to the operands and nowhere else, but the shell performs it before it decides what the command even is. The command name, the flags and the `xargs` payload could all be assembled by it, and each read here as the text the author typed: `r{m,} -rf /` is `rm r -rf /` to the shell and a command called `r{m,}` to this, `rm {-rf,} /` lost the `-rf` the same way, and `fi{nd,} / -delete`, `find / {-delete,}` and `echo / | xargs rm {-rf,}` all went through. The whole word list is expanded now, before anything reads a command name or a flag. `find` also read only its first path operand, so `find fi / -delete` was judged on `fi` — every leading operand is a starting point and all of them are checked.
1441
+ ## v1.2.9 - 2026-07-31
2332
1442
 
2333
- The `xargs` producer reads its own tokens rather than going through the shared candidate path, so the brace expansion done there never reached it: `printf {.env,} | xargs cat`, `printf .{en,}v | xargs cat` and `echo auth{.json,} | xargs cat` each opened a protected file with nothing matching. Quoting still suspends the expansion in both places, so `printf "{.env,}" | xargs cat` names the file it literally names.
1443
+ **Context Engine follows the same policy as the guard.** Context search and packs now use the guard's exclusion rules, so protected content never reaches the model through old indexes.
2334
1444
 
2335
- Expanding braces inside the destructive checks fixed those checks and left every other reader on the raw text, which is not what the shell does — it expands once, before it decides what the command is. So `git reset --har{d,}` passed a legacy pattern, `docker volume pr{une,}` an exec-policy rule, `git p{ush,}` a confirmation pattern, and `{bash,} -c '...'` the nested-interpreter scan, each of them reading the words as typed. The word list is now built in one place and every reader takes it from there. Ranges are expanded as well: they look like they only enumerate counters, but `{n..n}` is a single letter with the braces removed, so `r{m..m}` is `rm`, `fi{n..n}d` is `find` and `.e{n..n}v` is `.env`.
1445
+ ### Fixed
2336
1446
 
2337
- Two things the expansion then exposed. `find` takes its own options before the paths start, and the target scan stopped at the first `-`, so `find -H / -delete` was judged with no target at all; `-H`, `-L`, `-P`, `-O<level>`, `-D` and `--` are skipped now. And a lone `-` between `-c` and the script ends the option list without being the script, so `bash -c - 'rm -rf /'` runs the removal while the scan read `-` and found nothing — which is exactly the shape `bash -{c,} '...'` takes once expanded.
1447
+ - `piagent-update --dry-run --project` showed a stack trace when the project migrator was missing; it now says so directly.
2338
1448
 
2339
- Two readers were still on the raw words after that. The `xargs` producer identified its command as written, so `{printf,} .e%.1sv nv | xargs cat` found no producer at all — the output was never rendered and the `.env` it prints was never offered; the same held for a producer inside a substitution, and for the escape decoding, which is gated on the producer's name too. The producer's *name* now comes from the expanded list while its operands stay on the raw tokens, which are the only thing that still knows where the quotes were.
1449
+ ### Security
2340
1450
 
2341
- And the path candidates expanded braces unconditionally, which was the conservative half of the same problem: `cat "{.env,}"` opens a file with that literal name, and offering `.env` for it refused a command that touches nothing protected. The tokenizer already decides whether the shell would expand a word, and that verdict is now carried to the candidate list instead of guessed at — including for redirection targets, where the scanner reports it alongside the path.
1451
+ - Context Engine and runtime share one policy for protected, read-only and excluded paths.
1452
+ - Indexes built under weaker rules are rebuilt automatically and filtered again at read time.
1453
+ - Symlinks and paths leading outside the project are refused when building and reading the index.
2342
1454
 
2343
- Expanding into a *word list* while still reading operands off the raw tokens left one word doing two jobs. A brace word can produce the command and its arguments together: `{cat,.env}` is `cat .env`, and taking the name from the expanded list and the arguments from the unexpanded one saw a `cat` with no operands at all. The same shape hid a producer's format — `{printf,.e%.1sv} nv` prints `.env` — from the renderer. The expansion now produces a token *stream*, and command, flags and operands all come off it.
1455
+ ## v1.2.8 - 2026-07-31
2344
1456
 
2345
- Quoting is tracked per character rather than per word, because one word can hold both: `"{.env,}"{,}` is the literal `{.env,}` twice, and a single flag for the token could only say "expand it all" or "expand none of it" — the first refused a command that opens nothing protected. Each piece of the syntax is decided on its own, so a quoted opening brace, a quoted comma, and a backslash in front of either each stop the expansion exactly where the shell stops it.
1457
+ **Web research for researcher subagents by default.** Setup and update now install the web access add-on so researcher subagents can search and fetch external sources.
2346
1458
 
2347
- The regression test for this class no longer enumerates formats. It builds the word list `bash` actually builds for each expansion form and requires the policy to agree about what that list contains, in both directions — a catastrophic target must not be permitted, and a protected path must be seen — so a form nobody thought to write down is still compared against the shell rather than against an expectation.
1459
+ ### Added
2348
1460
 
2349
- That test now generates the forms instead of listing them: it assembles spellings out of the pieces a shell composes — quotes, escapes, ANSI-C, braces, ranges, `printf`, parameter expansion — and puts each one in front of several readers. It found three misses on its first run, and one of them was the cause of the other two. A brace group holding a parameter expansion closed on the wrong brace, because the scan for the closing `}` counted the one that ends `${...}`: `{cat,${X:-.env}}` became `cat}` and `${X:-.env}`, so the command was not `cat`, the operand was not a path, and `{rm,-rf,${X:-/}}` was permitted outright. The brace boundaries are now read with the same per-character record of what is syntax and what is text that the alternatives were already split by.
1461
+ - Global setup and update install `pi-web-access@0.17.0` by default; opt out with `--no-web-access`.
2350
1462
 
2351
- A word that is nothing but an unresolved parameter expansion is now refused wherever the command says the word is a file. `cat ${HOME:+.env}` opens `.env`, and every check here read it as a word naming nothing. A command substitution in the same position is left alone deliberately: it carries a command that the nested scan classifies, so `cat $(gh issue create ...)` is still answered as an external write rather than with a vaguer reason. Two expansions with nothing between them are treated as a name being assembled, the same as literal text beside one, because `$(printf %.1sen .Z)$(printf %.1s vZ)` spells `.env` and neither half contains it.
1463
+ ### Fixed
2352
1464
 
2353
- And a pipeline is judged as a pipeline. `echo $F | xargs cat` opens whatever `$F` names while neither segment shows it — the producer only prints, and the consumer's operand list is empty because the filename arrives on stdin. A producer feeding an `xargs` that opens files is now judged against the command at the far end of the pipe. A producer holding no expansion is unaffected, so `git diff --name-only | xargs cat` is untouched.
1465
+ - Older web access registrations kept stale dependencies; install now removes them before installing the reviewed version.
2354
1466
 
2355
- What kept this class alive for so many rounds was never the spelling. A segment had a dozen readers and each derived its own view of it, so closing a form for one reader left it open for the other eleven — and each round closed the reader that had just been reported. The generated corpus was then only generating *operands*, which is why it came back clean while the command name was still being read as written: `rm -rf $(printf /)` was refused because the destructive check resolved its own target, and `r$(printf %s m) -rf /` — the same removal with the name assembled the same way — was permitted by every check in the file.
1467
+ ## v1.2.7 - 2026-07-31
2356
1468
 
2357
- Substitution resolution has moved to where brace expansion already was, so the shell's order — braces, then parameters, then substitutions — is performed once and every reader takes the result. That closed the command name, the `find` and `xargs` operands, the interpreter name in `$(printf %s ba)$(echo -n sh) -c '...'`, the `xargs` consumer in `echo .env | xa$(printf %s rgs) cat`, and the redirection target of a data-only command, which no reader had covered because `printf`'s own arguments are not files even though what `>` names always is.
1469
+ **Patched MCP and subagent add-ons.** The pinned MCP and subagent add-ons move to versions whose dependency tree reports no advisories, and the audit gate is stricter.
2358
1470
 
2359
- Where a name still cannot be resolved, it is now treated as the unknown command it is. `${X:+r}m -rf /`, `${X:+b}ash -c 'cat .env'` and `${X:+cat} ${X:+.env}` are each that command whenever the variable is set, and each read as something harmless with an odd name. A name carrying an expansion no longer has to match a known command for the destructive checks, the interpreter scan or the file-operand net to look at it. A named command with a literal operand is untouched, so `grep -r TODO src` and `npm run $SCRIPT` keep their answers.
1471
+ ### Improved
2360
1472
 
2361
- The corpus that found all of this generates the cross product the bugs actually live in — expansion form × position × reader — putting each spelling in the command name, the operand, a flag's argument, a redirection target, a pipeline producer, an `xargs` consumer and an interpreter payload. It ran clean at 36,000 commands with no missed protected path, no permitted removal of root, and nothing reported for a command that touches neither.
1473
+ - An existing `pi-subagents` install is upgraded during a normal platform update.
2362
1474
 
2363
- One reader was named in that change and not moved: the glob candidates were still read off the words as typed. That mattered more than it looked, because a pattern is the one thing the literal check cannot answer for — `.env*` matches no protected literal, so the glob reader is all that stands between it and the file. `{cat,.env*}`, `{grep,-f,.env*,README.md}`, `cat $({echo,.env*})`, `{bash,} -c 'cat .env*'`, `bash -{c,} 'cat .env*'` and `echo .env* | xargs cat` each read a protected file with no candidate produced at all. It now takes the same word list as everything else, descends the brace-expanded text, and follows a pattern printed into an `xargs` that opens files.
1475
+ ### Fixed
2364
1476
 
2365
- Brace expansion carries its per-character record out with each word instead of dropping it, because one token can produce words that are not the same kind of thing: `{cat,.env*}` is a command and a pattern, and inheriting the token's verdict got one of them wrong. Whether a word is matched against filenames is now decided per word, so `{".env*",x}` names a file and globs nothing, exactly as the shell has it.
1477
+ - Updates could keep a vulnerable transitive version; old add-on registrations are now removed before reinstalling.
2366
1478
 
2367
- The same record fixes the redirection scanner, which kept one flag for the whole target. `printf x > "{.env,}"{,}` is an ambiguous redirect that writes nothing, and expanding the quoted group anyway offered `.env` for a file the command never touches.
1479
+ ### Security
2368
1480
 
2369
- That fix reached the literal reader and stopped at the glob reader, which was still holding the target as typed and answering on the pattern inside it, so the same three commands stayed blocked on `.env` while writing no file at all. Both readers now apply the rule bash applies: a redirection opens its target only where it expands to exactly one word, and answers `ambiguous redirect` otherwise. `> {.env,other}` and `> .en{v,w}*` were the same false positive unreported, while `> {.env,}` really does truncate `.env`, because an empty alternative is dropped rather than counted. A word that can still disappear — an unset variable, or a pattern under `nullglob` — leaves the count unknowable, so those keep every candidate. The flag the scanner used to report beside the mask is gone; a flag for a whole word is what went wrong here to begin with, and two records that can disagree is one too many.
1481
+ - Updated to `pi-mcp-adapter@2.15.0` and `pi-subagents@0.38.0`, which resolve patched dependencies.
1482
+ - The release gate now also blocks moderate advisories; one documented dependency advisory in the Pi host remains accepted.
2370
1483
 
2371
- The generated corpus asserted off the word list bash builds, which for a redirection over-states what it opens — that is how it demanded an answer for `printf x > ".e"{,}nv`, a command that writes nothing. The oracle now asks whether bash opens the target, not what it expands to.
1484
+ ## v1.2.6 - 2026-07-31
2372
1485
 
2373
- The corpus had no `*` in it, which is why it reported clean while all of this was open — a spelling axis missing from the grammar is a class of defect the generator cannot reach. Patterns are now generated too, expanded in a scratch directory holding names a protected pattern matches, since that is the only way to tell an active glob from a quoted one.
1486
+ **Context Engine v2 and task-shaped tool loading.** A local code index builds bounded context packs, and Piagent exposes only the tools a task needs while guards stay active.
2374
1487
 
2375
- - A finding's strength depended on how its sentence started. The exec-policy decision was derived from the prose of each reason — "Refusing", "Forbidden", "Prompt" — rather than from the action the check had already recorded, so a finding whose wording did not begin with one of those words was recorded, displayed, and then counted as `allow`. The decision now reads the recorded action, with the prose test kept for the legacy confirmation patterns, which record a reason and no action.
1488
+ ### Added
2376
1489
 
2377
- - The MCP gate is cached per project and recomputed when a signature over the files behind it changes. That signature was written out by hand from the repository layers, while the check it guards had grown to read merged settings from all four scopes and to stat import targets outside the repository. Adding `directTools: true` to a personal global config while a repository set `toolPrefix: "none"` therefore left an already-loaded guard permitting tool calls that `piagent-mcp doctor` was reporting as blocked, until the module happened to be reloaded; an `imports: ["codex"]` declaration behaved the same way once the codex config appeared. The file list now comes from the same traversal the readers use, absences included, so a reader that starts consulting a new file is watched for it without a second list needing to be updated to match.
1490
+ - Added Context Engine v2: a local incremental code index with budgeted context packs and the `piagent-context` command.
1491
+ - Added Agent Watch compatible context telemetry by session, without storing raw prompts or tool output.
2378
1492
 
2379
- - The shell guard read `>|` as a pipe. Splitting there made the file being truncated the first word of a second command, where it read as an executable name, so `printf x >| .env` overwrote a protected path without matching one. `>&word` opens that word for writing unless a digit or `-` follows, and the whole form was skipped; a redirection can also precede its command, where it was read as the command name. Paths carried as an operand value (`dd if=`, `--file=`), inside an array literal, or rewritten by a parameter operator (`#`, `%`, `/`) were not resolved either, and a word was split at the space inside `$( )`, so the filename being assembled was never a single token.
1493
+ ### Improved
2380
1494
 
2381
- Where a filename still cannot be resolved — literal text glued onto a substitution, as in `cat .en$(echo v)` — the command is refused and the word that caused it is named. Matching the literal half against the protected patterns answers a different question than the one being asked.
1495
+ - Tools load by task shape: tiny tasks see 11 of 30 Piagent tools, ordinary tasks 15; guards apply regardless.
2382
1496
 
2383
- - `piagent-mcp list --json` reported `servers: []` and exited 0 while the guard was refusing every tool call, so a caller scripting against it read the blocked state as an empty one. Its exit code now answers whether MCP can work here rather than whether any rows printed, and the JSON carries the reason. The in-session `/piagent-mcp status`, `doctor` and menu report it too: all three surfaces now read one shared state instead of assembling their own from a different subset of the same calls.
1497
+ ### Fixed
2384
1498
 
2385
- - The adapter merges `settings` across all four config layers into one session-wide block. `directTools` set in one file and `toolPrefix: "none"` set in another therefore produced a session with neither property visible to a check that read either file on its own — the exact combination that leaves the approval gate nothing to check. Settings are now read merged, and the report names both files, since editing either one fixes it.
1499
+ - A local checkout and the released package could load together; install now removes older local registrations.
2386
1500
 
2387
- - `remove`, `enable` and `disable` on a server reached through `imports` wrote to a file the adapter does not read for that server, so the command reported success and the next tool call still reached it. Worse, the file it located was the other tool's config: the write would have rewritten somebody's Cursor or VS Code file in this platform's format. All three now refuse and name the file that actually defines it.
1501
+ ## v1.2.5 - 2026-07-30
2388
1502
 
2389
- - The menu and the detail view decided whether a server needed approval from its scope. A repository-relative import declared by a `global` config carries the scope `global` and a definition read out of the clone, so the servers whose origin is hardest to see were the ones never offered a decision. Both now use the same rule the gate uses.
1503
+ **`piagent-update` works with npm 12.** The updater now reads npm 12's registry output when resolving the target version and its Pi host.
2390
1504
 
2391
- - Approving showed the fragment the repository layer contributed rather than the definition that runs. The adapter merges a same-named server key by key across layers, so a repository declaring only `{"args": [...]}` inherits its command from a lower layer, and the operator was consenting to a command line they were never shown. The preview is now the merged entry; the digest stays over the repository's own fragment, so editing a personal global config does not return a server to pending.
1505
+ ### Fixed
2392
1506
 
2393
- - A repository importing `codex` had every tool call refused whether or not that config existed on the machine. An import of a kind nothing here can parse is a hole only when the file it names is actually there; otherwise it is a config to clean up, not a session to stop.
1507
+ - `piagent-update` failed to read npm 12 version metadata; it now accepts it and still refuses ambiguous results.
2394
1508
 
2395
- - An MCP config that parses but is not a JSON object was read as empty, so the next write replaced it with this tool's shape and destroyed whatever the document had been. It is now refused. A write also no longer follows a symlink at the config path, drops `imports` kinds this version does not recognise, or hides an import target that exists but cannot be parsed — that last one reported as no servers, which is indistinguishable from a tool that defines none.
1509
+ ## v1.2.4 - 2026-07-30
2396
1510
 
2397
- - The approval store could not tell absent from unreadable. Both read as pending, which is right for the gate and wrong for a write: recording one decision on top of a store this process could not parse discarded every decision in it, including the ones for other projects, whose only symptom would be returning to pending one at a time. Writes now refuse when the store could not be read.
1511
+ **Smoother team rollout for `piagent-update`.** Updates fall back to a user-writable npm prefix, and `--project` adds an optional migration and doctor check.
2398
1512
 
2399
- ### Changed
1513
+ ### Improved
2400
1514
 
2401
- - `docs/mcp-and-tools.md` records the config path and server key each supported import kind actually uses, against what the adapter reads. Three of the six disagree, so the platform reads the union: listing a server that never loads costs one approval, missing one costs the gate.
1515
+ - Optional `--project <path>` runs a legacy project migration and doctor after the global update.
1516
+ - Documented an `npm exec` bootstrap command for machines without the global `piagent-update` helper.
2402
1517
 
2403
- - `verify` refuses a source file carrying a control byte. Three files held a raw NUL inside a string literal — used as a key separator, and as ZIP magic in a test fixture. They ran correctly, but Git classified them as binary, which took them out of every grep-based gate in `verify`, including the wording checks, and out of the diff a reviewer sees on a pull request. The bytes are written as escapes now.
1518
+ ### Fixed
2404
1519
 
2405
- ## v1.2.0 - 2026-07-28
1520
+ - Updates failed with permission errors when the npm prefix was OS-locked; they now use a user-writable prefix.
2406
1521
 
2407
- ### Added
1522
+ ## v1.2.3 - 2026-07-30
2408
1523
 
2409
- - `piagent-mcp` manages servers instead of only seeding presets: `add`, `remove`, `get`, `list`, `enable`, `disable` and `doctor`, across the four config layers via `--scope`. `add` reports which scope it wrote and the exact file it changed, so nobody has to guess which layer is in effect. A server added by hand keeps surviving `piagent-update`, because a preset only rewrites the server IDs it owns.
1524
+ **Short runtime commands.** Short commands such as `/usage`, `/context` and `/permission` were added, and workflows moved under `/workflow` and `/fresh`.
2410
1525
 
2411
- - A server a repository defines is not usable until somebody on this machine approves it. `.mcp.json` and `.pi/mcp.json` travel with a clone, and opening a session in one should not hand its author a process here with this operator's credentials. `piagent-mcp approve` prints the definition before recording the decision, `reject` and `reset` are the other two answers, and the decision is stored in `~/.pi/piagent-mcp-approvals.json` rather than in the repository — a repository that can approve its own servers has not been gated.
1526
+ ### Added
2412
1527
 
2413
- The record pins the digest of what was approved. Approval is consent to what the server runs, so changing its command, URL or arguments returns it to pending, which is the same split the capability lock draws between consent and build.
1528
+ - Added `/commands`, `/usage`, `/context`, `/permission`, `/memory`, `/onboard`, `/name` and `/fresh`.
2414
1529
 
2415
- Enforcement is in the guard's `tool_call` hook. As shipped in this version it covered the `mcp` proxy only — the direct-tool branch matched a name shape the adapter does not emit, so it never fired. See v1.2.1. The adapter owns the connection and the extension cannot prevent one being opened, so what is stopped is every tool call, not the connection itself. Servers in the global layers are not gated: nothing a repository contains can put a server there.
1530
+ ### Improved
2416
1531
 
2417
- - MCP is a command inside a session, not a request to the model. `/piagent-mcp` on its own opens a menu, because a surface only helps if it can be found without already knowing the subcommand. The menu is built from what the project has: approving is not offered when nothing is waiting on a decision, and each entry carries its own count. Picking an action that needs a server asks which one, unless there is only one it could be.
1532
+ - Workflow launchers are grouped under `/workflow`, and `/piagent-workflow` still routes there.
1533
+ - Docs now separate Pi native commands such as `/model` and `/resume` from Piagent commands.
2418
1534
 
2419
- Every entry is also typeable — `status`, `get`, `doctor`, `approve`, `reject`, `reset`, `enable`, `disable` — and both paths run the same code, so the menu teaches the direct form instead of replacing it. Subcommands and server names autocomplete. Where no prompt can be answered, in print and JSON mode, the report and the subcommand list are printed rather than blocking on a question nobody can answer.
1535
+ ## v1.2.2 - 2026-07-29
2420
1536
 
2421
- Typing the shell command mid-session asked the model to run bash, read the output and report back — three model turns for a question this process answers from files it has already read, and a different summary each time. Pi dispatches a registered command straight to its handler, so the model is not involved at all.
1537
+ **Compact output for large tool results.** Oversized tool output shows a bounded preview and is saved locally, and `/setname` renames an open session.
2422
1538
 
2423
- Adding and removing a server stay in the terminal: `add` carries shell quoting, `${VAR}` references and a `--` command line. Those already have one correct parser, and it is the shell; a slash command that re-implemented it would be a second, worse one. `/piagent-mcp add` prints the terminal command rather than guessing at one.
1539
+ ### Added
2424
1540
 
2425
- Both surfaces read the same module, so the two cannot disagree about whether a server is usable. Remedies name the form that works where they are read: the session prints `/piagent-mcp approve <name>`, the terminal prints `piagent-mcp approve <name>`.
1541
+ - Large tool results show a bounded preview and are saved under `.pi/piagent-state/tool-results/`.
1542
+ - Added `/piagent-logs` to see recent oversized output captures without calling the model.
1543
+ - Added `/setname` to rename an open session for resume lists, Agent Watch and reports.
2426
1544
 
2427
- - `piagent-mcp doctor` and `piagent-doctor` say what each configured server still needs — a referenced variable that is not exported, an executable that is not on PATH, a decision that has not been made, the Docker daemon not answering. Counting configured servers, which is what the doctor did before, says nothing about whether any of them can answer. A session start names the ones that are definitely stuck; `PIAGENT_NO_MCP_NOTICE=1` switches that off.
1545
+ ### Improved
2428
1546
 
2429
- ### Changed
1547
+ - `/piagent-usage` and `/task-preflight` now print short status lines.
2430
1548
 
2431
- - `piagent-mcp add` refuses to write a credential into MCP config and prints the reference form to use instead. The check reads both the field name and the value, so `--env CONFIG=ghp_...` is caught as well as `--env GITHUB_TOKEN=...`, and it covers `--header` too. `--url` accepts https, or http only on loopback. `list` and `get` mask values while leaving `${VAR}` readable, because that is a variable name rather than its contents.
1549
+ ## v1.2.1 - 2026-07-28
2432
1550
 
2433
- OAuth is not automated and no token is stored by this platform. Pi already owns that flow — `/mcp-auth <server>` — and a third credential store holding other people's credentials would be worse than either of the two that already exist.
1551
+ **MCP approval gate and shell guard fixes.** The MCP approval gate now covers direct tools and imported servers, and the shell guard reads commands the way the shell expands them.
2434
1552
 
2435
- - `scripts/configure-mcp.sh` is replaced by `scripts/mcp-manage.mjs`; the pinned server catalog moved into `packages/piagent-core/mcp/`, where the capability lock pins it. The `piagent-mcp` command is unchanged. The three MCP files that decide which servers a session may call are now part of the locked runtime set.
1553
+ ### Fixed
2436
1554
 
2437
- - The docs site is one page per topic instead of a single file, grouped in the sidebar as Get started, Build, MCP and Operate. MCP has four pages of its own, since it now has a command surface, an approval decision and an auth story to explain. Each page carries a table of contents and previous/next links.
1555
+ - `piagent-mcp doctor` and `list` reported no servers while every tool call was blocked; they now name the cause and exit 1.
1556
+ - A failed `piagent-capability vendor` could delete files outside the project or leave none; it now changes nothing on failure.
2438
1557
 
2439
- Pages are generated by `scripts/build-docs-site.mjs` from a content fragment each, plus shared `docs-site/assets/docs.css` and `docs-site/assets/docs.js`. The generated HTML is committed, because the site is served as static files with no build step, and `npm run verify` fails when the committed output no longer matches its source. `npm run site:preview` serves the result the way the deployment does — the site relies on clean URLs, so an ordinary static server answers 404 for every internal link.
1558
+ ### Security
2440
1559
 
2441
- - Public text describes this platform on its own terms rather than against named competing products. The page that compared feature tables now states what the platform takes on and what it leaves to the host, and is called Phạm vi platform rather than carrying two other products' names in the sidebar of every page. The same wording pass covers the MCP pages, `docs/mcp-and-tools.md` and a design-rationale comment in `document-intake.ts`.
1560
+ - MCP approval never applied to direct MCP tools; every server is now gated whatever tool naming mode it uses.
1561
+ - Servers pulled in through a repository's `imports` setting are now listed and require approval.
1562
+ - The shell guard now resolves braces, quoting, `printf` and substitutions before checking protected paths and deletes.
1563
+ - `piagent-mcp add` refuses credentials in server URLs, and `list` and `get` mask them.
2442
1564
 
2443
- Where "Codex" and "Claude" mean model families they are now labelled as such, with their provider ids, so a reader cannot mistake a model choice for a different tool. `--model-scope` and `--preset` say "model families" in their help text for the same reason.
1565
+ ## v1.2.0 - 2026-07-28
2444
1566
 
2445
- The wording gate in `npm run verify` only read `README.md`, `docs/`, the prompts and the project template, which is why the site and the runtime strings were never checked. It now also reads `docs-site/content`, the site builder — navigation labels live there, not in a fragment — and the `mcp` and `extensions` directories that print to an operator.
1567
+ **MCP server management with repository approval.** `piagent-mcp` now manages servers, and servers defined by a repository need local approval before use.
2446
1568
 
2447
- ## v1.1.9 - 2026-07-28
1569
+ ### Added
2448
1570
 
2449
- ### Fixed
1571
+ - `piagent-mcp` gains `add`, `remove`, `get`, `list`, `enable`, `disable` and `doctor` across config layers.
1572
+ - `/piagent-mcp` opens an in-session menu for status, approval and diagnostics without a model turn.
2450
1573
 
2451
- - The update notice reaches the install path people actually use. v1.1.8 decided a platform tree was a maintainer's working copy when it found a `.git` directory in it — but `pi install git:...` clones the repository, so an ordinary install carries a `.git` and every other file a working copy carries. There is no mark inside the tree that separates them, which meant the notice never appeared for anyone who installed the documented way.
1574
+ ### Improved
2452
1575
 
2453
- What separates them is where they sit: Pi puts packages it installed under its own agent directory, and npm puts the global helper under `node_modules`. A tree anywhere else is a working copy and is still told nothing. `PI_CODING_AGENT_DIR` is honoured, and both paths are resolved before comparison, because a home reached through a symlink is ordinary — macOS reaches `/var` that way — and comparing a real path against a symlinked one made an install look like it was somewhere else.
1576
+ - The docs site is split into one page per topic, with four pages for MCP.
2454
1577
 
2455
- ## v1.1.8 - 2026-07-28
1578
+ ### Security
2456
1579
 
2457
- ### Added
1580
+ - Servers defined in a repository need `piagent-mcp approve` on this machine; changing their command resets approval.
1581
+ - `piagent-mcp add` refuses to write credentials into MCP config and shows the reference form to use.
2458
1582
 
2459
- - Pi says when a release is out, and names the command that takes it. The notice appears in the session-start line as `Piagent update available: 1.1.7 -> 1.1.8. Run \`piagent-update\` to move this machine to it.` Nobody has to remember to go and check, which until now was the only way to find out.
1583
+ ## v1.1.9 - 2026-07-28
2460
1584
 
2461
- It costs the session nothing. The session reads a cache and, when that cache is older than a day, leaves a detached `npm view` behind to refresh it — so the first session after a release may still be quiet and the next one carries the notice. This is the only network traffic the guard originates, it sends nothing about the project, and the registry's answer reaches the terminal only if it is exactly `MAJOR.MINOR.PATCH`, so neither a hostile registry nor an edited cache can put chosen text in front of an operator. A checkout is never told to update. `PIAGENT_NO_UPDATE_CHECK=1` switches it off.
1585
+ **Update notice reaches ordinary installs.** The update notice from 1.1.8 was hidden on installs cloned by Pi; it now appears for every non-development install.
2462
1586
 
2463
- ## v1.1.7 - 2026-07-28
1587
+ ### Fixed
2464
1588
 
2465
- A platform update is one global install. It was not behaving like one: every project that selected capability packs stopped working after a release until its profile was reapplied by hand, and the policy a release corrected never reached a project that had already onboarded.
1589
+ - Installs from Git were mistaken for working copies and got no update notice; they now see it.
2466
1590
 
2467
- ### Changed
1591
+ ## v1.1.8 - 2026-07-28
2468
1592
 
2469
- - A capability lock that is behind the installed platform is re-pinned instead of refusing the session. The lock pinned two different things and gave them one answer. What the project consented to — which packs, from where, and how far they may reach — still blocks: a grant that widens, a protection that disappears, a pack that changes identity. Which build produced the resolution — package version, runtime file digests, artifact content — moves on every release, and blocking on it put a per-project chore behind a global update while not defending against the case it resembles, since the code that verifies the lock is itself one of the files the lock pins. A build move with an unchanged grant is recorded and reported.
1593
+ **Pi tells you when a release is available.** The session-start line now shows when a newer Piagent is out and names `piagent-update` as the command to run.
2470
1594
 
2471
- - Artifact content is part of the build, not part of consent. Adapter policy files, base policy, prompts, skills, subagents and recipes all ship as pack artifacts, so pinning their bytes meant a corrected policy could never reach a project referencing it. Nothing is given up: which artifacts a pack provides is declared in its manifest and the manifest digest is still pinned, so an artifact that appears, disappears or moves still blocks — and a policy artifact that weakens still blocks, because the permissions it resolves to are compared directionally.
1595
+ ### Added
2472
1596
 
2473
- - A project profile can name the adapter it takes its policy from instead of copying it. `{"extends": "web-frontend", "projectId": ..., "displayName": ...}` keeps the project's identity and overrides in the project, and resolves the rest from the installed platform at runtime. Any key the project states replaces the adapter's key whole; a profile without `extends` keeps working exactly as before, self-contained. `init-project.sh` and `/onboard-project` write this form when the profile comes from a built-in adapter, so onboarding stays the one per-project step and updating stays global.
1597
+ - The session-start line shows an update notice naming `piagent-update` when a new release exists.
2474
1598
 
2475
- A profile naming an adapter that is not installed refuses rather than falling back to something weaker.
1599
+ ### Improved
2476
1600
 
2477
- ## v1.1.6 - 2026-07-27
1601
+ - The check reads a cache refreshed in the background at most daily, so sessions do not wait on it.
2478
1602
 
2479
- Monorepo fixes found auditing how the platform scopes itself to a project. Every case was reproduced against a real directory tree before it was changed.
1603
+ ## v1.1.7 - 2026-07-28
2480
1604
 
2481
- ### Fixed
1605
+ **Projects keep working after a platform update.** Capability locks behind the installed platform are re-pinned instead of blocking the session, and policy fixes reach every project.
2482
1606
 
2483
- - `be-readonly-fe` keeps the backend read-only in a monorepo. Its `readOnlyPaths` and `shellProtectedPaths` were anchored at the repository root, so `backend/**` and `apps/api/**` covered a backend sitting at the top of the tree and nothing else. Choosing the profile on a repository whose backend lives in `packages/api`, `apps/backend` or `services/payments` produced a profile that announced the backend was read-only while leaving every file in it writable — the one guarantee the profile exists to make. The backend directories under `apps/`, `packages/` and all of `services/*` are covered now.
1607
+ ### Added
2484
1608
 
2485
- They are enumerated rather than matched with `**/api/**`, which would have swept in `packages/web/src/api/` — the frontend's own HTTP client — and frozen the half of the repository the profile is meant to leave writable.
1609
+ - A project profile can `extends` an adapter instead of copying its policy.
2486
1610
 
2487
- - The frontend verify command finds a frontend that is not at `frontend/` or `apps/web/`. It fell through to the repository root, where a workspace root has no `type-check` script, so verification reported success having run nothing. `apps/frontend`, `packages/web`, `packages/frontend` and `client` are looked at too.
1611
+ ### Improved
2488
1612
 
2489
- - `apps/backend` is read as a backend. `apps/frontend` counted as a frontend marker while only `apps/api` and `apps/server` counted as backend ones, so a repository that named both halves symmetrically was detected as frontend-only and offered `web-frontend`. `client/` and `server/` at the root were not markers either.
1613
+ - Policy, prompt and skill content now follows the installed platform, so corrections reach existing projects.
2490
1614
 
2491
- - Frontend and backend are detected inside declared workspaces. Nothing read the `workspaces` field or `pnpm-workspace.yaml`, and nothing looked under `packages/`, so a pnpm monorepo fell through every marker to `generic`. Each declared package is now read through its own manifest and layout, which is what identifies `packages/storefront` and `packages/gateway` as the two halves of a fullstack repository. Only a trailing wildcard is expanded, absolute and `..` patterns are refused, and at most 64 packages are read.
1615
+ ### Fixed
2492
1616
 
2493
- ### Changed
1617
+ - Projects with capability packs stopped working after each release until reapplied; the lock is now re-pinned automatically.
2494
1618
 
2495
- - Profile detection lives in `packages/piagent-core/extensions/project-shape.js`. `piagent_profile_options` and `scripts/init-project.sh` each carried their own copy of the rules and had drifted; the `apps/backend` gap above was present in both, and a fix to either would have left the other wrong. The file is covered by the capability lock, because steering which profile a project is offered is a way to choose what the guard ends up enforcing.
1619
+ ## v1.1.6 - 2026-07-27
2496
1620
 
2497
- ## v1.1.5 - 2026-07-27
1621
+ **Monorepo detection and scoping fixes.** Profiles now detect and scope frontend and backend packages correctly in monorepos and workspaces.
2498
1622
 
2499
- ### Added
1623
+ ### Fixed
2500
1624
 
2501
- - `piagent-update` moves a machine from one release to the next in one command. A release is three independently versioned things — the Pi host, the npm-global terminal helper, and the Pi package — and they have to move in that order, because `piagent-install` refuses to run against a host that does not match the version its own package.json pins and does not install one itself. Doing it by hand is three commands and one ordering rule that fails late when it is got wrong.
1625
+ - `be-readonly-fe` left nested backends writable in monorepos; they are now read-only.
1626
+ - Frontend verify ran nothing and reported success when the frontend sat elsewhere; it now finds the right package.
1627
+ - Packages declared in `workspaces` or `pnpm-workspace.yaml` were ignored; detection now reads them.
2502
1628
 
2503
- Every version the run needs is resolved from the registry before anything is installed, including the host version taken from the *target* helper's published metadata rather than the running one, so `--check` and `--dry-run` describe exactly what a real run would do. After the helper replaces itself the run confirms that the version on disk is the one it asked for, and stops before touching the Pi package if it is not. Running it from a git checkout is refused rather than replacing that checkout's commands with a published build.
1629
+ ## v1.1.5 - 2026-07-27
2504
1630
 
2505
- `--check`, `--dry-run`, `--version X.Y.Z`, `--force`, `--project <path>`, `--no-host`, `--no-package`, and pass-through to `piagent-install` after `--`.
1631
+ **One-command update with `piagent-update`.** `piagent-update` moves the Pi host, helper and Pi package to the next release in the correct order.
2506
1632
 
2507
- ### Fixed
1633
+ ### Added
2508
1634
 
2509
- - `docs/release-install-policy.md`, `docs/team-onboarding.md` and `docs/command-reference-vietnamese.md` described the manual update sequence without saying why its order is mandatory. `piagent-install` fails on a host mismatch; the auto-install of a matching host lives in `setup.sh` and does not apply to that flow.
1635
+ - Added `piagent-update`, which updates the Pi host, terminal helper and Pi package in order.
1636
+ - `--check` and `--dry-run` show exactly what a real run would install, resolved before anything changes.
2510
1637
 
2511
1638
  ## v1.1.4 - 2026-07-27
2512
1639
 
2513
- ### Fixed
1640
+ **Redaction of credentials in command options.** Credentials passed as command-line options or `Authorization` headers are now redacted reliably.
1641
+
1642
+ ### Security
2514
1643
 
2515
- - A credential passed as a command-line option is recognised as one. `--token=abc123`, `--token abc123`, `--password`, `--api-key`, `--client-secret` and the rest went unrecognised because the assignment patterns require a key that starts with a letter, and `-` is not one. v1.1.3 made the redactor's verdict the gate that decides whether a command may serve as verify evidence, so anything it missed was stored in the clear *and* accepted as proof — the same invariant v1.1.3 was written to enforce, defeated by the syntax most command-line tools actually use. Env-style assignments were the only shape covered.
2516
- - An `Authorization` header is redacted wherever it sits among the arguments. The value ran to the end of the line, so the same credential survived or not depending on how much text happened to follow it: `curl URL -H "Authorization: Token abc123"` left the header value one character under the length bar, while moving the header ahead of the URL swept the URL into the value and pushed it over. The value is now the single whitespace-free token that follows the scheme, and under a known authentication scheme its length is not consulted at all. Prose such as `Authorization: not required for local runs` is still left alone.
1644
+ - Options such as `--token`, `--password` and `--api-key` were not redacted; their values are now hidden.
1645
+ - `Authorization` header values are redacted wherever they appear in the arguments.
2517
1646
 
2518
1647
  ## v1.1.3 - 2026-07-27
2519
1648
 
2520
- Fixes for defects found reviewing v1.1.2 after it shipped, including two introduced by v1.1.2 itself. Every fix was reproduced first.
1649
+ **Fixes for issues found reviewing 1.1.2.** Short secrets are redacted, verify evidence identifies commands exactly again, and document reads no longer hang on pipes.
2521
1650
 
2522
1651
  ### Fixed
2523
1652
 
2524
- - Verify evidence identifies the command exactly again. v1.1.2 moved the digest onto the redacted text to stop it confirming guesses at a secret, and in doing so gave every secret the same identity: an observation of `DATABASE_PASSWORD=CorrectHorse42 npm test` satisfied a claim about `DATABASE_PASSWORD=DifferentHorse99 npm test`, so a run against one database could be recorded as proof for another. That contradicts the exact-match rule the gate is built on. Neither text is safe to hash, so a command with anything to redact now gets no digest at all and cannot be evidence; the gate says so instead of matching loosely. Commands with no secret in them — every legitimate verify command — are identified by their own text as before.
2525
- - A document replaced by a named pipe is refused instead of hanging. The identity check that would have rejected it runs after the file is opened, and opening a pipe waits for a writer, so the substitution did not have to defeat the check — it only had to stop it from running. The read blocked indefinitely. The file is now opened without blocking and without following a symbolic link at the final component.
2526
- - Short credentials are redacted. Values under a key that names a secret outright were kept in the clear below eight or twelve characters, so `TOKEN=hunter2` was stored verbatim in the evidence ledger. Length is only ambiguous after a bare `:`, where English uses the same shape — `password: short` is prose, and `Authorization: Token abc` puts a scheme name where a value would go. Under `=`, inside quotes, in a query string, or as a field in a structure, any value that is not a placeholder is now redacted at any length.
2527
- - A redirect must land on the page being verified. `npm run site:check` compared the hostname, scheme, port and credentials of the redirect target but not its path, so `/missing` or `/?release=old` passed while the run only ever fetched `/`.
2528
- - `piagent-install` reports a missing Node runtime as a missing Node runtime. Validating the MCP preset early, added in v1.1.2, put a Node script ahead of the Node version check, so on a machine without Node the installer failed with `node: command not found` and blamed the preset.
1653
+ - Verify evidence gave commands with different secrets the same identity; each command is identified exactly again.
1654
+ - Reading a document replaced by a named pipe hung; it is now refused.
1655
+ - `piagent-install` showed `node: command not found` without Node.js; it now reports the missing runtime clearly.
2529
1656
 
2530
- ### Changed
1657
+ ### Security
2531
1658
 
2532
- - `docs/release-install-policy.md` named the wrong release for the code-scanning gap. A pull request last merged with a failing CodeQL check and an open high alert on `v1.1.0`; on `v1.1.2` the results gate blocked the pull request until the alerts were cleared.
1659
+ - Short secret values such as `TOKEN=hunter2` were stored in clear text; they are now redacted.
2533
1660
 
2534
1661
  ## v1.1.2 - 2026-07-26
2535
1662
 
2536
- Security and release-gating fixes found reviewing v1.1.1 after it shipped. Every fix in this release was reproduced as a working exploit or failure first.
1663
+ **Security and release gating fixes.** Document reads close a file-swap race, evidence no longer hashes unredacted commands, and publishing waits for all checks.
1664
+
1665
+ ### Improved
1666
+
1667
+ - Publishing now waits for the full verification matrix to pass.
2537
1668
 
2538
1669
  ### Fixed
2539
1670
 
2540
- - `piagent_document_read` no longer re-opens the file by name after checking it. Containment in a granted root, the extension, the size limit, and the guard's protected-path check were all decided from one `realpath` and `stat`, and then `readFileSync` resolved the name a second time. Replacing the checked file with a symbolic link in between returned the contents of a file outside every granted root — reproduced end to end. The file is now opened once and read from the descriptor, and the descriptor's device and inode must equal the file that passed the checks or nothing is read. `pdftotext` is handed the same descriptor on standard input instead of a path, so the converter cannot be pointed elsewhere either.
2541
- - The evidence ledger no longer stores a digest of the unredacted command. It wrote a redacted command such as `export TOKEN= [REDACTED_SECRET] && npm test` beside a SHA-256 of the real line, so the redaction published the template and the hash confirmed guesses against it: the only unknown left was the secret, and SHA-256 is fast enough to walk a candidate list offline. A three-candidate list recovered the test secret. The digest now covers the redacted text, which is exactly what the file already shows, and command matching is unaffected because both sides redact before hashing. The CodeQL alert covering this line was dismissed as a false positive in v1.1.1; that dismissal was wrong and has been reversed.
2542
- - `npm run site:check` no longer waits indefinitely on a peer that answers slowly. The request timeout measures socket inactivity, not elapsed time, so a server sending one byte per second reset it forever — a probe was still pending after 40 seconds and would have held the release gate open indefinitely. There is now a wall-clock deadline for the whole request.
2543
- - A redirect that keeps the hostname is no longer accepted whatever else it changes. Only the hostname was compared, so a redirect to plaintext HTTP, to another port, or to a URL carrying credentials passed as if it were the site being verified.
2544
- - A document path containing a control character is refused. Refusal messages and the read header quote the path back outside the data region, so a file named with an embedded newline wrote its own lines there, at instruction level. Paths in the header are additionally escaped when printed.
2545
- - `.docx` text is decoded strictly. The strict decoding added in v1.1.1 covered plain text only, so a `.docx` whose `word/document.xml` was not valid UTF-8 still returned `ok` with replacement characters in the extracted prose.
1671
+ - An unknown `--mcp-preset` failed only after a partial install; it is now rejected before anything is installed.
2546
1672
 
2547
- ### Changed
1673
+ ### Security
2548
1674
 
2549
- - Publishing now waits for the full release matrix. `publish.yml` and `verify.yml` were independent workflows triggered by the same tag and raced: v1.1.1 finished publishing at 08:03:43Z while the Ubuntu verify job ran to 08:03:48Z and macOS to 08:03:54Z. A macOS-only failure, a runtime audit finding, or a release-identity mismatch would have been reported after the version was already on the registry, where it cannot be withdrawn. `verify.yml` is now a reusable workflow that `publish.yml` calls and depends on.
2550
- - An unknown `--mcp-preset` is rejected before anything is installed. The preset was read only at the final configuration step, so a typo failed after the platform package and the MCP adapter had already been installed, leaving a half-configured machine — and the dry run exited `0` because it never reached the check.
2551
- - `piagent-setup --no-mcp --mcp-preset <name>` fails instead of succeeding with the preset dropped. `piagent-install` already rejected that pair, but setup never forwarded both flags, so the check could not see it.
1675
+ - `piagent_document_read` could read a file swapped in after its checks; it now reads the file it checked.
1676
+ - The evidence ledger no longer stores a hash that could confirm guesses at a redacted secret.
2552
1677
 
2553
1678
  ## v1.1.1 - 2026-07-26
2554
1679
 
2555
- Fixes for defects found reviewing v1.1.0 after it shipped.
1680
+ **Fixes for issues found reviewing 1.1.0.** `piagent-setup --no-mcp` skips MCP again, the site check no longer hangs or passes falsely, and binary documents are refused.
2556
1681
 
2557
1682
  ### Fixed
2558
1683
 
2559
- - `piagent-setup --no-mcp` installs no MCP again. Setup only ever appended `--with-mcp` and relied on the installer defaulting MCP off; v1.1.0 changed that default to on, so the opt-out reached the installer as silence and the installer's default overrode the operator's explicit choice. It now passes `--no-mcp` through. The other install flags stay one-sided because the installer still defaults them off, which is the condition that made the pattern safe in the first place.
2560
- - `npm run site:check` no longer hangs when a response exceeds the 4 MB body cap. Hitting the cap destroys the response, and a destroyed response emits neither `end` nor `error` — it goes to `aborted` and `close` — so the promise stayed pending forever, and the request timeout could not rescue it because the socket was already gone. A release gate that hangs is worse than one that fails, because nothing reports it. A body cut short is also now reported as cut short rather than as a page that does not mention the version, which is a different claim.
2561
- - `npm run site:check` no longer exits `0` when it could not check an address. Unreachable addresses were printed as `UNVERIFIED` and then the run still ended in `PASS`, so a gate that verified fewer addresses than it resolved reported that it had verified them all. An unchecked address now ends the run; `--allow-unverified` accepts the gap deliberately and names it in the summary.
2562
- - `piagent_document_read` refuses bytes that are not valid UTF-8 or UTF-16 instead of decoding them into replacement characters. The binary check was a scan for a NUL byte, which plenty of binary formats do not carry in their first bytes, and everything past it was decoded leniently — so a binary file renamed to `.txt` came back as content-shaped garbage and was handed to the model. Decoding is now strict in both encodings, which is what the surrounding code already claimed to do.
2563
- - Two CodeQL high alerts came from building a regular expression out of a version string and escaping only `.`. Those assertions were comparing literal text, so they are substring checks now and need no escaping at all. Two further alerts were reviewed and dismissed with written reasons: extracting `&lt;script&gt;` from a document as `<script>` is the required result and the sink is a terminal tool result, not HTML; and the SHA-256 over a normalised shell command is a content identifier, not a password hash.
2564
-
2565
- ### Changed
2566
-
2567
- - The release checklist now requires the **Code scanning results** check on the `main` ruleset, separately from the `analyze (...)` jobs. Requiring those jobs proves only that the analysis ran and uploaded its results — they succeed just as well when the analysis found new high-severity alerts, which is how v1.1.0 merged green with open ones.
1684
+ - `piagent-setup --no-mcp` still installed MCP; it installs none again.
1685
+ - `npm run site:check` could hang on large responses or pass with unchecked addresses; both are fixed.
1686
+ - `piagent_document_read` decoded binary bytes into garbled text; it now refuses invalid text.
2568
1687
 
2569
1688
  ## v1.1.0 - 2026-07-26
2570
1689
 
2571
- A document downloaded outside the repository can now be read by the agent, and the two documented install commands stop disagreeing about MCP.
1690
+ **Read documents from outside the project.** The agent can read a downloaded document outside the repository, and both install commands now install MCP by default.
2572
1691
 
2573
1692
  ### Added
2574
1693
 
2575
- - Added `piagent_document_read`, which reads a document from a directory outside the project. Downloading a spec to `~/Downloads` and then having no way to hand it to the agent was a dead end with no workaround short of copying the file into the repository. A directory is granted through `additionalReadRoots` in the project profile or the `PIAGENT_ADDITIONAL_READ_ROOTS` environment variable, and the grant widens only where documents may come from. It is read-only. It accepts `.md`, `.markdown`, `.txt`, `.text`, `.csv`, `.tsv`, `.json`, `.yaml`, `.yml`, `.pdf`, and `.docx`, and refuses every other extension sitting in the same directory. `protectedPaths` still wins over it, matched against both the absolute and the project-relative form of the path so that root-anchored patterns are not silently skipped, and a capability pack that narrows filesystem read scope still narrows it for documents inside the project. Both the containment check and the extension check are made against the canonical path, so a link named `notes.md` cannot hand over the key file it points at.
2576
- - `.docx` is read without a dependency, from a bounds-checked archive reader that names what was wrong with a malformed file rather than reporting every failure as a missing document. Text struck out by an unaccepted tracked change is dropped instead of being spliced onto its replacement, tab-stop declarations no longer emit tab characters, field instruction codes are not read as prose, and a character reference outside the Unicode range is left as written rather than ending the read. `.pdf` goes through `pdftotext`, under a timeout, and a missing binary is reported as missing rather than as an empty document. Byte-order-marked UTF-16 is decoded rather than rejected as binary. Returned text is redacted and enclosed in a data region delimited by a marker the document cannot predict, because a downloaded document is exactly the kind of file that carries both a pasted key and a sentence addressed to an agent.
2577
- - Added `npm run site:check`, which verifies the published documentation site at every address it resolves to instead of once through whichever address a browser happened to pick. It requires each address to return the released version, reports a redirect from an address back to its own host as a loop rather than following it, and reports an address the machine cannot route to as unverified rather than as a pass. Release checklist step 8 was a manual look, and a manual look cannot see a partial outage.
1694
+ - Added `piagent_document_read` to read a document from a granted directory outside the project, including `.docx`.
2578
1695
 
2579
- ### Changed
1696
+ ### Improved
2580
1697
 
2581
- - Raised the pinned Pi Coding Agent and Pi AI host from `0.81.1` to `0.82.0`. `typebox` stays exactly `1.1.38` across both, so the pin moves without a compatibility change. `npm run audit:runtime` on the `0.82.0` tree reports one high advisory, the same already-accepted `GHSA-mh99-v99m-4gvg` under review by 2026-08-25, and no critical. Verified against a real `0.82.0` host: runtime policy smoke and `team-doctor --strict-share` both pass with no warnings.
2582
- - `piagent-install` now installs the MCP baseline by default, the same as `piagent-setup` already did, and both accept `--no-mcp` to skip it. The two documented entry points disagreed: `piagent-setup` defaulted to installing MCP and `piagent-install` defaulted to not installing it, so a newcomer who followed the team onboarding document ended up with no MCP at all — and was then told to run `/mcp`, because the installer printed that next step whether or not it had installed anything. That next step is now printed only when MCP was installed, and `--mcp-preset` combined with `--no-mcp` fails instead of being accepted and quietly dropped.
2583
- - Cut the command count in the three places a new user actually lands. The README went from 28 shell blocks to 4 and now opens with install rather than four variants of a wrapper for software the reader has not installed yet; the Vietnamese quickstart went from 23 to 7 and its install step from 120 lines to 28; the documentation site's onboarding flow went from eight install command cards to one. Pinned rollouts, updates, rollback, the `--dev` channel, and per-tool command lists were not deleted — every one of them already had a dedicated document, and each is now linked from where it used to be inlined.
1698
+ - `piagent-install` now installs the MCP baseline by default like `piagent-setup`; both accept `--no-mcp`.
1699
+ - The pinned Pi host moves from 0.81.1 to 0.82.0.
2584
1700
 
2585
1701
  ### Fixed
2586
1702
 
2587
- - Writing MCP server definitions now says what each server still needs before it can connect: Chrome for the Chrome DevTools server, Docker plus `GITHUB_PERSONAL_ACCESS_TOKEN` for the GitHub server. Servers connect lazily, so a successful install proved nothing about whether they would work, and the Docker requirement existed only in a description string visible under `piagent-mcp --list`. The note goes to stderr so the report on stdout stays machine-readable, and `--list` now carries the same requirements as data.
2588
- - An advisory tool-registry verdict is now shown. `toolRegistry` defaults to `advisory` and the evaluation returned a `warn` decision, but the hook acted only on `block`, so the verdict was computed and discarded — advisory mode was indistinguishable from off, and the documentation said the agent received a warning. The notice is emitted once per tool per session, because one on every call would be noise rather than a warning.
2589
- - `piagent-uninstall --with-addons` now reports the MCP baseline file that install actually writes. It named the Pi-global override path while install writes the shared global path, so an operator following the printed advice inspected the wrong file — usually an empty one, which reads as "already clean".
2590
- - Project onboarding now says that the `.mcp.json` files it writes are empty on purpose and that the shared baseline lives in the global config. An empty file in a fresh project reads as a failed install.
2591
- - Documented that `mcpCapabilities` in a project profile, the `github` key in the policy tool registry, and the `github` MCP server are three unrelated things that share a name. No code maps a capability name to an MCP server, so declaring `github` in a profile does not enable the GitHub server and never did.
2592
- - `piagent-init` running from an installed package now writes `npm:@piagent/platform@<version>` into project settings, matching what `piagent-setup` already did. It is the second way a project gets its settings written, and it still wrote the directory the platform happened to be installed in — a value that means nothing on a teammate's machine, in a file meant to be committed.
2593
- - Documentation-coverage checks in the local gate now name the term that went missing and the files searched. They were bare `grep >/dev/null` calls under `set -e`, so dropping a term from a document failed the gate with exit 1 and no output at all. The gate's `npm test` and `npm run typecheck` steps had the same defect from the other direction — their output went to `/dev/null` on every run, so a failing test ended the gate with no indication of which test failed. Both now stay quiet on success and print what they captured on failure.
2594
- - Documented that `piagent-setup` installs the Herdr Pi integration when `herdr` is on `PATH`, and that installing Herdr afterwards needs `piagent-setup --global-only` to pick it up. The behaviour has always been the default and the skip is only a warning on stderr, so the ordering was discoverable only by reading the installer. Herdr is also now named as the way to run several Pi panes at once in the README, the quickstart, and the documentation site, none of which mentioned it, and every one of those places now carries the install command itself rather than a link to go find it. The `brew` form is listed beside the `curl` form that herdr.dev leads with, because piping a fetched script to a shell is worth an alternative in a project that pins everything else it installs.
2595
- - Folded a stale `Unreleased` section into v1.0.0, where its contents actually shipped. It had been left behind by the namespace rename and still described tools as `company_orchestration_policy`, `company_profile_tech_options`, `company_profile_tech_apply`, `company_profile_tech_context_record`, and `/company-orchestration`, none of which exist.
1703
+ - Advisory tool-registry warnings were computed but never shown; they are now displayed.
1704
+
1705
+ Requires: Pi 0.82.0.
2596
1706
 
2597
1707
  ## v1.0.2 - 2026-07-25
2598
1708
 
2599
- Install and uninstall become two commands each. The five-command sequence was never the shortest path; it was the only one that produced a project configuration a teammate could use.
1709
+ **Two-command install and `piagent-uninstall`.** Install is now `npm install -g @piagent/platform` plus `piagent-setup`, and `piagent-uninstall` removes the package cleanly.
2600
1710
 
2601
1711
  ### Added
2602
1712
 
2603
- - Added `piagent-uninstall`, which removes the Pi package this platform registered and nothing else. It reports by default and only acts on `--apply`, matching how install and migration already work. `--with-addons` also removes the pinned add-ons, `--with-host` the Pi host, and `--project <path>` a project's profile, lock, and runtime state. It recognises every source shape the platform has been installed as, including installs from before the namespace rename, so an old registration still comes out. Credentials, trust decisions, sessions, todos, and project memory are never removed at any flag combination; files written from templates and then edited are reported rather than deleted, and only the entry pointing at this platform is dropped from a project's `.pi/settings.json`.
1713
+ - Added `piagent-uninstall`, which reports by default and only removes the package with `--apply`.
2604
1714
 
2605
- ### Fixed
1715
+ ### Improved
2606
1716
 
2607
- - `piagent-setup` running from an installed package now writes `npm:@piagent/platform@<version>` into project settings instead of the directory it happens to be installed in. Project settings are meant to be committed, and an install path means nothing on a teammate's machine. A working checkout has no published identity to point at, so it still falls back to the local path and still says so.
1717
+ - Docs now lead with `npm install -g @piagent/platform` followed by `piagent-setup`.
2608
1718
 
2609
- ### Changed
1719
+ ### Fixed
2610
1720
 
2611
- - Documentation now leads with `npm install -g @piagent/platform` followed by `piagent-setup`, which installs the pinned Pi host itself. The five-command sequence remains, described as the explicit path for a reviewed team rollout rather than as the only way in.
1721
+ - `piagent-setup` wrote a local install path into project settings; it now writes the npm package version.
2612
1722
 
2613
1723
  ## v1.0.1 - 2026-07-25
2614
1724
 
2615
- Documentation release. v1.0.0 reached the npm registry but no document told anyone it was there, so every install instruction still pointed at the Git source.
1725
+ **Install from the npm registry.** Documentation now installs the terminal helper from npm instead of the Git source.
2616
1726
 
2617
- ### Changed
1727
+ ### Added
2618
1728
 
2619
- - The terminal helper now installs from the registry: `npm install -g --ignore-scripts @piagent/platform@1.0.1`. This replaces the `github:Vt-mmm/piagent#vX.Y.Z` form in the README, the docs site, and every install, update, and rollback flow. Installing from Git still works and produces the same files; the registry path additionally carries a provenance attestation npm can verify.
2620
- - Added an `npm` release channel with a real source, and narrowed `enterprise-npm` to what it actually describes: a fork published under a different scope.
2621
- - Recorded why `stable` still resolves the Pi package to a commit SHA rather than an npm version. Tag-to-SHA resolution is checked against `PIAGENT_EXPECTED_RELEASE_COMMIT`, and a registry version range cannot express that check, so pointing `stable` at npm would remove it rather than replace it.
2622
- - Aligned `repository.url` in both manifests with the form npm stores. Publishing rewrote the field and warned, which left the manifest in the repository disagreeing with the manifest on the registry.
1729
+ - Added an `npm` release channel.
2623
1730
 
2624
- ## v1.0.0 - 2026-07-25
1731
+ ### Improved
2625
1732
 
2626
- Breaking release. The `company` namespace is replaced by `piagent` with no alias layer, and `apiVersion` becomes a stable contract. Existing projects convert their local state with one migration command; both names never work at once.
1733
+ - Install, update and rollback docs use `npm install -g --ignore-scripts @piagent/platform@1.0.1`.
2627
1734
 
2628
- ### Added
1735
+ ## v1.0.0 - 2026-07-25
2629
1736
 
2630
- - Added `capabilitySources` to project profiles so a project can use capability packs it does not own without forking the platform. A source is either a directory inside the project or an exact npm or git release vendored into it.
2631
- - Added `piagent-capabilities vendor`, the only command that reaches the network. It fetches a declared remote source into `.pi/capability-vendor/`, refuses a tree containing symbolic links or no packs, and reports digests for review before the result is committed.
2632
- - Added `piagent-migrate` to convert `.pi/company-profile.json`, its lock, and `.pi/company-state/` to the new names. Dry-run by default, with an explicit flag to write and a separate flag to remove the old files.
2633
- - Added `piagent-import-instructions` to import `CLAUDE.md`, `.claude/rules/`, `.cursor/rules/`, and `.github/copilot-instructions.md` into `AGENTS.md`. Dry-run by default, with a deterministic conflict report; imported text is quoted as data and never alters protected paths, permission profile, or verify commands.
2634
- - Added skill wiring for `.claude/skills` and `.codex/skills` at project scope and their home-directory equivalents at global scope, plus doctor checks that report skill directories present on disk but not declared, and instruction files written for other agents.
2635
- - Added a golden enforcement suite covering protected paths, protected paths reached through the shell, destructive shell decisions, verification evidence, context budget ceilings, and secret redaction, with a valid and an invalid fixture for every shipped schema.
2636
- - Added contributor documentation: `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, pull-request and issue templates.
2637
- - Added a tag-driven publish workflow with npm provenance and pinned action revisions.
2638
- - Added a solo-first orchestration policy covering bounded subagent usage, review lenses, Field Guide status, and model-role guidance, surfaced by `piagent_orchestration_policy` and `/piagent-orchestration` so status reads without a model follow-up. Task contracts gained `workPlan`, `reviewLenses`, and `orchestration` snapshots to record it.
2639
- - Added select-style profile tech setup through `/profile setup` and `/profile tech setup`, including fullstack frontend, backend, and database selections. `piagent_profile_tech_options`, `piagent_profile_tech_apply`, and `piagent_profile_tech_context_record` produce Context7-ready stack manifests and per-tech snapshots.
1737
+ **Piagent 1.0: new namespace and stable API.** The `company` namespace becomes `piagent` with no alias, `apiVersion` is stable, and one command migrates existing projects.
2640
1738
 
2641
- ### Changed
1739
+ ### Breaking changes
2642
1740
 
2643
- - **Breaking.** Renamed the namespace to `piagent` throughout: tools `company_*` to `piagent_*`, commands `pi-company-*` to `piagent-*`, package `pi-agent-platform` to `@piagent/platform`, `packages/pi-company-core/` to `packages/piagent-core/`, environment variables `PI_COMPANY_*` to `PIAGENT_*`, and project state to `.pi/piagent-profile.json`, `.pi/piagent-profile.lock.json`, and `.pi/piagent-state/`. There is no alias layer; a session started against unconverted state warns and names the migration command.
2644
- - **Breaking.** Promoted the manifest `apiVersion` from `piagent/v1alpha1` to `piagent/v1`. This is the point at which external packs can pin it, so it is a contract from here on.
2645
- - The capability lock now records where each pack came from, so a pack that moves between sources reads as a substitution rather than an update.
2646
- - The package is now published rather than private, scoped as `@piagent/platform` with public access and provenance.
2647
- - Split shell and external-action classification, shared types, and filesystem helpers out of the guard into their own modules. Behaviour is unchanged.
2648
- - Onboarding now names instruction files written for other agents, states plainly that their rules are not in effect, and offers the import; anything inside them is treated as data.
2649
- - `/task`, `/plan`, `/review`, the subagent prompts, and the team docs now prefer one parent agent plus bounded scout, planner, and reviewer usage instead of broad swarm-style delegation.
2650
- - Onboarding and docs treat profile family and project tech stack as explicit operator selections rather than long model explanations, and `/profile` status and list output stay compact around the single namespace and the next exact command.
2651
- - Runtime support is stated across macOS Apple Silicon, macOS Intel, Linux x64 and ARM64, native Windows, and WSL2, and the installer and doctor report the runtime surface they are actually on.
1741
+ - Tools, commands, package and files are renamed from `company` to `piagent`; run `piagent-migrate` on existing projects.
1742
+ - Manifest `apiVersion` moves from `piagent/v1alpha1` to the stable `piagent/v1`.
2652
1743
 
2653
- ### Fixed
1744
+ ### Added
2654
1745
 
2655
- - Fixed a capability policy that declares only some of its allow-lists: the missing lists now deny, instead of failing with an internal error.
2656
- - Fixed capability source resolution under a symlinked project parent, where a contained directory could be misread as escaping the project.
2657
- - Excluded maintainer working notes from the published tarball. The `files` allowlist takes precedence over `.npmignore`, so the exclusions live in `files`.
2658
- - Fixed the package manifest declaring its extension entry points as a directory glob. Pi calls the default export of every path the field matches, so once the guard's helpers moved into modules beside it, the glob offered Pi two modules that export helpers and no extension factory. The manifest now names the guard, and the package still carried the old `@pi-agent/core` name the namespace rename was meant to retire.
2659
- - Fixed the verify workflow, which had been unparseable since the runtime-platform step was added and so had not run at all. A single-line `run:` value containing `": "` ends the YAML scalar early; GitHub reports that as an instant failure with no job, so the gate was absent while still appearing present. The local gate now refuses that shape.
2660
- - Fixed orchestration config normalization so a malformed numeric setting falls back to a safe value instead of producing invalid policy state.
2661
- - Fixed tag CI verification, which checked tag object type and peeled commit identity without first fetching the annotated release tag ref.
2662
- - Profile doctor and team doctor now warn on entries that appear only in `shellProtectedPaths`. Those paths block shell access alone; write protection requires `protectedPaths` or `readOnlyPaths`, and the warning names the move.
1746
+ - Projects can use capability packs from other sources, fetched for review with `piagent-capabilities vendor`.
1747
+ - Added `piagent-import-instructions` to import instruction files written for other agents into `AGENTS.md`.
2663
1748
 
2664
- ### Security
1749
+ ### Improved
2665
1750
 
2666
- - The runtime host audit now names the one advisory it accepts instead of running at a blanket severity threshold. `GHSA-mh99-v99m-4gvg` (`brace-expansion`, denial of service) is accepted with its reasoning recorded in `scripts/check-runtime-advisories.mjs`: the Pi host publishes an `npm-shrinkwrap.json` that pins the affected version, a published shrinkwrap takes precedence over consumer overrides, and every released host carries a high `brace-expansion` advisory, so no host version and no change in this repository can resolve it. Every other high or critical advisory still fails the audit, the entry expires on a review date, and it fails once the advisory stops being reported so it cannot outlive the problem.
1751
+ - The package is now published on npm as `@piagent/platform` with provenance.
2667
1752
 
2668
1753
  ## v0.4.8 - 2026-07-22
2669
1754
 
1755
+ **Release channels, trusted profiles and stricter guards.** Install channels and rollback are documented, project profiles load only in trusted projects, and external writes need confirmation.
1756
+
2670
1757
  ### Added
2671
1758
 
2672
- - Added release/install policy docs covering stable, exact, dev, local, update, and rollback flows.
2673
- - Added `pi-company-install` channel options and dry-run preview for stable, exact, dev, and local installs.
2674
- - Added a package-root dispatcher for global `pi-company-*` terminal commands.
2675
- - Added `readOnlyPaths` to project profiles for read-only contract areas such as backend code in `be-readonly-fe`.
2676
- - Added regression tests for untrusted project profiles, profile-apply confirmation, shell/exec aliases, external-provider write confirmation, BE-readonly/FE-write paths, package distribution, and installer edge cases.
2677
- - Added tag-triggered CI verification with immutable GitHub Action revisions on both Ubuntu and macOS.
2678
- - Added release identity verification across root/core manifests, package lock, capability lock, changelog, docs badge, tag, and checked-out commit.
2679
- - Added a separate high-severity dependency audit for the exact Pi host and pinned optional add-ons instead of relying only on the helper package lock.
2680
- - Added a public threat model and `SECURITY.md` with private vulnerability reporting, supported-version, disclosure, and scope guidance.
2681
- - Added weekly Dependabot checks for npm and GitHub Actions plus pinned CodeQL v4 analysis for JavaScript/TypeScript and workflow code.
2682
- - Added a fail-closed Vercel project-link preflight so a stale local `.vercel` link cannot silently deploy docs to the wrong project.
2683
-
2684
- ### Changed
2685
-
2686
- - Clarified in the public docs where this platform sits relative to a general agent coding CLI: Pi Company Platform brings similar governance concepts into Pi and packages them for team workflows.
2687
- - Reworded security docs to describe the guard as an application-level policy enforcement layer, not a complete security boundary or OS sandbox.
2688
- - Split install guidance so production/team setup uses pinned `v0.4.8` or resolved commit sources, while latest is reserved for personal/sandbox use.
2689
- - Clarified that redaction benchmarks and internal review are not equivalent to an external security audit.
2690
- - Raised the supported Node.js runtime contract to `>=22.19.0`.
2691
- - Raised the pinned Pi Coding Agent and Pi AI compatibility from `0.80.10` to `0.81.1`, retaining exact `typebox` compatibility and removing the known high-severity transitive finding present in the previous host tree.
2692
- - Updated CI to verify on Ubuntu and macOS with Node.js 22.19.0.
2693
- - Documented the three-component Pi-host/helper/Pi-package lifecycle, exact rollback flow, supported operating systems, and post-tag Vercel promotion gate.
2694
- - Made setup install or upgrade to the exact Pi host required by the release and made package installation reject an incompatible host version.
2695
- - Expanded runtime dependency verification from the Pi host alone to the exact host plus all pinned optional add-ons.
2696
-
2697
- ### Fixed
2698
-
2699
- - Hardened local profile loading so `.pi/company-profile.json` is ignored until the project is trusted, unless an operator explicitly sets `PI_COMPANY_PROFILE`.
2700
- - Hardened `pi-company-install --stable` so it resolves the release tag to a commit SHA before install and fails closed when resolution is unavailable.
2701
- - Bound the deterministic capability lock to `packages/pi-company-core/policies/base-policy.json`.
2702
- - Fixed `be-readonly-fe` so backend paths are readable through safe path tools but remain blocked for writes and shell access.
2703
- - Applied shell protected-path checks consistently to `bash`, `shell`, and `exec` tool aliases.
2704
- - Inspected complete structured shell invocations, including `command`/`cmd` plus `args`, and rejected conflicting, malformed, oversized, or unbounded carriers before execution.
2705
- - Added a generic human confirmation gate for external-provider write or ambiguous tools while preserving known safe reads such as `get_release`.
2706
- - Rejected conflicting installer package selectors before any install command can run; the first explicit CLI selector now cleanly overrides environment defaults.
2707
- - Routed global commands through a package-root dispatcher and converted missing shell-runner failures into controlled errors.
2708
- - Isolated runtime-evidence test ledgers so test runs no longer leave new `pi-ledger-*` temporary directories.
2709
- - Decoded the extension module URL before locating its package policy so installs under paths containing spaces or other URL-encoded characters load the intended policy.
2710
- - Made project init resilient to npm package tarballs that omit its `.pi/.gitignore` dotfile by shipping an explicit fallback template.
2711
- - Prevented project init from creating `.pi/.npmignore`, which could override repository ignore rules and re-include local Pi auth, trust, ledger, or database state in an npm package.
2712
- - Applied provider confirmation and path policy to the default serialized MCP proxy carrier, including bounded JSON parsing and fail-closed malformed/deep payload handling.
2713
- - Closed MCP path-policy bypasses across common aliases such as `filename`, `rootPath`, `source`, `cwd`, and `workingDirectory`; copy sources now use read scope while destinations use write/read-only scope, without treating provider metadata as a local path.
2714
- - Applied protected-path checks to camelCase patch carriers and shell proxy variants such as `run`, `execute_process`, and command-bearing aliases before an operator confirmation can allow execution.
2715
- - Added confirmation gates for shell-launched GitHub CLI writes and non-read-only HTTP client operations, including wrappers, executable aliases, line continuations, dynamic command construction, `xargs`, and FTP/SFTP quote commands, while keeping recognized reads and argument-only substitutions non-interactive.
2716
- - Made every packaged `pi-company-* --help` command succeed without requiring a project path or creating project state.
1759
+ - Added stable, exact, dev and local install channels with dry-run preview, plus rollback docs.
2717
1760
 
2718
- ### Security
1761
+ ### Improved
2719
1762
 
2720
- - Project-local profiles are not trusted before Pi project trust is active.
2721
- - Capability locks now detect base policy tampering, not only runtime source-file changes.
2722
- - Tool-based profile apply requires operator confirmation before writing `.pi/company-profile.json` and `.pi/company-profile.lock.json`.
2723
- - External provider writes are treated as human-gated actions even under `trusted-full-access`.
2724
- - Unknown MCP/provider actions fail closed to operator confirmation; explicit safe reads remain non-interactive.
2725
- - Release tags are verified in CI, installer stable channels resolve tags to commit SHAs, and dependency setup actions are pinned by commit SHA.
2726
- - Tag CI binds stable resolution to the exact release commit and rejects environment attempts to substitute the helper's package-derived release tag.
2727
- - Tag CI now requires an annotated tag whose peeled commit is the exact verified release commit; repository ruleset requirements are documented for immutable `v*` tags.
2728
- - Release CI includes redaction, release identity, dependency, CodeQL, package-content, and cross-platform policy gates; Actions are pinned to reviewed commit SHAs.
2729
-
2730
- ### Verification
2731
-
2732
- - `npm run verify`: pass.
2733
- - `npm test`: 224/224 pass.
2734
- - `npm run typecheck`: pass.
2735
- - `npm run smoke`: pass.
2736
- - Helper dependency audit (`npm audit --audit-level=high`): 0 vulnerabilities.
2737
- - Exact Pi 0.81.1 host + pinned add-on audit (`npm run audit:runtime`): 0 high/critical findings; npm reports 11 moderate dependency paths across two upstream advisory families (`@hono/node-server` encoded-backslash traversal on Windows and `protobufjs` parser DoS).
2738
- - `npm run benchmark:redaction`: pass.
2739
- - `npm pack --dry-run --json`: 144 packaged files; required runtime files present and local trust/secret state excluded; all 12 installed terminal binaries pass `--help` from the built artifact.
2740
- - Docs browser/runtime check: 0 duplicate IDs, broken anchors, broken images, unsafe blank targets, or console errors; mobile viewport has no horizontal overflow.
1763
+ - Requires Node.js 22.19.0 or newer and Pi 0.81.1; setup installs the exact Pi host.
2741
1764
 
2742
- ## v0.4.7 - 2026-07-22
1765
+ ### Security
2743
1766
 
2744
- ### Added
1767
+ - Project profiles are ignored until the project is trusted, and applying a profile needs confirmation.
1768
+ - External provider writes and unknown MCP actions now require human confirmation, even in full access.
2745
1769
 
2746
- - Added `/commit` as a guarded local commit workflow:
2747
- - inspect status and diff before staging;
2748
- - stage explicit reviewed files only;
2749
- - run relevant verification before commit;
2750
- - never push from `/commit`.
2751
- - Added `/pr` as a guarded pull request preparation workflow:
2752
- - inspect branch, status, upstream, and remote;
2753
- - require a clean committed branch before PR work;
2754
- - require explicit operator confirmation before `git push` or GitHub write actions.
2755
- - Added an exec-policy confirmation rule for broad Git staging, including `git add .`, `git add -A`, `git add --all`, `git add -- .`, `git add :/`, and `git -C <repo> add .`.
2756
- - Added regression tests for the new Git workflow prompts and broad-staging policy.
2757
- - Added canonical public docs metadata for `https://piagent.io.vn`.
1770
+ Requires: Pi 0.81.1, Node.js 22.19.0.
2758
1771
 
2759
- ### Changed
1772
+ ## v0.4.7 - 2026-07-22
2760
1773
 
2761
- - Install docs now default to latest:
2762
- - `pi install git:github.com/Vt-mmm/pi_agent`
2763
- - `pi update --extensions`
2764
- - Pinned install examples use placeholders such as `vX.Y.Z` and `x.y.z` instead of hardcoding an old release.
2765
- - Runtime smoke verification now reads the current package version from `package.json` instead of hardcoding a tag.
2766
- - Docs site, README, package metadata, and Vercel docs now point to `https://piagent.io.vn`.
1774
+ **Guarded `/commit` and `/pr` workflows.** New `/commit` and `/pr` workflows review changes before staging and ask before any push, and broad staging needs confirmation.
2767
1775
 
2768
- ### Security
1776
+ ### Added
2769
1777
 
2770
- - Git remains a normal guarded capability, not a privileged `/git` bypass.
2771
- - Broad staging requires confirmation so unrelated or private files are not committed silently.
2772
- - Protected paths, sensitive-output redaction, capability lock integrity, and destructive/external confirmation gates remain active in every permission profile.
1778
+ - Added `/commit`, which stages only reviewed files, runs checks and never pushes.
1779
+ - Added `/pr`, which requires a clean branch and confirmation before `git push` or GitHub writes.
2773
1780
 
2774
- ### Verification
1781
+ ### Security
2775
1782
 
2776
- - `npm run verify`: pass.
2777
- - `bash scripts/runtime-policy-smoke.sh`: pass.
2778
- - `npm test`: 185/185 pass.
2779
- - `npm run typecheck`: pass.
1783
+ - Broad staging such as `git add .` or `git add -A` now asks for confirmation.
2780
1784
 
2781
1785
  ## v0.4.6 - 2026-07-22
2782
1786
 
2783
- ### Added
2784
-
2785
- - Added the static HTML documentation site under `docs-site/`.
2786
- - Added Vercel static-site configuration and deployment documentation.
2787
- - Added project logo, favicon, GitHub link, and Facebook link to the docs site.
1787
+ **Documentation site.** A static HTML documentation site was added, with shorter command docs for daily use.
2788
1788
 
2789
- ### Changed
1789
+ ### Added
2790
1790
 
2791
- - Streamlined command documentation for lower-token daily usage.
2792
- - Removed the `SHIP` sidebar section from the docs site.
2793
- - Centered the docs layout and tightened the visual structure for wide screens.
2794
- - Documented latest global install and pinned project setup separately.
1791
+ - Added a static HTML documentation site under `docs-site/`.
2795
1792
 
2796
- ### Verification
1793
+ ### Improved
2797
1794
 
2798
- - `git diff --check`: pass.
2799
- - Package verification remains covered by `npm run verify`.
1795
+ - Command documentation is shorter for lower-token daily use.
1796
+ - Global install and pinned project setup are documented separately.
2800
1797
 
2801
1798
  ## v0.4.5 - 2026-07-22
2802
1799
 
2803
- ### Added
1800
+ **Direct `/profile` commands.** Profile commands apply immediately without a model follow-up, and routine status output is compact.
2804
1801
 
2805
- - Added direct profile commands that apply immediately without model follow-up:
2806
- - `/profile`
2807
- - `/profile`
2808
- - `/profile list`
2809
- - `/profile <profile>`
2810
- - `/profile auto`
2811
- - Added short profile aliases such as `fe`, `be`, `full`, `be-fe`, and TypeScript-oriented aliases.
1802
+ ### Added
2812
1803
 
2813
- ### Changed
1804
+ - Added `/profile`, `/profile list`, `/profile <profile>` and `/profile auto`, applied without a model turn.
1805
+ - Added short profile aliases such as `fe`, `be` and `full`.
2814
1806
 
2815
- - `/company-status` and `/company-memory` now return concise local summaries instead of prompting verbose model/tool follow-up.
2816
- - Profile status output is intentionally compact to reduce token burn in routine checks.
1807
+ ### Improved
2817
1808
 
2818
- ### Security
2819
-
2820
- - Direct profile apply still regenerates the deterministic capability lock and does not relax protected paths, secret redaction, or capability integrity checks.
1809
+ - `/company-status` and `/company-memory` now return short local summaries.
2821
1810
 
2822
1811
  ## v0.4.4 - 2026-07-21
2823
1812
 
1813
+ **Session permission commands.** Slash commands switch the session between read-only, workspace-write and full access, with a clear precedence order.
1814
+
2824
1815
  ### Added
2825
1816
 
2826
- - Added session-local permission slash commands:
2827
- - `/permission-status`
2828
- - `/read-only`
2829
- - `/workspace-write`
2830
- - `/full-access`
2831
- - `/full-access <task>`
1817
+ - Added `/permission-status`, `/read-only`, `/workspace-write`, `/full-access` and `/full-access <task>`.
2832
1818
 
2833
- ### Changed
1819
+ ### Improved
2834
1820
 
2835
- - Permission resolution precedence is explicit: launch environment override, then session command, then project profile, then policy default.
2836
- - `/full-access <task>` switches the session and forwards the task text as the next request.
1821
+ - Permission order is explicit: launch override, then session command, then project profile, then default.
2837
1822
 
2838
1823
  ### Security
2839
1824
 
2840
- - `trusted-full-access` remains guarded. It relaxes selected autonomy checks for trusted workspace work but does not disable protected paths, secret redaction, capability lock integrity, or destructive/external confirmations.
1825
+ - Full access still keeps protected paths, secret redaction and destructive or external confirmations.
2841
1826
 
2842
1827
  ## v0.4.3 - 2026-07-21
2843
1828
 
2844
- ### Added
2845
-
2846
- - Added runtime permission profiles:
2847
- - `read-only`;
2848
- - `workspace-write`;
2849
- - `trusted-full-access`.
2850
- - Added `PI_COMPANY_PERMISSION_PROFILE` for trusted one-run permission override.
1829
+ **Runtime permission profiles.** Three permission profiles were added: read-only, workspace-write and trusted-full-access.
2851
1830
 
2852
- ### Security
1831
+ ### Added
2853
1832
 
2854
- - Invalid permission override values fail closed.
2855
- - The profile system is a runtime policy layer, not an operating-system sandbox.
1833
+ - Added `read-only`, `workspace-write` and `trusted-full-access` permission profiles.
1834
+ - Added `PI_COMPANY_PERMISSION_PROFILE` for a one-run override; invalid values fail closed.
2856
1835
 
2857
1836
  ## v0.4.2 - 2026-07-21
2858
1837
 
2859
- ### Added
2860
-
2861
- - Added sensitive-data redaction benchmark coverage for contextual secrets, benign preservation, structured payloads, and large output.
2862
- - Added release gates for redaction recall and false-positive control.
1838
+ **Better secret redaction with a benchmark.** Redaction covers more credential shapes and nested data, measured by a new benchmark and release gate.
2863
1839
 
2864
- ### Changed
1840
+ ### Added
2865
1841
 
2866
- - Improved sensitive-data redaction for common credential shapes and nested structured data.
2867
- - Kept unlabeled high-entropy strings observational instead of redacting indiscriminately.
1842
+ - Added a redaction benchmark: 52/52 secrets detected with 0/30 false positives on benign text.
2868
1843
 
2869
- ### Verification
1844
+ ### Improved
2870
1845
 
2871
- - Frozen-tree redaction baseline: 52/52 contextual cases detected, 0/30 benign false positives, 8/8 structured sensitive values redacted, and 7/7 structured benign values preserved.
1846
+ - Redaction now catches more credential shapes and secrets inside nested structured data.
2872
1847
 
2873
1848
  ## v0.4.1 - 2026-07-21
2874
1849
 
2875
- ### Fixed
2876
-
2877
- - Hardened shell secret protection against glob expansion targeting protected files.
2878
- - Hardened shell protection for bare-word aliases and symlinks resolving to protected paths.
2879
- - Added sensitive bash output redaction before tool results reach the model.
2880
- - Covered attached redirections such as `cat<.env` and similar shell forms.
1850
+ **Stronger shell protection for secrets.** The shell guard blocks more ways of reaching protected files, and bash output is redacted before the model sees it.
2881
1851
 
2882
1852
  ### Security
2883
1853
 
2884
- - Static shell protection is stronger, but the guard still does not claim to be an OS sandbox.
2885
- - Protected-path blocking and output redaction are separate defense layers.
1854
+ - Globs, aliases, symlinks and redirections such as `cat<.env` can no longer reach protected files.
1855
+ - Sensitive bash output is redacted before tool results reach the model.
2886
1856
 
2887
1857
  ## v0.4.0 - 2026-07-21
2888
1858
 
1859
+ **Governed capability packs with integrity lock.** Capability packs are resolved per profile into `.pi/company-profile.lock.json`, and tampering with the lock fails closed.
1860
+
2889
1861
  ### Added
2890
1862
 
2891
- - Added governed capability packs with deterministic catalog generation.
2892
- - Added profile capability resolution and `.pi/company-profile.lock.json`.
2893
- - Added lock integrity checks for package source, artifact digests, capability scope, and runtime enforcement files.
2894
- - Added atomic profile/lock write behavior with rollback on failure.
1863
+ - Added governed capability packs resolved per profile into `.pi/company-profile.lock.json`.
2895
1864
 
2896
1865
  ### Security
2897
1866
 
2898
- - Lock tampering fails closed.
2899
- - Core protected paths include `.pi/settings.json` and `.pi/company-profile.lock.json`.
2900
- - Capability scope can only narrow access; protected paths remain denied before allow-scope checks.
1867
+ - The lock checks package source, artifact digests and capability scope, and tampering fails closed.
1868
+ - `.pi/settings.json` and the lock file are protected, and capability scope can only narrow access.