Skip to content

Commit 672abe3

Browse files
committed
fix(qa): keep tracker ids out of the ledger's runtime strings
`check:doc-authoring` caught two ids I had put in string prose rather than in an adjacent comment: one in the new `cel-select-option-visible` enforcement and one in the `cron-declared-unwired` note. A runtime string reaches authors and operators who cannot resolve `#NNNN`; the reader who can resolve it reads the source. The ids move to comments, and the note now says what changed rather than which card changed it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D47qPfEWVPmhguWgBZCi5N
1 parent 1cc7895 commit 672abe3

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

packages/qa/dogfood/test/expression-conformance.ledger.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ export const EXPRESSION_SURFACE: ExprSurface[] = [
156156
// the action-param side (`cel-action-param-option-visible`, "a SEPARATE row
157157
// from `cel-ui` because the evaluator differs"); the field side never got
158158
// it, because discovery could not hand the ratchet a second key to be
159-
// unclassified about.
159+
// unclassified about. The server-side enforcement itself is objectui#2284.
160160
id: 'cel-select-option-visible',
161161
summary: 'choice-field per-option gating (SelectOption.visibleWhen) — the one visibility predicate the SERVER also enforces',
162162
dialect: 'cel', mode: 'interpret', state: 'enforced', failPolicy: 'fail-soft-log',
163163
enforcement:
164-
'objectql/src/validation/rule-validator.ts per-option enforcement (objectui#2284) → `ExpressionEngine.evaluate` against the merged `record` + `previous` + `current_user`, re-evaluated ON WRITE for the PICKED value(s) of a written select/multiselect/radio/checkboxes field: a clean FALSE pushes an `invalid_option` field error and the write is refused. Unchanged persisted values are left alone. A predicate that cannot be evaluated (missing referenced field, or an unbound `current_user` on a system write) is FAIL-OPEN — logged with the reason and allowed through — so a broken cascade predicate never bricks a write, and authorization gating depends on the engine binding `current_user`. The console evaluates the same predicate to hide the option, which is UX only: a caller can still submit a hidden value, which is why the server re-checks',
164+
'objectql/src/validation/rule-validator.ts per-option enforcement → `ExpressionEngine.evaluate` against the merged `record` + `previous` + `current_user`, re-evaluated ON WRITE for the PICKED value(s) of a written select/multiselect/radio/checkboxes field: a clean FALSE pushes an `invalid_option` field error and the write is refused. Unchanged persisted values are left alone. A predicate that cannot be evaluated (missing referenced field, or an unbound `current_user` on a system write) is FAIL-OPEN — logged with the reason and allowed through — so a broken cascade predicate never bricks a write, and authorization gating depends on the engine binding `current_user`. The console evaluates the same predicate to hide the option, which is UX only: a caller can still submit a hidden value, which is why the server re-checks',
165165
covers: ['data/field.zod.ts:SelectOptionSchema.visibleWhen'],
166166
proof: 'packages/objectql/src/validation/rule-validator.option-visibility.test.ts',
167167
},
@@ -367,7 +367,7 @@ export const EXPRESSION_SURFACE: ExprSurface[] = [
367367
'system/cache.zod.ts:CacheWarmupSchema.schedule',
368368
'system/disaster-recovery.zod.ts:BackupConfigSchema.schedule', 'system/disaster-recovery.zod.ts:DisasterRecoveryPlanSchema.schedule',
369369
],
370-
note: 'EXPERIMENTAL — five declared cron slots with no runtime evaluator (ADR-0049 enforce-or-remove candidates; each wants its own look, and the card that surfaced them says so rather than proposing a sweep). ⚠️ TWO of these surfaces are declared TWICE: `api/export.zod.ts` `cronExpression` on `ScheduledExportSchema` and on `ScheduleExportRequestSchema`, and `system/disaster-recovery.zod.ts` `schedule` on `BackupConfigSchema` and on `DisasterRecoveryPlanSchema` (the DR `testing` block). Both pairs are genuinely the same surface twice, so one row is honest here — and since #15500 each position carries its OWN key, so that judgement is now written out as two `covers` entries instead of being assumed by a collapse. ⚠️ The `failPolicy` on this row is `compile-error` because the PARSE is the only thing that ever refuses one of these values; it is not a claim that cron SYNTAX is checked. It is not: `@objectstack/formula` cronEngine validates 5/6-field patterns and `@` aliases, and has ZERO consumers outside packages/formula — nothing routes these slots through it. And per the sibling finding on the dialect union, the envelope arm of `CronExpressionInputSchema` accepts any declared dialect, so even the parse does not pin these to `cron`.',
370+
note: 'EXPERIMENTAL — five declared cron slots with no runtime evaluator (ADR-0049 enforce-or-remove candidates; each wants its own look, and the card that surfaced them says so rather than proposing a sweep). ⚠️ TWO of these surfaces are declared TWICE: `api/export.zod.ts` `cronExpression` on `ScheduledExportSchema` and on `ScheduleExportRequestSchema`, and `system/disaster-recovery.zod.ts` `schedule` on `BackupConfigSchema` and on `DisasterRecoveryPlanSchema` (the DR `testing` block). Both pairs are genuinely the same surface twice, so one row is honest here — and now that each declaring position carries its OWN key, that judgement is written out as two `covers` entries instead of being assumed by a collapse. ⚠️ The `failPolicy` on this row is `compile-error` because the PARSE is the only thing that ever refuses one of these values; it is not a claim that cron SYNTAX is checked. It is not: `@objectstack/formula` cronEngine validates 5/6-field patterns and `@` aliases, and has ZERO consumers outside packages/formula — nothing routes these slots through it. And per the sibling finding on the dialect union, the envelope arm of `CronExpressionInputSchema` accepts any declared dialect, so even the parse does not pin these to `cron`.',
371371
},
372372

373373
// ── TEMPLATE dialect (#15027) ─────────────────────────────────────────────

0 commit comments

Comments
 (0)