Repository navigation
fix(spec): the liveness ledger grades field.settledWhen live - #26918
Conversation
The row said no reader existed, while ui/'s isDeadlineSettled has been asked by every surface that draws a date cell since objectui#11815 landed. Flip the row to live with its readers and producers, refresh the dueLike note's stale PARTIAL clause, regenerate the field state counts, and re-state the expression-conformance row as enforced / fail-soft-log. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGufzgGEj5Qdn1KEGPUrU8
📓 Docs Drift Check
What this run could not see
Coarse fallback — 147 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: Inputs read: card #26727 (body, the triage grade, the claim, the os-dev report), PR #26918 (body, its 5-file list), the net diff Check-runs on the head, read 2026-10-27T21:14Z: 38 total. 12 success, 6 skipped, 0 failed, 20 still in progress.
① Derived judgmentsThe diff changes no Zod schema, no
② Semver level
③ Boundary flags
Should-fix
Must-fix: none. Implemented-by: VERDICT: PASS |
isDeadlineSettled passes no warnOnError, so evalRowPredicate hands the predicate to evalFieldPredicate, and a fault is warned by warnPredicateFailure, not warnEvalError. Spell the chain through evalFieldPredicate in the cel-field-deadline-settled enforcement cell. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGufzgGEj5Qdn1KEGPUrU8
席位核对 · ACCEPT ·
|
Requested by Yibo Wang · project thread
Fixes #26727
What changes
packages/spec/liveness/field.json›settledWhen:planned→live,verifiedAt2026-10-27,evidenceScopecross-repo→in-repo(the renderer isui/since tooling(ui-merge): governance in-repo — liveness evidence and spec tests stop citing objectui by commit, one sdui-parser, AGENTS.md / pm scripts dropobjectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712). Evidence:ui/packages/core/src/evaluator/deadlineSettled.ts#isDeadlineSettled(the one host helper),ui/packages/fields/src/index.tsx#resolveDueLike(the date and datetime cells drop overdue wording and colour on a settled verdict),ui/packages/plugin-grid/src/objectGridGenerateColumns.tsx#useObjectGridGenerateColumns,ui/packages/app-shell/src/views/approval-decision/RecordSnapshotSummary.tsx#FieldFace. Newproducer: the grid's three column paths andplugin-detailENRICHED_FIELD_METADATA_KEYScopy the key onto cell metadata;objectGridRowLoad.ts#useObjectGridRowLoadandListView.tsx#ListViewfetch the predicate's operands. The note names the other hosts that ask the same helper (DetailSection, HeaderHighlight, RelatedList, ObjectKanban, ObjectGallery, ListViewCompact, ObjectTree), each pinned by its owndeadlineSettled-11815test. The row had noauthorWarn/authorHint, so none is dropped.dueLikenote: its "PARTIAL until objectui#11815 lands" clause was false (the grid copies the key on all three column paths, andDUE_LIKE_FIELD_NAMEis gone). Note only; the status was alreadylive.packages/spec/liveness/state-counts/field.md: regenerated bygen:liveness-counts.packages/spec/liveness/README.md: one sentence on thefieldrow recording the flip and its counts.packages/qa/dogfood/test/expression-conformance.ledger.ts›cel-field-deadline-settled:experimental/unevaluated("NO EVALUATOR FOUND … objectui @55e90fd has nosettledWhenread") →enforced/fail-soft-log, enforcement namingisDeadlineSettled → evalRowPredicate → evalFieldPredicate → celEngine. A faulting predicate is warned once per predicate text (warnPredicateFailure, viaevalFieldPredicate, sinceisDeadlineSettledpasses nowarnOnError) and answers not settled, which is thecel-field-ruletier..changeset/26727-settled-when-ledger-live.md:@objectstack/specpatch (theliveness/folder ships in the spec tarball).object.tenancyis already right on main, and this PR leaves it alone. The QA's "notenancyrow" reading is not true at 2720874:object.jsonhas atenancycontainer with two children, bothliveand both checked at this head.enabled:isTenancyDisabled(object.zod.ts) is called byinjected-system-columns.ts#resolveInjectedSystemColumns(withholdsorganization_id),sql-driver.ts#computeTenantField(no driver org scope) andsecurity-plugin.ts#getObjectSecurityMeta(tenancyDisabledposture).tenantField:computeTenantFieldhonours a declared column that exists on the object. Like the other container rows here (enable), the container itself carries no status.Moved counts:
state-counts/field.mdfieldrow: live 99 → 100, planned 6 → 5 (106 classified, unchanged). It counts thefieldledger rows by verdict, and one row moved verdict.check:livenessproducer census: live rows citing a producer reads 152 at this head. ThesettledWhenrow is the only row that gained aproducer, so main reads 151; that is inferred from the diff, not run on main. This count is not pinned; the gate only reports it.unevaluatedpin judges eachunevaluatedrow's cell, and this row has left that set.No
.describe()change: thesettledWhen/dueLikedescribe strings never said planned. Thecontent/docs/data-modeling/fields.mdxdeadline section already describes the live behaviour.Why
The ledger tells authors and agents whether a key does anything. A
plannedgrade on a key the console reads makes an agent treat it as inert. Re-measured on main 2720874, after the QA's 3fcafcd.Verification
Clause-②: no
Metadata-protocol: none
Keep one value on each of the two lines above, each line starting with its key.
Human Minimum
item 5 says what they mean.
Tests and gates, run on head 1e5831a:
pnpm --filter @objectstack/spec check:liveness: exit 0 (aftergen:liveness-counts; before it, the gate reportedfield.mdstale with exactly the 99/6 → 100/5 move above).check:empty-state: exit 0.vitest run scripts/liveness: 12 files, 358 tests passed. lintlint-liveness-properties.test.ts: 110 passed.expression-conformance.test.ts: 8 passed (with@objectstack/verifybuilt).dispatch-gates --commands: 59 commands. 58 exit 0, includingcheck:generated,check:doc-authoring,check-adr-0087-registration --base origin/mainandcheck:published-files.check:dual-build-cjs-loadsexits 3: it needs a full repo build, so nothing was measured. That is not a finding.Human Minimum
Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.
packages/specholds no runtime logic.pnpm lintpasses. (No formatter ran.pnpm lintwas not run locally: the diff is JSON, Markdown and one string-literal row, so CI's lint decides.)main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code