Skip to content

Commit ee63b47

Browse files
fix(platform-objects, plugin-security, plugin-approvals, service-messaging, objectql): Setup field help is written for administrators, and the inert access-review fields are hidden (#25377)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6Jao79xdvASVbExtbmLctNuuEG)_ Fixes #25331 Clause-②: no Metadata-protocol: none Ruling carried: objectstack-ai/hotcrm#2194, record `6354968262`: > 25251 B hotcrm B It adopts T2-U02. The card's *Done when* is the acceptance. ## What changes Each developer string the Setup pass met is replaced by help an administrator can act on: what the field means and what to do with it. Where the old text held a fact a developer needs, that fact moved into the code comment beside the field. | Field | Was | Now says | |:---|:---|:---| | `sys_user_permission_set.user_id`, `sys_user_position.user_id` | "Foreign key to sys_user." | the user who receives the set / holds the position | | `sys_user_permission_set.permission_set` | "… NULL only on a grant written before the column existed." | pick a permission set defined in Setup; an unknown name is rejected | | `last_certified_at`, `certified_by` (both objects) | "Reserved for a future access-recertification workflow … Inert today: no platform code writes this column …" | not in use yet, kept for a future access-review feature; **and `hidden: true`** | | `sys_approval_delegation.valid_from` | "Enforced at resolution time via isGrantActive …" | checked each time an approval is routed, no scheduled job | | `sys_notification_preference.digest` | "Batch cadence (P3 digest middleware)." | what none / daily / weekly do, critical notifications are never batched, set it on a `*` channel row | | `sys_notification_preference.quiet_hours` | "Optional { tz, start, end } window (P3 quiet-hours middleware)." | an example value, HH:MM in the time zone, may wrap midnight, critical not held, `*` channel row | | `sys_user.ai_access`, `sys_user.locale` | "… plugin-hono-server resolveCtx … AiSeatPlugin … Owned by objectql (better-auth is oblivious to this column)." | what the seat gives and that the license caps it; the language tag and its fallback | | `sys_oauth_access_token` / `_refresh_token` / `_consent` / `_client_resource` reference fields | "Foreign key to sys_user.id" (and to `sys_oauth_application.client_id`, `sys_session.id`, `sys_oauth_refresh_token.id`, `sys_oauth_resource.identifier`) | which user, application, session, refresh token or resource it is | | `sys_metadata.package_version_id` | "Foreign key to sys_package_version (UUID). …" | the package release the metadata came from, empty for built-in and local changes | | Data Lifecycle settings page and its Retention overrides help | "Governance for ADR-0057 … LifecycleService (Reaper / Rotator / Archiver)", "(ADR-0057 §3.2)" | what the page controls and that the periodic cleanup sweep applies it | The behaviour claims in the new digest and quiet-hours help were read from `service-messaging/src/preference-resolver.ts` (`resolveDigest` / `resolveQuietHours` read only the channel `*` row; `critical` bypasses both; `digestDeferral` flushes at local midnight and Monday 00:00). **Hidden, not deleted.** `last_certified_at` and `certified_by` on `sys_user_permission_set` and `sys_user_position` now carry `hidden: true`, the field's own "Hidden from default UI" flag. objectui's form auto-layout (`plugin-form/src/autoLayout.ts`) and the record detail panel (`plugin-detail/src/RecordDetailPanel.tsx`) both skip a `hidden` field. The columns, their stored values and the API are unchanged. No other field's help says it is inert. **Bundles.** `en` regenerated from the sources (`node scripts/check-i18n-bundles.mjs --write`). The `zh-CN`, `ja-JP` and `es-ES` values of every rewritten leaf were translated by hand (they were translations of the old developer text, or for the `ja-JP` / `es-ES` approvals and messaging leaves, byte copies of it). The generator then dropped the four `source-hashes.generated.ts` entries that recorded those byte copies, which is its documented behaviour once a leaf is translated. The AI Access help keeps the word "capability" (`ai_seat` capability, 能力 / ケイパビリティ): two translation-decision tests derive the capability wording from that leaf. **Pin.** The four existing admin-copy vocabulary tests (`platform-objects` `setup-copy-vocabulary.test.ts`, `plugin-security`, `plugin-approvals`, `service-messaging` `admin-copy-vocabulary.test.ts`) gain five entries: a foreign-key note, the `isGrantActive` function name, an internal component (`middleware`, "better-auth is oblivious", `Reaper`), the "NULL only on" storage note and the "Inert today" notice, each with a positive control. They walk every object this package ships and every leaf of all four locale bundles. `plugin-security`'s test also asserts the four access-review fields are `hidden`. The settings manifest had no copy test, so `objectql/src/lifecycle/lifecycle-settings.test.ts` is new (ADR number, section reference, internal component names). ## Surface note: one string outside the declared surface `packages/metadata-core/src/objects/sys-metadata.object.ts` (`package_version_id` help) is outside the claim's file surface. It is the same defect class, a one-line mechanical rewrite, and it is in the population `platform-objects`' vocabulary test already walks (that test reads metadata-core's objects, and the help lands in the `platform-objects` bundle), so the new "foreign key" entry could not go green without it. Taken under os-dev's bounded in-place fix; the seat amends the file surface. ## Verification (head `ee5da23123`) - `pnpm turbo run test --only --continue` on the six packages: metadata-core 19/19 files, platform-objects 88/88, plugin-security 212/212, plugin-approvals 94/94, service-messaging 60/60, objectql 465/465 (lock VERDICT command-exit 0). A first run went red in two `platform-objects` translation-decision tests that read `sys_user.fields.ai_access.help` as evidence for the capability wording; fixed by keeping the capability in that help. - `pnpm turbo run typecheck --only` on the six packages: 6/6 (VERDICT command-exit 0). - `node scripts/check-i18n-bundles.mjs`: all ten packages in sync. - `dispatch-gates --commands`: 71 families, 70 exit 0, 1 NOT MEASURED (`check:dual-build-cjs-loads` exit 3, PREREQUISITE NOT MET: this worktree has no full workspace build). `--ran` reconciles 71/71. CI runs the rest of the farm. - No ablation: the change is copy and a declared flag; each new vocabulary entry carries a positive-control assertion that it matches the old string. ## Acceptance notes - `better-auth` still appears in 34 `platform-objects` `en` field-help leaves (for example "Managed by better-auth"), and a few helps name code identifiers (`resolveCtx`-style names, `sys_business_unit_member.is_primary`, `sys_file.name`). They are outside this card's list and on surfaces the pass did not report; noted, not filed. Carrier: none. - `[ADR-0086 D3]` from the card has 0 hits in any object or metadata-forms bundle on `origin/main`. It survives in `packages/spec` schema `.describe()` text (`security/capabilities.ts` `packageId`, `permission.zod.ts` `packageId`). Whether the Capabilities detail page the tester saw renders that `.describe()` text is NOT MEASURED here (no running console); if it does, the fix is in `packages/spec`, outside this card's surface. - `sys_approval_delegation.organization_id` help is untouched (#25280 owns it). - #25332 regenerates the same `platform-objects` bundles; whichever lands second merges `main` and re-runs the generator. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01RsXNmkeex9WY5XsjNwtRYv --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent c898bd8 commit ee63b47

37 files changed

Lines changed: 292 additions & 148 deletions
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
'@objectstack/platform-objects': patch
3+
'@objectstack/metadata-core': patch
4+
'@objectstack/plugin-security': patch
5+
'@objectstack/plugin-approvals': patch
6+
'@objectstack/service-messaging': patch
7+
'@objectstack/objectql': patch
8+
---
9+
10+
fix: Setup field help is written for administrators, and the two access-review fields nothing uses yet are hidden from the Setup forms
11+
12+
Clause-②: no
13+
Metadata-protocol: none
14+
15+
A Setup pass met field help written for the platform's developers: "Foreign key to sys_user.id", "NULL only on a grant written before the column existed", "via isGrantActive", "(P3 digest middleware)", "Owned by objectql (better-auth is oblivious to this column)", "LifecycleService (Reaper / Rotator / Archiver)" and ADR numbers. Each now says what the field means and what to do with it, in every shipped locale (`en` regenerated from the source; `zh-CN`, `ja-JP` and `es-ES` translated):
16+
17+
- the user, OAuth application, session and refresh-token fields of the permission-set and position assignments and of the OAuth token, consent and client-resource objects, and the package-version field of stored metadata;
18+
- the permission set picked on an assignment;
19+
- the start time of an approval delegation;
20+
- the digest cadence and quiet hours of a notification preference, which now say how each value behaves;
21+
- the AI Access and Locale fields of a user;
22+
- the Data Lifecycle settings page and its retention overrides.
23+
24+
`Last Certified At` and `Certified By` on `sys_user_permission_set` and `sys_user_position` are reserved for a future access-review feature and nothing writes or reads them. They are now `hidden: true`, so the Setup forms and detail pages no longer show them. The columns and any stored values stay.

‎packages/metadata-core/src/objects/sys-metadata.object.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const SysMetadataObject = ObjectSchema.create({
7777
label: 'Package Version',
7878
required: false,
7979
description:
80-
'Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override.',
80+
'The package release this metadata was installed from. Empty for built-in platform metadata and for changes made in this environment.',
8181
}),
8282

8383
/** Who manages this record: package, platform, or user */
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
2+
3+
/**
4+
* The Data Lifecycle settings page is administrator copy.
5+
*
6+
* Setup renders the manifest's `description` under the page title and each
7+
* specifier's `label` / `description` beside its control. An ADR number, a
8+
* section reference or the name of an internal component tells that reader
9+
* nothing they can act on: the reference belongs in the docblock next to the
10+
* manifest, never in the string.
11+
*/
12+
13+
import { describe, expect, it } from 'vitest';
14+
import { lifecycleSettingsManifest } from './lifecycle-settings.js';
15+
16+
const DESIGN_RECORD_VOCABULARY: ReadonlyArray<readonly [string, RegExp]> = [
17+
['an ADR number', /ADR-\d/],
18+
['a section reference', /§\s?\d/],
19+
['an internal component', /\bLifecycleService\b|\bReaper\b|\bRotator\b|\bArchiver\b/],
20+
];
21+
22+
function vocabularyIn(text: string): string[] {
23+
return DESIGN_RECORD_VOCABULARY.filter(([, re]) => re.test(text)).map(([name]) => name);
24+
}
25+
26+
type Copy = { label?: string; description?: string; key?: string };
27+
28+
describe('lifecycle settings: admin-facing copy carries no design-record vocabulary', () => {
29+
it('the matcher recognises each kind of vocabulary it exists to keep out', () => {
30+
expect(vocabularyIn('Governance for ADR-0057 data lifecycle enforcement.')).toEqual(['an ADR number']);
31+
expect(vocabularyIn('A regulated tenant sets years (§3.2).')).toEqual(['a section reference']);
32+
expect(vocabularyIn('Growth alerts for the LifecycleService (Reaper / Rotator / Archiver).')).toEqual(['an internal component']);
33+
expect(vocabularyIn('How long system data is kept.')).toEqual([]);
34+
});
35+
36+
it('the page description and every specifier label and description', () => {
37+
const manifest = lifecycleSettingsManifest as unknown as Copy & { specifiers: Copy[] };
38+
const strings: Array<[string, string]> = [];
39+
for (const [at, item] of [['lifecycle', manifest] as const, ...manifest.specifiers.map((s) => [`lifecycle.${s.key}`, s] as const)]) {
40+
if (typeof item.label === 'string') strings.push([`${at}.label`, item.label]);
41+
if (typeof item.description === 'string') strings.push([`${at}.description`, item.description]);
42+
}
43+
// Positive control: the walk reaches the page sentence and the retention override help.
44+
expect(strings.map(([at]) => at)).toEqual(expect.arrayContaining(['lifecycle.description', 'lifecycle.retention_overrides.description']));
45+
const offenders = strings.filter(([, text]) => vocabularyIn(text).length > 0).map(([at, text]) => `${at}: ${text}`);
46+
expect(offenders).toEqual([]);
47+
});
48+
});

‎packages/objectql/src/lifecycle/lifecycle-settings.ts‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ export const lifecycleSettingsManifest = {
1717
label: 'Data Lifecycle',
1818
icon: 'Timer',
1919
description:
20-
'Governance for ADR-0057 data lifecycle enforcement: retention window ' +
21-
'overrides, per-table row quotas, and growth alerts for the platform ' +
22-
'LifecycleService (Reaper / Rotator / Archiver).',
20+
'How long system data is kept: override retention windows, cap row counts ' +
21+
'per table, and get alerted when a table grows unexpectedly. The platform ' +
22+
'applies these on its periodic cleanup sweep.',
2323
scope: 'global',
2424
readPermission: 'manage_platform_settings',
2525
writePermission: 'manage_platform_settings',
@@ -44,9 +44,9 @@ export const lifecycleSettingsManifest = {
4444
default: {},
4545
description:
4646
'Per-object window overrides: { "<object>": { "maxAge": "1y", "expireAfter": "30d" } }. ' +
47-
'Duration literals: h/d/w/y. Tenant-scoped — a regulated tenant sets years while dev keeps days (ADR-0057 §3.2). ' +
48-
'An override BELOW a retention floor a consumer registered (e.g. the job queue\'s dedup window) is rejected at ' +
49-
'sweep time and logged at error — the declared window keeps running.',
47+
'Durations use h/d/w/y. Set per organization, so a regulated organization can keep years while a development one keeps days. ' +
48+
'An override shorter than the minimum a platform feature needs (for example the job queue\'s duplicate-detection window) ' +
49+
'is ignored and logged as an error, and the default window keeps applying.',
5050
},
5151
{
5252
type: 'json',

‎packages/platform-objects/src/apps/setup-copy-vocabulary.test.ts‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ const DESIGN_RECORD_VOCABULARY: ReadonlyArray<readonly [string, RegExp]> = [
6161
['a review-finding id', /finding F/],
6262
['an API call', /\bemit\(\)/],
6363
['a runtime internal', /\bkernel\b/i],
64+
// The developer notes a Setup pass met in field help: a column reference,
65+
// a function name, an internal component, a storage-history note and an
66+
// inert-column notice. What the field means and what to do with it is the
67+
// help; where it is stored and which code reads it is the comment.
68+
['a foreign-key note', /\bforeign key to\b/i],
69+
['a function name', /\bisGrantActive\b/],
70+
['an internal component', /\bmiddleware\b|\bbetter-auth is oblivious\b|\bReaper\b/i],
71+
['a column-history note', /\bNULL only on\b/],
72+
['an inert-column notice', /\bInert today\b/i],
6473
];
6574

6675
function vocabularyIn(text: string): string[] {
@@ -133,6 +142,11 @@ describe('Setup copy carries no design-record vocabulary', () => {
133142
expect(vocabularyIn('Bypass rule (finding F2).')).toEqual(['a review-finding id']);
134143
expect(vocabularyIn('One row per emit().')).toEqual(['an API call']);
135144
expect(vocabularyIn('The Kernel API is additive.')).toEqual(['a runtime internal']);
145+
expect(vocabularyIn('Foreign key to sys_user.id')).toEqual(['a foreign-key note']);
146+
expect(vocabularyIn('Enforced at resolution time via isGrantActive.')).toEqual(['a function name']);
147+
expect(vocabularyIn('Batch cadence (P3 digest middleware).')).toEqual(['an internal component']);
148+
expect(vocabularyIn('NULL only on a grant written before the column existed.')).toEqual(['a column-history note']);
149+
expect(vocabularyIn('Inert today: nothing reads it.')).toEqual(['an inert-column notice']);
136150
expect(vocabularyIn('Your company structure, used to scope data and reports.')).toEqual([]);
137151
});
138152

‎packages/platform-objects/src/apps/translations/en.objects.generated.ts‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
8686
},
8787
ai_access: {
8888
label: "AI Access",
89-
help: "Whether this user holds an AI seat — grants access to the in-UI AI agents (build / ask). The framework synthesizes the `ai_seat` capability from this flag (plugin-hono-server resolveCtx). Assignment is capped by the licensed / purchased seat count (enforced by @objectstack/security-enterprise AiSeatPlugin). Owned by objectql (better-auth is oblivious to this column)."
89+
help: "Whether this user holds an AI seat. A seat grants the `ai_seat` capability, which opens the AI assistants in the app (build and ask). How many users can hold one is limited by the seats your license includes."
9090
},
9191
image: {
9292
label: "Profile Image"
9393
},
9494
locale: {
9595
label: "Locale",
96-
help: "Preferred language for notifications, as a BCP-47 tag (e.g. zh-CN, ja-JP). Read per recipient at delivery time; when unset the deployment default applies. Owned by objectql (better-auth is oblivious to this column)."
96+
help: "Preferred language for this user's notifications, as a language tag such as zh-CN or ja-JP. When unset, the deployment's default language applies."
9797
},
9898
manager_id: {
9999
label: "Manager",
@@ -1588,19 +1588,19 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
15881588
},
15891589
client_id: {
15901590
label: "Client ID",
1591-
help: "Foreign key to sys_oauth_application.client_id"
1591+
help: "The client ID of the OAuth application this token was issued to."
15921592
},
15931593
session_id: {
15941594
label: "Session",
1595-
help: "Foreign key to sys_session.id"
1595+
help: "The sign-in session this token was issued in."
15961596
},
15971597
user_id: {
15981598
label: "User",
1599-
help: "Foreign key to sys_user.id"
1599+
help: "The user this token acts for."
16001600
},
16011601
refresh_id: {
16021602
label: "Refresh Token",
1603-
help: "Foreign key to sys_oauth_refresh_token.id"
1603+
help: "The refresh token this access token was issued from."
16041604
},
16051605
reference_id: {
16061606
label: "Reference ID",
@@ -1652,15 +1652,15 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
16521652
},
16531653
client_id: {
16541654
label: "Client ID",
1655-
help: "Foreign key to sys_oauth_application.client_id"
1655+
help: "The client ID of the OAuth application this token was issued to."
16561656
},
16571657
session_id: {
16581658
label: "Session",
1659-
help: "Foreign key to sys_session.id"
1659+
help: "The sign-in session this token was issued in."
16601660
},
16611661
user_id: {
16621662
label: "User",
1663-
help: "Foreign key to sys_user.id"
1663+
help: "The user this token acts for."
16641664
},
16651665
reference_id: {
16661666
label: "Reference ID",
@@ -1724,11 +1724,11 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
17241724
},
17251725
client_id: {
17261726
label: "Client ID",
1727-
help: "Foreign key to sys_oauth_application.client_id"
1727+
help: "The client ID of the OAuth application the user consented to."
17281728
},
17291729
user_id: {
17301730
label: "User",
1731-
help: "Foreign key to sys_user.id"
1731+
help: "The user who gave this consent."
17321732
},
17331733
reference_id: {
17341734
label: "Reference ID",
@@ -1826,11 +1826,11 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
18261826
},
18271827
client_id: {
18281828
label: "Client ID",
1829-
help: "Foreign key to sys_oauth_application.client_id"
1829+
help: "The client ID of the OAuth application this grant is for."
18301830
},
18311831
resource_id: {
18321832
label: "Resource ID",
1833-
help: "Foreign key to sys_oauth_resource.identifier"
1833+
help: "The identifier of the protected resource the application may request tokens for."
18341834
},
18351835
metadata: {
18361836
label: "Metadata",
@@ -3048,7 +3048,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
30483048
},
30493049
package_version_id: {
30503050
label: "Package Version",
3051-
help: "Foreign key to sys_package_version (UUID). Null = platform-built-in or env-level override."
3051+
help: "The package release this metadata was installed from. Empty for built-in platform metadata and for changes made in this environment."
30523052
},
30533053
managed_by: {
30543054
label: "Managed By",

‎packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
8686
},
8787
ai_access: {
8888
label: "Acceso a IA",
89-
help: "Indica si este usuario dispone de una plaza de IA: otorga acceso a los agentes de IA integrados en la interfaz (build / ask). El framework sintetiza la capacidad `ai_seat` a partir de este indicador (plugin-hono-server resolveCtx). La asignación está limitada por el número de plazas licenciadas o compradas (aplicado por AiSeatPlugin de @objectstack/security-enterprise). Propiedad de objectql (better-auth ignora esta columna)."
89+
help: "Indica si este usuario dispone de una plaza de IA. La plaza otorga la capacidad `ai_seat`, que da acceso a los asistentes de IA de la aplicación (build y ask). El número de usuarios que pueden tenerla está limitado por las plazas que incluye su licencia."
9090
},
9191
image: {
9292
label: "Imagen de perfil"
9393
},
9494
locale: {
9595
label: "Idioma",
96-
help: "Idioma preferido para las notificaciones, como etiqueta BCP-47 (p. ej. zh-CN, ja-JP). Se lee por destinatario en el momento de la entrega; si no está definido, se aplica el idioma predeterminado del despliegue. Propiedad de objectql (better-auth ignora esta columna)."
96+
help: "Idioma preferido para las notificaciones de este usuario, como una etiqueta de idioma, por ejemplo zh-CN o ja-JP. Si no se define, se aplica el idioma predeterminado del despliegue."
9797
},
9898
manager_id: {
9999
label: "Gerente",
@@ -1588,19 +1588,19 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
15881588
},
15891589
client_id: {
15901590
label: "ID de cliente",
1591-
help: "Clave foránea a sys_oauth_application.client_id."
1591+
help: "El ID de cliente de la aplicación OAuth a la que se emitió este token."
15921592
},
15931593
session_id: {
15941594
label: "Sesión",
1595-
help: "Clave foránea a sys_session.id."
1595+
help: "La sesión de inicio de sesión en la que se emitió este token."
15961596
},
15971597
user_id: {
15981598
label: "Usuario",
1599-
help: "Clave foránea a sys_user.id."
1599+
help: "El usuario en cuyo nombre actúa este token."
16001600
},
16011601
refresh_id: {
16021602
label: "Token de actualización",
1603-
help: "Clave foránea a sys_oauth_refresh_token.id."
1603+
help: "El token de actualización a partir del cual se emitió este token de acceso."
16041604
},
16051605
reference_id: {
16061606
label: "ID de referencia",
@@ -1652,15 +1652,15 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
16521652
},
16531653
client_id: {
16541654
label: "ID de cliente",
1655-
help: "Clave foránea a sys_oauth_application.client_id."
1655+
help: "El ID de cliente de la aplicación OAuth a la que se emitió este token."
16561656
},
16571657
session_id: {
16581658
label: "Sesión",
1659-
help: "Clave foránea a sys_session.id."
1659+
help: "La sesión de inicio de sesión en la que se emitió este token."
16601660
},
16611661
user_id: {
16621662
label: "Usuario",
1663-
help: "Clave foránea a sys_user.id."
1663+
help: "El usuario en cuyo nombre actúa este token."
16641664
},
16651665
reference_id: {
16661666
label: "ID de referencia",
@@ -1724,11 +1724,11 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
17241724
},
17251725
client_id: {
17261726
label: "ID de cliente",
1727-
help: "Clave foránea a sys_oauth_application.client_id."
1727+
help: "El ID de cliente de la aplicación OAuth a la que el usuario dio su consentimiento."
17281728
},
17291729
user_id: {
17301730
label: "Usuario",
1731-
help: "Clave foránea a sys_user.id."
1731+
help: "El usuario que dio este consentimiento."
17321732
},
17331733
reference_id: {
17341734
label: "ID de referencia",
@@ -1826,11 +1826,11 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
18261826
},
18271827
client_id: {
18281828
label: "ID de cliente",
1829-
help: "Clave foránea a sys_oauth_application.client_id."
1829+
help: "El ID de cliente de la aplicación OAuth a la que corresponde esta concesión."
18301830
},
18311831
resource_id: {
18321832
label: "ID del recurso",
1833-
help: "Clave foránea a sys_oauth_resource.identifier."
1833+
help: "El identificador del recurso protegido para el que la aplicación puede solicitar tokens."
18341834
},
18351835
metadata: {
18361836
label: "Metadatos",
@@ -3048,7 +3048,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
30483048
},
30493049
package_version_id: {
30503050
label: "Versión del paquete",
3051-
help: "Clave foránea a sys_package_version (UUID). Null = incorporado en la plataforma o sobrescritura a nivel de entorno."
3051+
help: "La versión del paquete desde la que se instaló estos metadatos. Vacío para los metadatos integrados en la plataforma y para los cambios hechos en este entorno."
30523052
},
30533053
managed_by: {
30543054
label: "Gestionado por",

0 commit comments

Comments
 (0)