Skip to content

docs(audit): the control-plane surface is guarded now — from the other side of the boundary (#3655) - #3707

Merged
os-zhuang merged 2 commits into
mainfrom
claude/route-audit-tranche-3-service-wsxqaf
Jul 27, 2026
Merged

docs(audit): the control-plane surface is guarded now — from the other side of the boundary (#3655)#3707
os-zhuang merged 2 commits into
mainfrom
claude/route-audit-tranche-3-service-wsxqaf

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Companion to objectstack-ai/cloud#888, which closes #3655. Comments and docs only — no behaviour, no test logic changed.

Why

§10's capstone (client-url-conformance.test.ts) exempts /api/v1/cloud/* because nothing in this repo serves those routes — the dispatcher actively refuses them. The comment said only "tracked separately (#3655)", which was accurate when written and is now stale in a way that matters: a reader has no way to tell whether the 23 exempted projects.* methods are guarded somewhere or simply unguarded.

They are guarded, as of cloud#888. The ledger lives in cloud (packages/service-cloud/src/cloud-route-ledger.ts) — 90 routes with reviewed dispositions, plus a client half that drives this SDK with a recording fetch and matches every projects.* URL against it.

It had to live there: cloud depends on this repo, never the reverse, so it is the only place the mounted route set and @objectstack/client are both in scope. The exemption stays, because this suite still cannot see those routes — but it is now a statement about where the coverage lives, not that there is none.

What changed

  • client-url-conformance.test.ts — the CONTROL_PLANE comment now names the file on the other side and why it can only live there.
  • docs/audits/2026-07-dispatcher-client-route-coverage.md — new §13 with the disposition counts (22 sdk / 14 gap / 6 mismatch / 48 server-only+public), both findings, and the follow-up list entry flipped from "needs a ledger" to done.

What the cloud-side guard found immediately

client.projects.listTemplates() builds /api/v1/cloud/templates, which no registrar in either repo mounts — filed as #3702. The string occurs exactly once per repo: the call itself. Templates are real as data (sys_package_templates, a filtered sys_package view) but never as a route.

Sixth instance of the the method exists ≠ the method can be called class, after analytics.explain / analytics.meta (#3584), meta.getView (#3611), i18n.getTranslations / getFieldLabels (#3636) — and the first that only a cross-repo guard could see, which is exactly the argument #3655 made when it was filed.

Also found: a duplicate route registration on the cloud side whose "legacy alias" comment aliases nothing (cloud#887).

One consequence worth stating

Cloud pins the SDK by .objectstack-sha, so its guard asserts against the framework revision cloud builds and ships against — the right revision to check. The consequence: a projects.* change landing on main here is not verified against the control plane until that pin moves. Recorded in §13 rather than left implicit.

Tests

client-url-conformance.test.ts — 3 passed (unchanged; comment-only edit, run to confirm the capstone still holds).

🤖 Generated with Claude Code

https://claude.ai/code/session_01K35y3ovfWtCkBHYFCqUfAt


Generated by Claude Code

…r side of the boundary (#3655)

§10's capstone exempts `/api/v1/cloud/*` because nothing in this repo serves
those routes, and the comment said only "tracked separately (#3655)". The
ledger now exists, in `cloud` — `packages/service-cloud/src/cloud-route-ledger.ts`,
90 routes with reviewed dispositions, plus a client half that drives THIS SDK
with a recording fetch and matches every `projects.*` URL against it.

It had to live there: cloud depends on this repo, never the reverse, so it is
the only place the mounted route set and `@objectstack/client` are both in
scope. The exemption stays — this suite still cannot see those routes — but it
is now a statement about where the coverage lives, not that there is none.

That guard immediately found `projects.listTemplates` building
`/api/v1/cloud/templates`, which no registrar in either repo mounts (#3702):
the sixth instance of the #3584 / #3611 / #3636 class, and the first one only a
cross-repo guard could have seen.

Adds §13 with the disposition counts, both findings, and the one consequence of
pinning: cloud asserts against `.objectstack-sha`, so a `projects.*` change
here is not verified against the control plane until that pin moves.

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 27, 2026 3:18pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests size/s labels Jul 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/client.

13 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/skills-reference.mdx (via packages/client)
  • content/docs/api/client-sdk.mdx (via @objectstack/client)
  • content/docs/api/data-flow.mdx (via @objectstack/client)
  • content/docs/api/environment-routing.mdx (via @objectstack/client)
  • content/docs/api/error-catalog.mdx (via @objectstack/client)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/client)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/client)
  • content/docs/kernel/runtime-services/index.mdx (via packages/client)
  • content/docs/permissions/authentication.mdx (via @objectstack/client)
  • content/docs/plugins/packages.mdx (via @objectstack/client)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/client)
  • content/docs/releases/implementation-status.mdx (via @objectstack/client)
  • content/docs/releases/v16.mdx (via @objectstack/client)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

The Check Changeset gate requires every PR to add one; an empty-frontmatter
changeset is its own sanctioned "this PR releases nothing" declaration, which
is what a comment-and-docs change should say rather than minting a version bump
for prose. Same form as .changeset/adr-0104-design-doc-only.md.

Co-Authored-By: Claude <noreply@anthropic.com>
@os-zhuang
os-zhuang marked this pull request as ready for review July 27, 2026 15:29
@os-zhuang
os-zhuang merged commit 134ee9b into main Jul 27, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/route-audit-tranche-3-service-wsxqaf branch July 27, 2026 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The projects.* SDK namespace targets the control plane, which no in-repo ledger can vouch for

2 participants