You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 13cab51
Browse filesBrowse the repository at this point in the historyBrowse files
* fix(workspace): close the v0.12.1 release-review findings on the pin/identity seam
Five-persona review of v0.12.0..main. #1320 (IDE pin) and #1330
(identity every turn) changed `resolveBindingOutcome` from opposite sides
and were never reviewed together; every item here is on that seam.
- A pin served from the offline grace window is marked `stale`, so the
identity section says "last known" for it as it already did for a
cached link. `pinValidation` is bounded like the other caches.
- Identity's memo is keyed on the credential digest as well as the
tenant and host — two accounts on one tenant no longer share an entry
(the pin cache in `state.ts` already did this).
- Under a pin, identity's deadline fallback never reaches for the
project's own cached link — the workspace the pin exists to override.
- A pinned session is described as pinned by the IDE extension, with the
caveat that warehouse tool routing still follows the project's own
link (#1337); the unknown copy no longer promises that retrying helps.
- The persistent `shell` tool strips the same host markers as `bash`
(`ALTIMATE_CODE_SERVE`, the pin trio, headless, non-interactive) via a
shared `stripHostMarkers`, so a nested `serve` cannot inherit a pin.
- `pin.ts` states the extension contract: a pin is fixed for the life of
the process; a panel switch means relaunching `serve`.
- Docs: the three pin variables and `ALTIMATE_CODE_SERVE` in cli.md, and
a note on the identity line and the pin under "Workspaces (pilot)".
Tests: pinned-session copy, pin-aware fallback, same-tenant credential
switch, grace-path stale, host-marker stripping. Each guard was deleted
once to confirm its test fails.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* fix(workspace): pin ids are decimal digits; the identity cap fits every shape
Two defects the v0.12.1 adversarial tests found.
- `readPin` took any string `Number()` parses — "1e3", "0x10", "1.0" —
as an id. The extension never writes those; only decimal digits (with
surrounding whitespace) are a pin now, the rest fail closed as before.
- `MAX_SECTION_CHARS` (1,000) was below the pinned-and-stale identity copy
with a budget-sized label (1,238), so `render` failed closed and dropped
the name — and for the plain stale shape (1,078) too. Raised to 1,500;
a test renders every shape with the worst-case label and checks the
name survives.
Adds `test/skill/release-v0.12.1-adversarial.test.ts`: hostile pin
environments, root traversal (including the documented symlink bypass),
host-marker stripping by exact name, and the identity copy across
pin × stale × unbound.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* release: v0.12.1
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* test: the #937 env-plumbing guard checks stripHostMarkers behaviourally
It grepped bash.ts for the literal `delete mergedEnv["ALTIMATE_NON_INTERACTIVE"]`,
which moved into the shared `stripHostMarkers` in this release. The contract
it protected — the non-interactive marker is stripped, auto-answer is kept —
is now asserted on the function.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* fix(workspace): address the bot and multi-model review on the v0.12.1 release PR
- `stripHostMarkers` deletes every spelling of a marker on Windows, where
environment names are case-insensitive, and the exact name elsewhere.
The nested `altimate_change` markers around its call site are gone.
- `shell.ts` exposes `shellChildEnv` so the persistent shell's child
environment is tested on values, not on this file's source text.
- `readPin` treats a whitespace-only id, name or root as a broken pin.
- Identity keeps the resolver behind the deadline even when no complete
account is configured: the resolver's own credential read is looser
than `accountScope` and can still reach the network.
- The adversarial test file no longer mutates `XDG_STATE_HOME`; the
preload already isolates state and nothing here reads it.
- Docs: `ALTIMATE_CODE_SERVE` is set by `serve` itself, not only by the
extension; ordinary and pinned sessions described separately.
- CHANGELOG narrows the credential-scoping claim to the layer this
release fixes: the resolver's own five-minute caches are still keyed
by tenant and host (tracked separately).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* docs(changelog): point the resolver-scope caveat at #1339
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* test: keep the source guard for ALTIMATE_AUTO_ANSWER beside the behavioural one
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* fix(workspace): identity renders unknown without the resolver when no complete account is configured
Nothing can verify a link without a credential, and the resolver's looser
credential read would otherwise reach the network from that path with no
memo, no single-flight and a synchronous git probe. Test asserts the
resolver is not called. Also: the shell child-env test now exercises the
default `process.env` base the production call site relies on.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
* test: read PATH or Path in the shell child-env test (Windows)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Q51zFUmPg1WwtS5CrGJE6
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+25Lines changed: 25 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file.
5
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
8
+
## [0.12.1] - 2026-09-21
9
+
10
+
Two workspace-pilot additions that landed right after 0.12.0, plus the fixes their joint review turned up. Numbered as a patch because everything under **Added** is behind `ALTIMATE_WORKSPACE=1`; the only changes that reach every user are two reworded strings under **Changed**. **Heads-up for support (pilot):** a session launched from the VS Code / Cursor extension now follows the workspace picked in the extension's panel for skills and memory — but warehouse tool routing still follows the project's own link (#1337), and the agent says so when asked.
11
+
12
+
### Added
13
+
14
+
- **The agent states which Altimate Workspace the project is linked to, every turn.** Not only when it is routing warehouse tools: an unlinked project, a link that cannot be verified right now, and a freshly created workspace each get a definite answer ("linked to … id N", "none is linked — here is how to link one", "could not be confirmed"). When the link is served from cache because the server could not be asked, the agent says "last known", and a "none is linked" answered from the five-minute cache says "as of the last check". The instruction is scoped to a genuine identity question ("this/current/active workspace") so an unrelated Databricks conversation gets no linking pitch, and the model is told not to confuse the Altimate Workspace with a Databricks workspace or an IDE workspace folder in either direction. The workspace name is presented as a label chosen by the workspace owner, not an instruction (#1335 tracks structural isolation). Resolved at most once per 30 s per account and project, with a 1.5 s deadline so a slow server never stalls a turn. (#1330, closes #1331)
15
+
-**The IDE extension's workspace selection governs the session it launches.**`altimate-code serve` started by the VS Code / Cursor extension reads `ALTIMATE_PINNED_WORKSPACE_{ID,NAME,ROOT}`; a valid pin outranks the project's stored binding for skills and memory, is validated against the workspaces the signed-in account can see (it selects among them, it grants nothing), is scoped to the folder it was launched for, and is never written to disk. A partial or malformed pin, or one naming a workspace the account cannot see, fails closed rather than falling back to the project's link. A pin is fixed for the life of the process; the extension relaunches `serve` when the selection changes. (#1320)
16
+
17
+
### Fixed
18
+
19
+
-**Routing and identity can no longer contradict each other about the link.** The routing section used to say "this project is bound to workspace X" from a snapshot taken at tool resolution; it now says which workspace *serves* the tools, and only the identity section states the link. (#1330)
20
+
-**A pinned session is described as pinned, with the routing caveat**, and a pin served from the offline grace window is marked "last known" like a cached link. Identity's per-turn memo is keyed on the credential, not only the tenant, so two accounts on one tenant never share that memo; the resolver's own five-minute caches underneath it are still keyed by tenant and host, so a same-tenant account switch can still be answered from the previous account's cached link for up to five minutes (#1339, deferred). Under a pin the deadline fallback never reaches for the project's own cached link. Found in this release's review.
21
+
-**The persistent `shell` tool strips the same host markers as `bash`** (`ALTIMATE_CODE_SERVE`, the pin variables, headless and non-interactive), so a nested `altimate-code serve` started from it cannot inherit a pin it was never given. Found in this release's review.
22
+
-**Pin ids are decimal digits only** — `Number()` also accepted `1e3` and `0x10` — and the identity section's size cap now fits its longest shape with a maximum-length name instead of dropping the name. Found by this release's adversarial tests.
23
+
24
+
### Changed
25
+
26
+
-**Two strings no longer use "workspace" for something other than the Altimate Workspace** (for every user, not only the pilot): the Databricks credential prompt says `<databricks-workspace-host>`, and the dbt nothing-built validator says "this project is configured to require artifacts". (#1330)
27
+
28
+
### Known limitations (pilot)
29
+
30
+
- Warehouse tool routing does not yet honour the IDE pin (#1337); skills, memory and the identity line do.
31
+
- Switching the pinned workspace does not pull that workspace's skills and memory until the next sync cycle (#1320 notes).
32
+
8
33
## [0.12.0] - 2026-09-18
9
34
10
35
The workspace pilot grows a management surface: the agent knows which workspace it is linked to, the sidebar shows what has and has not synced, a `/workspace` menu handles refresh/sync/unlink, and a locally written skill can be published to the workspace. Everything under **Added** is pilot-only (`ALTIMATE_WORKSPACE=1`); nothing changes for other users. **Heads-up for support:**`upgrade` and `uninstall` now refuse when they cannot tell how the binary was installed, instead of guessing — see the first entry under **Fixed**.
Copy file name to clipboardExpand all lines: docs/docs/usage/cli.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -53,6 +53,8 @@ Workspace features are off unless `ALTIMATE_WORKSPACE=1` is set. With it:
53
53
-`altimate-code link` links the current project to a workspace (or creates one). The sidebar then names the workspace and shows how many memories are not yet synced and when skills last synced.
54
54
-`/workspace` in the TUI opens a menu: **Refresh** pulls the workspace's skills and memory into this project, **Sync** re-sends local memory the workspace never received, **Unlink** detaches the project.
55
55
-`altimate-code skill publish <name>` uploads a project skill to the linked workspace; see [Skills](../configure/skills.md#cli-commands).
56
+
- In an ordinary session the agent is told every turn which workspace the project is linked to — or that none is, or that the link could not be verified just now. In an extension-pinned session it is told the pinned workspace instead, and that it differs from the project's own link. Either way "which workspace am I in?" has an answer, and the agent is told not to confuse it with a Databricks workspace or an IDE workspace folder.
57
+
- When `altimate-code serve` is launched by the VS Code / Cursor extension, the workspace selected in the extension's panel governs that session's skills and memory, taking priority over whatever the project is linked to on the backend, and is scoped to the folder it was launched for. Warehouse tool routing still follows the project's own link for now. A pin is fixed for the life of the `serve` process, so the extension relaunches `serve` when the selection changes; nothing updates a running one.
56
58
57
59
## Global Flags
58
60
@@ -96,6 +98,8 @@ Configuration can be controlled via environment variables:
96
98
|`ALTIMATE_CLI_DISABLE_MODELS_FETCH`| Don't fetch models from models.dev |
97
99
|`ALTIMATE_WORKSPACE`| Opt into the workspace pilot (`1`). Off by default; nothing about workspaces is active without it |
98
100
|`ALTIMATE_INTEGRATIONS`| Set to `local` to keep warehouse tools local rather than routing them through a bound workspace's engine |
101
+
|`ALTIMATE_CODE_SERVE`| Set to `1` by `altimate-code serve` itself, whether the IDE extension or you launched it. Marks that process as the extension's host — so it is the one that reads the pin variables — and is stripped from every child the bash and shell tools start |
102
+
|`ALTIMATE_PINNED_WORKSPACE_ID` / `_NAME` / `_ROOT`| Set together by the IDE extension on `serve`: the workspace selected in its panel and the folder it applies to. All three or none — a partial pin is refused rather than ignored. Read only when `ALTIMATE_CODE_SERVE` is set; never persisted; stripped from child processes |
0 commit comments