Skip to content

feat(automation): publish configSchemas for the keyValue-capable nodes (designer parity, #3304)#3327

Merged
os-zhuang merged 1 commit into
mainfrom
claude/step-logs-run-observability-plxc2p
Jul 20, 2026
Merged

feat(automation): publish configSchemas for the keyValue-capable nodes (designer parity, #3304)#3327
os-zhuang merged 1 commit into
mainfrom
claude/step-logs-run-observability-plxc2p

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Final increment of #3304 (descriptor counterpart to objectui #2670 Phase 3). Follows #3313 (loop), #3321 (map), and objectui #2708 (the keyValue schema-adapter mapping this depends on — merged).

What

Six previously-schemaless nodes now publish a configSchema mirroring objectui's hardcoded field group field-for-field:

node schema
assignment assignments → open map (keyValue)
get_record objectName (xRef object, required) / filter (map) / limit / outputVariable
create_record objectName (required) / fields (map) / outputVariable
update_record objectName (required) / filter (map) / fields (map)
delete_record objectName (required) / filter (map)
screen title / description (multiline) / fields repeater (visibleWhen = xExpression CEL column) / waitForInput / objectName (xRef) / idVariable / mode (enum) / defaults (map)

The maps use the JSON-Schema open-object idiom (additionalProperties: true, no fixed properties) — exactly what objectui #2708's adapter renders as the flat keyValue editor. Values are deliberately fully permissive: real metadata carries operator objects ({"$ne": null}), {var} templates, and non-string literals, so a stricter value schema would reject existing flows (the #15 discipline: the schema describes what the engine accepts, not what's pretty).

Deliberately still schemaless

decision, wait, script, subflow stay on their hardcoded designer forms — a node with no configSchema has no online/offline divergence (both render the hardcoded fallback), while a partial schema would drop editors the adapter can't express:

  • decision — the virtual Target column is derived from out-edges, not stored config
  • wait — fields live in the top-level waitEventConfig block, outside config.*
  • script — the form is actionType-conditional (showWhen), which the adapter has no generic mapping for
  • subflow — carries a top-level timeoutMs field a configSchema can't describe

This is asserted in the test (decision/script explicitly expected schemaless), so a future partial schema can't slip in silently.

End state of #3304

group outcome
loop, map configSchemas + xExpression markers (#3313, #3321)
assignment, 4× CRUD, screen configSchemas (this PR)
decision, wait, script, subflow deliberately hardcoded, reasons documented + tested

With this merged, #3304 can be closed: every node where server-driven parity is achievable without regression has it; the rest are documented design decisions rather than gaps.

Verification

  • New config-schemas.test.ts: keyValue contract shape (type: 'object' + additionalProperties: true + no fixed properties) asserted per map; xRef/xExpression/enum/required assertions; deliberate-schemaless assertions for decision/script.
  • tsc --noEmit clean; full @objectstack/service-automation suite green (335 tests, up from 331).
  • Descriptor metadata only — no runtime behavior change; no spec Zod touched (no generated-schema drift). Requires objectui ≥ feat(security): ADR-0090 P2 — everyone/guest audience anchors, additive baseline, anchor binding gate #2708 for the maps to render structured; older designers keep hardcoded forms.

Known inherited reds (main-wide, unrelated): Check Changeset (console:major) and the ESLint job's check:release-notes (missing v16 page) — same as #3313/#3321.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VuvxWgoadqryqBcjs7TpVi


Generated by Claude Code

…s (designer parity, #3304)

Final #3304 increment (descriptor counterpart to objectui #2670 Phase 3). Now that
the designer's schema adapter can render free-form maps (objectui #2708), the six
keyValue-capable nodes publish structured configSchemas mirroring objectui's
hardcoded field groups field-for-field:

  • assignment      → assignments (open map; legacy array/bare shapes stay
                      read-compatible, not offered for new authoring)
  • get_record      → objectName (xRef object, required) / filter (map) /
                      limit / outputVariable
  • create_record   → objectName (required) / fields (map) / outputVariable
  • update_record   → objectName (required) / filter (map) / fields (map)
  • delete_record   → objectName (required) / filter (map)
  • screen          → title / description (multiline) / fields repeater
                      (visibleWhen = xExpression CEL column) / waitForInput /
                      objectName (xRef) / idVariable / mode (enum) /
                      defaults (map)

The maps use the JSON-Schema open-object shape (`additionalProperties: true`, no
fixed `properties`) and stay fully permissive — real metadata carries operator
objects ({"$ne": null}), {var} templates, and non-string literals as values, so
a stricter value schema would reject existing flows.

Deliberately still schemaless (a node with no configSchema has NO online/offline
divergence, and a partial schema would DROP editors the adapter cannot express):
decision (virtual Target column from edges), wait (top-level waitEventConfig),
script (actionType-conditional form), subflow (top-level timeoutMs).

Verified: new config-schemas parity test (keyValue contract shape asserted per
map; deliberate-schemaless asserted for decision/script); tsc clean; full
@objectstack/service-automation suite green (335 tests). Descriptor metadata
only — no runtime behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VuvxWgoadqryqBcjs7TpVi
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling and removed size/m labels Jul 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): packages/services.

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

  • content/docs/automation/webhooks.mdx (via packages/services)
  • content/docs/kernel/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/index.mdx (via packages/services)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/plugins/packages.mdx (via packages/services)
  • content/docs/protocol/kernel/i18n-standard.mdx (via packages/services)

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.

@vercel

vercel Bot commented Jul 20, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 20, 2026 1:42am

Request Review

@os-zhuang
os-zhuang marked this pull request as ready for review July 20, 2026 01:38
@os-zhuang
os-zhuang merged commit b320158 into main Jul 20, 2026
14 of 16 checks passed
@os-zhuang
os-zhuang deleted the claude/step-logs-run-observability-plxc2p branch July 20, 2026 01:38
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 tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants