Skip to content

feat(client): the final six route-audit gaps — meta drafts/published/FSM + automation descriptors (#3563 PR-5) - #3579

Merged
os-zhuang merged 1 commit into
mainfrom
claude/screen-flow-submit-resume-v9dqjx
Jul 27, 2026
Merged

feat(client): the final six route-audit gaps — meta drafts/published/FSM + automation descriptors (#3563 PR-5)#3579
os-zhuang merged 1 commit into
mainfrom
claude/screen-flow-submit-resume-v9dqjx

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

PR-5 of #3563 — the closing batch. Gap ratchet: 6 → 0 (from 27 at the start of the audit). Every dispatcher route that should be SDK-expressible now is, and the conformance guard keeps it that way.

The surfaces

meta (shapes mirrored from domains/meta.ts):

awaitclient.meta.getPublished('lead','views/all_leads');// ADR-0033; compound names unencoded, matching getItemawaitclient.meta.listDrafts({packageId: 'com.acme.crm'});// pending drafts the active-only lists hideconst{ next }=awaitclient.meta.getLegalNextStates('crm_lead','status','new');// ADR-0020 FSM introspection — next: null (no FSM / from omitted), [] (dead-end), or the legal states

automation (shapes mirrored from domains/automation.ts):

awaitclient.automation.listActions({paradigm: 'flow'});// ADR-0018 descriptors → designer's action pickerawaitclient.automation.listConnectors({type: 'rest'});// ADR-0022awaitclient.automation.getRuntimeStatus();// per-flow enabled/bound engine state → Studio badges

A design validation worth noting

Since PR-1, main's ADR-0076 extraction moved /meta, /data, /actions, /mcp from the dispatcher's legacy if-chain into the domain registry. The guard absorbed that structural migration with zero edits — registry-enumerated domains and pinned legacy prefixes are checked as one set, which was the design intent. The ledger survived its first architecture shift untouched.

Ledger + docs

  • The last six rows flip gapsdk; the ratchet lands at 0 with the full 27→24→17→6→0 history recorded in the test comment.
  • Docs-site meta (7→11) and automation (15→18) rows updated to the real method counts.

Test plan

  • 6 new unit tests: compound-name passthrough, query building/omission, FSM from= forwarding and null semantics, descriptor filters, _status shape.
  • Client suite 146 passed; ledger guard green on the post-extraction main; ESLint clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LX9ut3MK3KykE11S9bJmv5


Generated by Claude Code

…FSM + automation descriptors (#3563 PR-5)
The gap ratchet reaches ZERO (from 27 at the start of the audit): every
dispatcher route that should be SDK-expressible now is, and the conformance
guard keeps it that way.
meta (shapes mirrored from domains/meta.ts):
- getPublished(type, name) — GET /meta/:type/:name/published
(ADR-0033; compound names pass through unencoded, matching getItem)
- listDrafts({packageId?, type?}) — GET /meta/_drafts (pending drafts the
active-only lists hide — e.g. what an AI authored but nobody published)
- getLegalNextStates(object, field, from?) — GET /meta/objects/:name/state/:field
(ADR-0020 D3.3 FSM introspection; next=null when no FSM / from omitted,
[] for a declared dead-end)
automation (shapes mirrored from domains/automation.ts):
- listActions({paradigm?, source?, category?}) — GET /automation/actions
(ADR-0018 descriptors backing the designer's action picker)
- listConnectors({type?}) — GET /automation/connectors (ADR-0022)
- getRuntimeStatus() — GET /automation/_status (per-flow
enabled/bound engine state behind the Studio badges)
Ledger: the last six rows flip to sdk; ratchet 6 → 0. Docs-site meta and
automation rows updated to the real method counts.
Note: main's ADR-0076 extraction moved /meta /data /actions /mcp into the
domain registry since PR-1; the guard absorbed the migration with no edits —
registry-enumerated domains and pinned legacy prefixes are checked as one
set, which was the design intent.
Verified: client 146 passed (6 new), ledger guard green on the new main,
eslint clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LX9ut3MK3KykE11S9bJmv5
@vercel

vercelBot commented Jul 27, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 27, 2026 7:52am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tests tooling labels Jul 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/client, @objectstack/runtime.

26 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, packages/runtime)
  • 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/api/index.mdx(via @objectstack/runtime)
  • content/docs/api/wire-format.mdx(via @objectstack/runtime)
  • content/docs/automation/hook-bodies.mdx(via @objectstack/runtime)
  • content/docs/concepts/north-star.mdx(via packages/runtime)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/runtime)
  • content/docs/deployment/index.mdx(via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx(via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx(via @objectstack/runtime)
  • content/docs/deployment/vercel.mdx(via @objectstack/runtime)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/client, @objectstack/runtime)
  • 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, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx(via packages/runtime)
  • content/docs/plugins/packages.mdx(via @objectstack/client, @objectstack/runtime)
  • content/docs/protocol/kernel/http-protocol.mdx(via @objectstack/runtime)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/runtime)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/runtime)
  • content/docs/protocol/kernel/realtime-protocol.mdx(via @objectstack/client)
  • content/docs/releases/implementation-status.mdx(via @objectstack/client, @objectstack/runtime)
  • 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.

@os-zhuang
os-zhuang marked this pull request as ready for review July 27, 2026 08:04
@os-zhuang
os-zhuang merged commit 0164f40 into mainJul 27, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/screen-flow-submit-resume-v9dqjx branch July 27, 2026 08:04
os-zhuang added a commit that referenced this pull request Jul 27, 2026
…he 2 PR-1 (#3587) (#3609)
The dispatcher tranche (#3569..#3579) closed its 27 gaps and guards them;
this brings the same regime to the second, larger surface. All 89 routes
@objectstack/rest mounts now carry a reviewed disposition in
rest-route-ledger.ts: 38 sdk, 43 gap (ratcheted), 3 server-only, 3 public,
2 mismatch.
The guard enumerates BOTH sources for real — RouteManager routes via the
getRoutes() introspection seam that already existed, and the two
RouteManager-bypassing registrars (package-routes.ts,
external-datasource-routes.ts) via captured mock-server registrations —
so no pinned-by-hand list anywhere. The client-method direction lives in
packages/client next to the SDK (same package-boundary split as tranche 1;
a rest->client edge is unbuildable). All five guard directions were
negative-tested and fail with the offending route named.
Mismatches the audit surfaced, ledgered not fixed: POST /api/v1/packages
is a publish-vs-install shape collision between REST and the dispatcher
(REST registers first and wins); REST's GET /ui/view/:object/:type path
dialect is unreachable by the SDK's query-param dialect. The
service-storage / service-i18n autonomous mounts are a third surface,
explicitly scoped out and noted in the ledger header.
No behavior change: data + tests only, plus a scope-note refresh in the
runtime ledger.
Refs #3587
Claude-Session: https://claude.ai/code/session_01LX9ut3MK3KykE11S9bJmv5
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude