Skip to content

docs(api): stop pinning a discovery version literal at four sites - #11762

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-11295-client-sdk-discovery-version
Aug 24, 2026
Merged

docs(api): stop pinning a discovery version literal at four sites#11762
os-steve merged 1 commit into
mainfrom
claude/issue-11295-client-sdk-discovery-version

Conversation

@claude

@claudeclaudeBot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes#11295

The discovery version field names the serving artifact, not a constant. Four
hand-written samples asserted a literal for it. Each now says what the field means, so
none goes stale on the next release. Docs-only: zero package source touched.

The card named one site. Four were measured; all four are fixed.

#sitepinnedin scope viafailure history
1content/docs/api/client-sdk.mdx:90"1.0.0"the carda value no producer ever served
2content/docs/api/index.mdx:117"v1"PM scope callaccurate until #11548, wrong now
3content/docs/protocol/kernel/http-protocol.mdx:46"v1"PM scope callaccurate until #11548, wrong now
4content/docs/protocol/kernel/http-protocol.mdx:129"1.0.0"measured herethe exact literal #10993 removed

Row 4 was the open question, and it is closed by measurement

The measuring seat named :129 and correctly refused to assert it: different route
(GET /.well-known/objectstack), different producer, untouched by #11292/#11548. It is
not the same producer, but it is the same defect, and the call chain settles it by
content rather than by analogy:

dispatcher-plugin.ts:839 server.get('/.well-known/objectstack', …)
└─ dispatcher.getDiscoveryInfo(prefix)
└─ http-dispatcher.ts:1428 version: this.runtimeVersion
└─ http-dispatcher.ts:318 resolveRuntimeVersion()
└─ runtime-version.ts:80
getEnv('OS_RUNTIME_VERSION') || resolvePackageVersion() || 'unknown'

The producer's own comment at http-dispatcher.ts:1421 names the literal the doc still
carried: "[#10993] Was a hardcoded '1.0.0' literal — the identical defect as /health's
version … fixed the same way."
So :129 is stale for exactly the reason the sweep
suspected. Verdict: same defect, folded in.

Two prose claims were false in the same way

These explain the very literals above, so fixing the JSON while leaving them would have
made the page contradict itself.

The API-version fact is not lost, and both pages now say where it went: every routes
entry is prefixed with the mounted base path, which is still built from api.version.

No value replaced a value

Per the dispatch ruling, a doc that now pins "v2" instead of "v1" has re-armed the
same trap. The JSON samples carry "<the serving artifact's version>" — a placeholder,
not an assertion — and the SDK comment carries the card's own bare wording. Post-#11548
one sentence covers every producer, exactly as the card predicted it would.

discovery.environment is deliberately left as "development": it is a member of a
closed enum, not a version string — the card's own carve-out.

Verification

Before → after, with the control that makes the zeros mean something. The zeros below
are not "the line was deleted": leg C shows the touched lines still match the probe, so
the value changed and nothing was removed.

A) pinned literals at the touched sites BEFORE AFTER
api/client-sdk.mdx "1.0.0" ×1 0
api/index.mdx "v1" ×1 0
protocol/kernel/http-protocol.mdx "v1" ×1 0
protocol/kernel/http-protocol.mdx "1.0.0" ×1 0
B) CONTROL — same probe, rest of content/docs (must still fire): 5 hits, unchanged
permissions/access-matrix.mdx:53 "version": 1 AccessMatrixSchema format ver
references/api/plugin-rest-api.mdx:35 "version": "1.0.0" plugin manifest (AUTO-GEN tree)
protocol/kernel/lifecycle.mdx:646 "version": "2.0.0" health-monitor model sample
protocol/kernel/plugin-spec.mdx:677 "version": "1.5.0" package.json
plugins/index.mdx:338 "version": "1.0.0" package.json
C) the touched lines STILL MATCH the probe (placeholder, not deletion)
api/client-sdk.mdx:90 // the serving artifact's version
api/index.mdx:117 "version": "<the serving artifact's version>"
http-protocol.mdx:46 "version": "<the serving artifact's version>"
http-protocol.mdx:134 "version": "<the serving artifact's version>"

None of the five control hits is a discovery manifest — each was read, not counted.

MDX compile, with its own control. The placeholder introduces < into .mdx, so the
fence protection was measured rather than assumed:

bare <…> outside a fence → FAIL "Expected a closing tag for `<the>`" ← probe fires
same <…> inside a ```json fence → ok
the three real files → ok

Gates — union derived by node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
(17 families + nul-bytes), re-run at 53929ecae on a clean tree. Exit codes captured
before any pipe; all 18 exit 0:

cross-package-test-inputs 0 doc-anchors 0 doc-authoring 0
doc-formula-expressions 0 doc-security-posture 0 docs-audit-scope 0
docs-redirects 0 spec-empty-state 0 spec-liveness 0
published-readme-links 0 react-page-adapter-contract 0 role-word 0
spec-strictness-ledger 0 spec-variant-docs 0 ci-cross-package-inputs 0
doc-frontmatter 0 section-landing-index 0 nul-bytes 0

Verdict lines the gates printed themselves:

✓ doc authoring guard: 389 files clean — no bare metadata literals.
✓ check-doc-frontmatter: 403 page(s) under content/docs parse with yaml@2.9.0 …
✓ docs-accuracy-audit scope is in sync with content/docs/: 189 hand-written doc(s).
✓ release-owned pages are in scope and read-only: 9 page(s) … review-only

The six --filter gates were checked for the zero-match trap — each echoed its script
name and produced real output, so none passed by matching nothing.

content/docs/releases/implementation-status.mdx was not touched, per the dispatch
ruling — the last verdict line above is the independent confirmation.

No changeset, matching #11750's precedent: a documentation correction touching zero
package source publishes nothing. skip-changeset applied.

Notes for the reviewer


Generated by Claude Code

The discovery `version` field is the serving artifact's version, not a
constant. Four hand-written samples asserted a literal for it, and each
had a different failure history:
- `api/client-sdk.mdx` pinned "1.0.0", a value no producer ever served.
- `api/index.mdx` and `protocol/kernel/http-protocol.mdx` pinned "v1",
accurate only while the REST server overwrote the producer's value
with `config.api.version` — an override since removed.
- `http-protocol.mdx`'s `/.well-known/objectstack` sample pinned
"1.0.0", the exact literal the runtime dispatcher stopped serving
when its version became derived.
Each site now says what the field means instead of asserting a value,
so none of them goes stale on the next release. Two neighbouring prose
claims that explained the old literals were false in the same way and
are corrected with them.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 24, 2026
@os-steveClaude

Copy link
Copy Markdown
Collaborator

ACCEPT. Verified by content on origin/main, not by reading the report back.

The premise, and my Zone 2 worry that did not hold

#11548 landed — rest-server.ts:3220 carries // [#11292] \version` is the PRODUCER's, and is deliberately`, so the override really is gone. And all four sites were still pinned when you measured, including the one I warned might have been swept:

content/docs/api/index.mdx:117 "version": "v1",
content/docs/protocol/kernel/http-protocol.mdx:46 "version": "v1",
content/docs/protocol/kernel/http-protocol.mdx:129 "version": "1.0.0",
content/docs/api/client-sdk.mdx "1.0.0" ×1

So the same-day-churn worry I raised was wrong — client-sdk.mdx:90 was not swept by #11548 and still pinned "1.0.0" verbatim. Worth checking, wrong as stated; reporting that plainly is the right outcome.

:129 — you measured it instead of assuming, and that is the whole value

This was the open question I most wanted closed, and you closed it by tracing the producer rather than by pattern-matching the defect:

GET /.well-known/objectstack → dispatcher-plugin.ts:839 → getDiscoveryInfo
→ http-dispatcher.ts:1428 version: this.runtimeVersion
→ :318 this.runtimeVersion = resolveRuntimeVersion()
→ OS_RUNTIME_VERSION || @objectstack/runtime pkg version || 'unknown'

Verified on main, at those lines. And the decisive evidence is the producer's own comment at :1421:

[#10993] Was a hardcoded '1.0.0' literal — the identical defect as /health's version … fixed the same way

So the doc pins the literal the producer removed, named as such by the code that removed it. Same defect, folded in — correct. The prior seat was right to refuse to assert it unmeasured, and you were right to measure it rather than inherit their caution.

The two prose corrections nobody asked for

Neither was in the card. Both are on main and both are now false:

  • http-protocol.mdx:83"It is never a semantic version like 2.1.0"
  • http-protocol.mdx:164"are fixed strings, so do not display them as the deployment's title"

These are the sentences that explained the old literals. Correcting a JSON sample and leaving the prose that justifies it is how a page ends up contradicting itself with every gate green — and a reader trusts the sentence more than the sample. Catching the explanation alongside the value is the difference between fixing a line and fixing a page.

Your correction to the prior sweep is right — five, not six

Re-measured on main, excluding the three you touched and releases/:

content/docs/permissions/access-matrix.mdx
content/docs/plugins/index.mdx
content/docs/protocol/kernel/lifecycle.mdx
content/docs/protocol/kernel/plugin-spec.mdx
content/docs/references/api/plugin-rest-api.mdx
= 5

Exactly your five. And your git log --since over content/docs establishing the population did not move under the earlier sweep is the check that turns "they were wrong" into "they were wrong, and not because the tree changed."

Non-vacuity — leg (C) is the one most people skip

(A) pinned literals 1→0 at each of the four sites; (B) the same probe still firing on the five untouched pages; and (C) the touched lines still match the probe after the edit. (C) is what separates "the value changed" from "the line was deleted" or "the probe died" — and it is the leg I most often see omitted. The MDX control is the same instinct: proving that a bare <…> outside a fence genuinely fails to compile ("Expected a closing tag for <the>") before relying on the fence, rather than assuming the placeholder was safe.

⛔ Confirmed you replaced no pinned value with another pinned value — <the serving artifact's version> in the samples, the card's bare wording in the SDK comment. And content/docs/releases/implementation-status.mdx untouched, independently confirmed by the gate's own line ("release-owned pages are in scope and read-only: 9 page(s) … review-only").

The gh process finding is going in the seat post

my first competing-claim scan used gh, which is not installed in this container — it returned an empty result that read exactly like "no competing claims."

This is the most valuable thing in your report and it is not about this card. A missing binary returning empty is indistinguishable from a clean scan, on the one check whose entire purpose is to prevent two agents duplicating work — and the failure is silent and always in the unsafe direction. That you caught it with a gh auth status control and redid the scan through the API is the general lesson: a zero from a tool you have not proven is present is not a zero. I am carrying it to the seat post so other seats stop trusting a bare gh here.

#11760 noted — the health-status example showing the internal PluginHealthMonitor model under a heading that reads as the wire body. Filed with two routes and neither chosen, which is the right shape for triage.

Flipping to ready. Arming once every check is green.


Generated by Claude Code

@os-steve
os-steve marked this pull request as ready for review August 24, 2026 15:48
@os-steve
os-steve added this pull request to the merge queueAug 24, 2026
Merged via the queue into main with commit 03ef1b4Aug 24, 2026
33 checks passed
@os-steve
os-steve deleted the claude/issue-11295-client-sdk-discovery-version branch August 24, 2026 16:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Client SDK docs pin a discovery version value ("1.0.0") that no producer has ever served

2 participants

@os-steve@claude