Skip to content

refactor(spec): remove unenforced agent visibility field (ADR-0056 D8, #1901)#3216

Merged
os-zhuang merged 1 commit into
mainfrom
claude/agent-visibility-enforcement-gbsf6k
Jul 18, 2026
Merged

refactor(spec): remove unenforced agent visibility field (ADR-0056 D8, #1901)#3216
os-zhuang merged 1 commit into
mainfrom
claude/agent-visibility-enforcement-gbsf6k

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

Removes the agent visibility (global/organization/private) field, closing out #1901 by the ADR-0056 D8 "design+enforce or remove" disposition — remove, not enforce.

visibility was declared but never enforced: the chat-access evaluator excluded it and the agent list route never filtered by it, so setting private never hid an agent. Per ADR-0049 / ADR-0056 D8, a security-shaped field with no runtime consumer is a liability — authors who set private believe they've restricted an agent when they haven't.

Why remove instead of enforce or keep-marked

Correct enforcement is undesigned, not merely unplumbed:

Unlike field-encryption (kept [EXPERIMENTAL] — it has a stable schema shape on a real enterprise roadmap), there's no shape here worth preserving, so the field is dropped rather than carried marked. Re-introduce visibility when the agent listing surface gains real owner/org semantics.

Real gating already exists and is unchanged: access / permissions are enforced at the chat route (#1884).

Changes

  • agent.zod.ts — remove the visibility field; replace its EXPERIMENTAL banner with a removal note (alongside the existing tenantId-removal note).
  • agent.form.ts — drop the visibility field from the authoring form.
  • agent.test.ts — drop the visibility default-value assertion.
  • liveness/agent.json — drop the visibility ledger entry (schema and ledger stay in sync for the completeness gate).
  • authz-conformance.matrix.ts — move agent-visibility from experimentalremoved (ADR-0056 D10).
  • docs — regenerate the schema reference (content/docs/references/ai/agent.mdx) and update the authorization posture table.
  • changeset@objectstack/spec minor. AgentSchema is not .strict(), so existing metadata still setting visibility parses cleanly (unknown key stripped, not rejected) — a non-breaking removal, consistent with the prior compliance/masking/RLS removals.

Companion PR

objectui removes the now-dead visibility pill from AgentPreview: objectstack-ai/objectui#(companion — same branch).

Verification

No node_modules in this environment (install was declined), so no local build/test run. Changes are surgical removals with no new logic; the spec liveness gate and the D10 matrix removed-has-note invariant are both satisfied by construction (verified by reading check-liveness.mts and authz-conformance.test.ts).

Closes #1901.

🤖 Generated with Claude Code

https://claude.ai/code/session_012gckUwoUMWvTWfGHFgWAob


Generated by Claude Code

…D8, #1901)

Agent `visibility` (global/organization/private) was declared but never
enforced: the chat-access evaluator excluded it and the agent list route did
not filter by it, so `private` never hid an agent. Per ADR-0049 / ADR-0056 D8
("design+enforce or remove"), a security-shaped field with no runtime consumer
is a liability — authors who set `private` believe they've restricted an agent
when they have not.

Correct enforcement is undesigned, not just unplumbed: agents have no owner
field (`agent.tenantId` was already removed in #2377) and the `EXTERNAL`
posture rung is never derived, so `organization` vs `global` is
runtime-indistinguishable. Unlike field-encryption (kept EXPERIMENTAL — stable
schema shape on a real roadmap), there is no shape worth preserving, so the
field is dropped rather than carried marked.

- Remove `visibility` from AgentSchema (`agent.zod.ts`) and the authoring form
  (`agent.form.ts`); drop the default-value assertion in `agent.test.ts`.
- AgentSchema is not `.strict()`, so existing metadata still setting
  `visibility` parses cleanly (unknown key stripped, not rejected).
- Liveness ledger: drop the `visibility` entry (`liveness/agent.json`).
- Authz-conformance matrix: move `agent-visibility` from experimental to
  removed (ADR-0056 D10).
- Regenerate schema reference docs; update the authorization posture table.

Use `access` / `permissions` to restrict agent use — both enforced at the chat
route (#1884). Re-introduce `visibility` when the listing surface gains real
owner/org semantics; tracked in #1901.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012gckUwoUMWvTWfGHFgWAob
@vercel

vercel Bot commented Jul 18, 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 18, 2026 2:13pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): packages/qa, @objectstack/spec.

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

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via packages/qa, @objectstack/spec)
  • content/docs/permissions/delegated-administration.mdx (via packages/qa)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

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 18, 2026 14:41
@os-zhuang
os-zhuang merged commit 369eb6e into main Jul 18, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/agent-visibility-enforcement-gbsf6k branch July 18, 2026 14:41
baozhoutao added a commit that referenced this pull request Jul 19, 2026
…lity removal)

hotcrm v2.0.0 still authors the agent `visibility` field that #3216
removed from the spec (ADR-0056 D8), so the pre-publish downstream
smoke has been red and the release train is stalled. Point the gate at
hotcrm v2.1.0, which drops the field.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
baozhoutao added a commit to objectstack-ai/hotcrm that referenced this pull request Jul 19, 2026
…0056 D8) (#449)

The upcoming @objectstack/spec release removes the unenforced agent
`visibility` field (objectstack-ai/framework#3216). Omit it from the
two copilot agents so hotcrm typechecks against both the current and
the upcoming spec.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
baozhoutao added a commit that referenced this pull request Jul 19, 2026
…e164196801bd (#3294)

* ci(release): bump downstream-smoke HOTCRM_REF to v2.1.0 (agent visibility removal)

hotcrm v2.0.0 still authors the agent `visibility` field that #3216
removed from the spec (ADR-0056 D8), so the pre-publish downstream
smoke has been red and the release train is stalled. Point the gate at
hotcrm v2.1.0, which drops the field.

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

* chore: bump objectui to e164196801bd

fix(app-shell,plugin-detail): record History tab renders display values, not raw audit payloads (#2691)

objectui@e164196801bd38e1396798877a69e0a09e80d8d3

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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 protocol:ai size/s tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[P2][security] Enforce agent visibility (organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent

2 participants