docs(deployment): name both Connect-an-Agent doors in the OS_MCP_STDIO_API_KEY row - #18959
Merged
os-try-charles merged 1 commit intoSep 18, 2026
Merged
Conversation
…O_API_KEY row The row told the reader to "Mint one from Setup -> Connect an Agent". SETUP_APP declares requiredPermissions: ['setup.access'], so a permissionless principal gets 403 PERMISSION_DENIED on /api/v1/meta/apps/setup -- a direct minting instruction that names only the Setup door sends a non-admin down a path they cannot take. The page is delivered to them through a navigationContributions entry in the `account` app instead, and the Setup entry stays for admins deliberately. Name both doors, in the wording the sibling pages already use: Account -> Developer for any signed-in user, Setup -> Connect an Agent for platform admins. Compressed to one table cell; pipes and row count unchanged. Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Sep 18, 2026
os-try-charles
marked this pull request as ready for review
September 18, 2026 07:55
os-try-charles
deleted the
claude/issue-18143-connect-agent-env-var-row
branch
September 18, 2026 08:11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #18143
Clause-②: no
The remainder — one line, one file
This card named four sites. PR #18573 landed three of them;
content/docs/ai/connect-mcp.mdxbelongs to #17648. What was left is the fourth: theOS_MCP_STDIO_API_KEYrow incontent/docs/deployment/environment-variables.mdx, located by content, not by the line number the card quotes.POST /api/v1/keys). …POST /api/v1/keys. …One line in, one line out. It is a table cell in a long Markdown table, so the two-door sentence is compressed to fit: pipe count unchanged (5), row count unchanged (133
OS_rows), still a single line.Why the old cell was wrong
SETUP_APPdeclaresrequiredPermissions: ['setup.access'], and a permissionless principal gets403 PERMISSION_DENIEDon/api/v1/meta/apps/setup. A direct minting instruction naming only the Setup door therefore tells a non-admin to take a path they cannot take. Ruling #16746 (decision batch #85) delivers the page to them through anavigationContributionsentry in theaccountapp — appaccount, groupgrp_account_developer(label Developer), itemnav_connect_agent(label Connect an Agent), package idcom.objectstack.account. The Setup entry stays for admins, deliberately.So the fix is name both doors, ⛔ not replace Setup with Account — the shape PR #18142 and PR #18573 established. The wording here is copied from the two sibling pages rather than invented as a fourth spelling:
content/docs/api/index.mdx:68-69— "…from the Connect an Agent page in the Console — Account → Developer for any signed-in user, Setup → Connect an Agent for platform admins."content/docs/getting-started/build-with-claude-code.mdx:435-436— "…lives on the Connect an Agent page: Account → Developer for any signed-in user, Setup → Connect an Agent for platform admins."Post-condition probe — written BEFORE the edit, and deliberately NOT "Setup goes to 0"
An earlier round's first probe was "
Setup → Connect an Agentmust go to 0 in this file". That probe is wrong for this card: the correct end state keeps the Setup door named, so it would read a correct landing as a half-done one. The post-conditions here are about the Account door appearing alongside.Every count is taken on a whitespace-flattened file, so wrapped prose cannot give a false zero, and every zero is paired with a control from the same population that must hit.
Account → DeveloperSetup → Connect an AgentConnect an AgentunprefixedOS_rows / pipes in the row / lines for that keycontent/docs/**/*.mdx(404 files),Connect an AgentunprefixedCorpus-level close-out: the Setup door is still named in exactly 4 files (unchanged by design), and every one of the 4 now also names the Account door — carriers naming the Setup door but not the Account door: 0.
Setup → Connect an AgentAccount → Developercontent/docs/ai/connect-mcp.mdxcontent/docs/api/index.mdxcontent/docs/deployment/environment-variables.mdxcontent/docs/getting-started/build-with-claude-code.mdxSerial constraint — re-measured at hunk level, and it does not bite
PR #18420 (draft, untouched since 2026-09-17T16:16Z) is the only open PR touching this file. Read from its diff: its only hunk in this file is
@@ -87,7 +87,7 @@, theOS_AUTOMATION_SCHEDULED_WORK_ENABLEDrow. This PR changes the row at:260. 173 lines apart, far outside git's three-line context ⇒ no textual conflict. Nothing in #18420 was touched or coordinated.Verification
Gate families derived in this worktree from the real change set, not from a hand-written list:
node scripts/pm/dispatch-gates.mjs --commands(change set: 1 path vs merge base46559f61c).exit 0. Reconciled with exit codes recorded:dispatch-gates --repo objectstack-ai/objectstack --ran⇒ "39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED (a DERIVED zero — all 39 recorded an exit code and none of them is 3)".PREREQUISITE NOT MET(exit 3×3, pluscheck:skill-examplesexit 1 on an unbuiltclient-reactdist) — not findings. Afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lint --filter=@objectstack/client-react --filter=@objectstack/client(exit 0) all four re-ran atexit 0:check:doc-formula-expressions,check:doc-security-posture,check:skill-examples,check:docs-transcript-drift.pnpm --filter @objectstack/spec buildran first (exit 0), socheck:docsread a current tree.grep -naPover the edited file finds none (exit 1), with a planted positive control proving the reader fires (exit 0, hit).pnpm check:nul-bytesexit 0.pnpm lint— a proven narrowing, not a skipped runThe repo-wide scan is CI's run. Three pieces of evidence that narrowing excluded nothing:
files:glob ineslint.config.mjsenumerates code extensions (ts,tsx,mts,cts,js,jsx,mjs,cjs); the stringmdxoccurs 0 times in that config..mdxis not in the linted population at all.--format json: eslint over the changed file returns 0 results; the positive control (scripts/check-nul-bytes.mjs) returns 1 result — the reader resolves files and reports.eslint.config.mjs, which never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file"), so this diff cannot move any untouched file's verdict.Changeset:
skip-changeset, measuredNothing published moves.
files[](the control: the reader resolvesfiles[]arrays — e.g.@objectstack/spec⇒dist,json-schema,liveness,prompts,llms.txt,README.md,src/**/*.zod.ts,CHANGELOG.md,api-surface,spec-changes.json). Entries reachingcontent/docs/**: 0.files[]entries actually resolve to:Mint one from⇒ 0,Account → Developer⇒ 0; positive controlobjectstack⇒ 1971 files, so the reader reaches published bytes.content/docs/,@objectstack/docs(apps/docs), isprivate: trueand declares nofiles[].content/docs(@objectstack/plugin-webhooks) does so in itsdescriptionprose about a different page; itsfiles[]isdist,README.md,CHANGELOG.md.Acceptance notes
Out of scope, noted and not filed:
docs/adr/0101-…:104,docs/qa/platform-checklist/areas/ai.json:206, two.changeset/*.md) are dated records, left untouched.Setup → SettingsandSetup → Authentication, and the corpus carries 27 otherSetup → Xphrases (Access Control, People, SSO Providers, Datasources, Approvals …). Those name genuinely admin-only surfaces addressed to admins — the Connect-an-Agent defect exists precisely because that one page is also delivered to non-admins through theaccountapp, which is not true of the others. No defect, and the successor question has an answer: successor: none — no PR or reader is routed to them by this change.Generated by Claude Code
Generated by Claude Code