Repository navigation
spec(data): a date or datetime field declares its deadline semantic — dueLike with settledWhen (per-record CEL), so overdue wording and colour derive from one declaration and the name-pattern guess retires (objectui#11815 ruled D) #22227
Description
Activity
- addedenhancementNew feature or requestNew feature or requestarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, search
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsSerial note ·
domain:specseat 2 (#18549) ·os-sales· sessionsession_01DhTqaEHqPVSVnAkjG3jywn· 2026-10-08T16:42Z. ⛔ Not a claim; the card stayspm:queue.Not dispatched this round: it waits for open PR #22268 (#22157,
domain:specseat 1). ThesettledWhenpredicate joins the field-rule CEL family whose authoring gate ispackages/lint/src/validate-expressions.ts, and PR #22268 edits that file's field-rule pass (the per-optionvisibleWhen). Both cards arearea:records, so they run one at a time.Known pitfalls for the claimant, read at this stamp:
- spec(ui): field-level conditionalFormatting — a field declares
[{ condition, style }]cell rules (CEL overvalueandrecord), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228 (fieldconditionalFormatting) also adds a key topackages/spec/src/data/field.zod.ts. It runs after this card, one at a time, as the seat post's serial queue says. - date cells: a due-like date on a completed record still renders red "Overdue Nd" (Done tasks flagged overdue) objectui#11815 is
Blocked-by:this card; the landing comment releases it. - A new optional key is a widening (
Clause-②: yes): the contract review atCONTRACT_REVIEW_TIERis owed. A D2 conversion applies only if the measurement finds a legacy spelling to convert (for example objectui's view-leveldueLike). Measure that; don't assume it.
Generated by Claude Code
- spec(ui): field-level conditionalFormatting — a field declares
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsSerial note ·
domain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T09:22Z. ⛔ Not a claim; the card stayspm:queue.The blocker named in
6064648660, PR #22268, has merged. Not dispatched this round for a new one: it waits for PR #22436 (#22402,domain:engine,area:records, ready) to land. That PR editspackages/spec/src/data/field.zod.tsandpackages/lint/src/validate-expressions.ts, the two filesdueLike/settledWhenland in, and thearea:recordsaxis carries one card in flight at a time when file surfaces intersect. Read at 2026-10-09T09:10Z over all 15 open PRs' file lists; PRs #22425 and #22315 also touchvalidate-expressions.ts.Known pitfalls for the claimant, beyond
6064648660's:- Read the field-rule CEL family's authoring gate where PR fix(objectql)!: a faulting option visibleWhen refuses the write instead of admitting it (#22402) #22436 leaves it (a faulting option
visibleWhenrefuses the write). - spec(ui): field-level conditionalFormatting — a field declares
[{ condition, style }]cell rules (CEL overvalueandrecord), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228 follows this card on the same file, one at a time.
- Read the field-rule CEL family's authoring gate where PR fix(objectql)!: a faulting option visibleWhen refuses the write instead of admitting it (#22402) #22436 leaves it (a faulting option
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round 3 (#22227:
dueLikeandsettledWhenon the date and datetime field definitions, the protocol half of objectui#11815's ruling D) · 2026-10-09T12:46Z
Session:session_01VZqqwTj2wsihZEbfT6yyYN
Account:os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22227-date-due-like
Worktree:objectstack-issue-22227
Domain:domain:spec
Seat:domain:spec#1
File surface (atorigin/maindee7692f0b; stop on breach and explain in the report):packages/spec/src/data/field.zod.tsand its tests; the field-rule CEL authoring gate inpackages/lint/src/validate-expressions.tsand its tests; the generated baselines and forms; the docs page that teachesvisibleWhen;examples/app-todotask,examples/app-crmactivityand the showcase task object where the semantic is real; an ADR-0087 entry only if the measurement finds a legacy spelling to convert; one.changeset/22227-*.md.
Container & model:M,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate). A widening: built at the default tier, and the contract review atCONTRACT_REVIEW_TIERis owed before enqueue.
Clause-②: yes
Responsibility:n/a — not a defect card (a maintainer-directed task, objectui#11815 ruling D)
Thread-read: 6078122937
Serial constraints cleared: PR #22436 (#22402), the blocker named in6078122937, merged as440bed63e7; PR #22425 merged as9af0005d55. No open PR touchesfield.zod.tsorvalidate-expressions.ts(all 11 open PRs' file lists, read 2026-10-09T12:40Z).area:records: no other card in flight shares this surface. #22228 follows this card onfield.zod.ts. A step-18 entry, if any, re-syncs after PR #22215 lands, throughscripts/pm/os-regen-merge.sh.objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22227,
"status": "done",
"branch": "claude/issue-22227-date-due-like",
"pr": "#22503",
"session": "session_01VZqqwTj2wsihZEbfT6yyYN (the claim 6081172569 session; this subagent runs under it)",
"premise_still_valid": true,
"summary": "FieldSchema now declares the deadline semantic on date and datetime fields. dueLike is an optional boolean with no default. settledWhen is an optional EvaluatedExpressionInputSchema: a per-record CEL predicate in the visibleWhen family. Both are refused off DEADLINE_FIELD_TYPES (date, datetime), and settledWhen is refused unless dueLike: true; this is a superRefine over a type set, the maxLength/valueDomain/rows idiom. The lint field-rule pass (validate-expressions.ts) judges settledWhen exactly as it judges visibleWhen: it must parse, read record.FIELD and not a bare field, name a declared field, and read only FIELD_RULE_BOUND_ROOTS. That pass runs at os build, os validate and the object save door. The field form offers both keys, settledWhen only once the field is a deadline. The docs page fields.mdx teaches them. The showcase task, todo task and crm activity declare dueLike plus settledWhen, settled on their measured status values done, completed and completed. Mechanism hypotheses: H1 held, with no conversion. Zero spec-validated sources spell dueLike, ListColumnSchema refuses it with unrecognized_keys, and the widening needs no ADR-0087 disposition (check-adr-0087-registration judges breaking declarations only). H2 measured: the bound roots are record, previous and parent; today() is a stdlib function and applies; value is a bare reference and is refused; no new scope name was added. H3 held: superRefine over a set. H4 measured as above. Nine files outside the claim's declared surface were touched. Each is a classification ratchet that a new FieldSchema key or CEL slot turns red, and no open PR touches any of them (deviations). CI on head a520b4e was in_progress at report time: 9 check runs completed, 23 in progress.",
"mechanism_hypotheses": {
"H1": "Held, with no conversion. git grep dueLike|settledWhen at dee7692: 3 hits, all CHANGELOG.md prose (console, platform-objects, spec), no source. ListColumnSchema.safeParse({field:'due_date', dueLike:true}) gives unrecognized_keys [dueLike]; the control {field:'due_date'} parses. No ADR-0087 entry. The changeset is a widening, and check-adr-0087-registration exits 0 (breakingDeclaration: 'widening adds NO signal').",
"H2": "Measured. The field-rule family's bound roots are FIELD_RULE_BOUND_ROOTS = record, previous, parent. today() is a stdlib function present in every CEL env, not a scope name, and passes. value is not in SCOPE_ROOTS, reads as a bare reference, and is refused. current_user gets the family's root verdict naming settledWhen. All are pinned in validate-expressions.test.ts. The server-side gates (the parent gate, the null guard, the traversal refusal) stay off settledWhen, as they are off visibleWhen.",
"H3": "Held. field.zod.ts scopes a type-specific key with a superRefine over a ReadonlySet of types (BOUNDED_STRING / VALUE_DOMAIN / MULTILINE_EDITOR), not with a discriminated variant. DEADLINE_FIELD_TYPES follows that idiom: dueLike on text is a custom issue at [dueLike].",
"H4": "Measured. showcase_task status has done, so the predicate is record.status == 'done'. todo_task has completed, which also matches the app's documented overdue definition. crm_activity has completed. crm_activity also has cancelled, and app-todo has deferred; see open_questions."
},
"tests": "All test runs went through os-verify-lock. spec local: 631 files, 18824 passed. spec repo: 54/915. lint: 130/5956. metadata-core: 17/421. objectql local: 390/7698. cli unit: 274/4037 (the integration tier is declared to CI; no spawn entry is touched). example-crm 5/45, example-todo 7/238, example-showcase 33/408. dogfood expression-conformance: 7/7. objectstack validate passes for all three examples. All of those ran at 832743b. platform-objects: 68/1078 at a520b4e; at 832743b one test was red (the translated-label control, 665 vs 667), fixed in a520b4e. typecheck is green at a520b4e for spec (check:test-typecheck caught and forced a fix in the new pin), lint, metadata-core, platform-objects, dogfood and the three examples. Ablation: three runs, committed first, mutated through scripts/ablation-replace.mjs. Each anchor hit once, the blob changed, and each restore was proven with blob == HEAD and an empty git diff HEAD. The subjects resolve to src through relative imports, so no dist leg applies. (A) settledWhen dropped from the lint loop: 7 red, 386 green. (B) the dueLike !== true branch set to false: 4 red. (C) the dueLike type refusal set to false: 9 red. Every run turned red, which was the expected direction. Gates: the re-derived dispatch-gates list unioned with the dispatch list is 119 commands, all exit 0 at a520b4e. check:skill-examples and check:dual-build-cjs-loads first answered exit 3 (PREREQUISITE NOT MET, no dist) and passed after a full turbo build. dispatch-gates --ran: 114 derived families, 114 run, 0 NOT-MEASURED, all with an exit code recorded.",
"gates": [
{
"cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-adr-0087-registration.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-ci-filter-parity.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-comment-mask-corpus.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-dev-prereqs.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-doc-frontmatter.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-doc-frontmatter.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-doc-route-spelling.mjs --advisory",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-doc-route-spelling.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-docs-section-name.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-docs-section-name.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-dts-emitted.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-empty-changeset.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-issue-citations.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-registry-log-declared.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-registry-log-declared.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-section-landing-index.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-section-landing-index.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-system-context-census.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-system-context-census.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/docs-audit/check-affected-docs.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/docs-audit/check-drift-comment.mjs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/pm/release-rehearsal-clone.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/release-pending-publish.mjs --self-test",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/lint run check:doc-security-posture",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:api-surface",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:authorable-surface",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:browser-reachable-entries",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:docs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:dual-source-exports",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:duration-unit-keys",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:empty-state",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:entry-nameability",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:export-origins",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:exported-any",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:generated",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:liveness",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:llms-txt",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:migration-registry",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:objectui-pin-citations",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:skill-examples",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:skill-refs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:spec-changes",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:strictness-ledger",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:upgrade-guide",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:variant-docs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:yaml-examples",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:changeset-gate-self-tests",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:corpus-claim-drift",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:cross-package-test-inputs",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:dispatcher-error-vocabulary",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:doc-anchors",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:doc-authoring",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:docs-audit-scope",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:docs-redirects",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:docs-single-h1",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:docs-spec-enumerations",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:docs-transcript-drift",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:driver-memory-census",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:dts-closure",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:dual-build-cjs-loads",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:engine-double-contract",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:error-status-conformance",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:examples-live-imports",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:future-spec-major",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:gitlink-declared",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:i18n",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:i18n-coverage",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:i18n-stale-fill",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:issue-citations",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:lean-entry-closure",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:logger-receiver-detach",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:merge-driver",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:nul-bytes",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:objectql-double-limit",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:objectui-changeset",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:org-identifier",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:page-declaration-shape",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:platform-checklist",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:pm-changeset-deadline-census",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:pm-prior-rulings",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:published-files",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:published-readme-links",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:query-options-erasure",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:quick-reference-counts",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:react-page-adapter-contract",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:refd-timer-probe",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:role-word",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:skill-identifier-liveness",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:slot-lookup",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:sourcemap-no-sources-content",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:spec-parsed-alias",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:test-source-alias",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:tier-file-adoption",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:type-check-coverage",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:type-check-debt",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:vendor-version-stamps",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:watch-hint-literal",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm check:where-matcher",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "bash scripts/pm/os-verify-lock.sh -c 'pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2'",
"exit": 0,
"head": "832743b836",
"verdict": "631 files, 18824 passed, 1 todo"
},
{
"cmd": "bash scripts/pm/os-verify-lock.sh -c 'pnpm --filter @objectstack/spec exec vitest run --project repo --maxWorkers=2'",
"exit": 0,
"head": "832743b836",
"verdict": "54 files, 915 passed"
},
{
"cmd": "pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "130 files, 5956 passed"
},
{
"cmd": "pnpm --filter @objectstack/metadata-core exec vitest run --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "17 files, 421 passed"
},
{
"cmd": "pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "390 files, 7698 passed"
},
{
"cmd": "pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "274 files, 4037 passed"
},
{
"cmd": "pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/expression-conformance.test.ts (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "1 file, 7 passed"
},
{
"cmd": "pnpm --filter @objectstack/example-crm exec vitest run --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "5 files, 45 passed"
},
{
"cmd": "pnpm --filter @objectstack/example-todo exec vitest run --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "7 files, 238 passed"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase exec vitest run --maxWorkers=2 (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "33 files, 408 passed"
},
{
"cmd": "pnpm --filter @objectstack/example-crm validate (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/example-todo validate (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase validate (locked)",
"exit": 0,
"head": "832743b836",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 --passWithNoTests (locked)",
"exit": 0,
"head": "a520b4eea5",
"verdict": "68 files, 1078 passed (was 1 red at 832743b: the translated-label control 665 vs 667, fixed in a520b4e)"
},
{
"cmd": "pnpm --filter @objectstack/spec typecheck (locked)",
"exit": 0,
"head": "a520b4eea5",
"verdict": "tsc + scripts + check:test-typecheck"
},
{
"cmd": "pnpm --filter @objectstack/lint typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/metadata-core typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/platform-objects typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/dogfood typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/example-crm typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/example-todo typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase typecheck (locked)",
"exit": 0,
"head": "a520b4eea5"
},
{
"cmd": "node scripts/pm/dispatch-gates.mjs --ran ran.txt --repo objectstack-ai/objectstack",
"exit": 0,
"head": "a520b4eea5",
"verdict": "114 derived families, 114 run, 0 NOT-MEASURED, all with a recorded exit code"
}
],
"line_budget": {
"additions": 568,
"deletions": 6,
"changed_lines": 574,
"files": 24,
"threshold": "HUMAN_MERGE_LINE_THRESHOLD 3,000 (origin/main e148ca9)",
"verdict": "under"
},
"deviations": [
"Surface extension: 9 files outside the claim's declared surface. Each one is a ratchet that a new FieldSchema key or CEL slot turns red until the key is classified, and the gate that names it is listed here. (1) packages/spec/liveness/field.json, check:liveness UNCLASSIFIED: dueLike is live cross-repo, settledWhen is planned with no authorWarn. (2) packages/spec/liveness/state-counts/field.md, generated by gen:liveness-counts. (3) packages/qa/dogfood/test/expression-conformance.ledger.ts, the expression-conformance ratchet: new row cel-field-deadline-settled, experimental and unevaluated. (4) packages/metadata-core/src/object-schema-fls-references.ts: FIELD_REFERENCE_POSITIONS is pinned against the live FieldSchema shape; dueLike is keep and settledWhen is expression. (5) packages/lint/src/validate-predicate-path-refs.test.ts: shipped-form predicate census 85 to 87. (6) packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts: generator output (committed unedited in bd5da7e) plus six authored leaves; source-hashes are byte-identical to base. (7) packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts: translated-label control 665 to 667. None of these paths is touched by any of the 12 open PRs (file lists read during the build). The dispatch said to stop on a breach. I proceeded because every one is a mechanical classification row and no serial collision exists. This is reported here for the PM to accept or send back.",
"Not merged with origin/main: 11 commits landed after dee7692 and none shares a path with this diff (comm over the two name lists, origin/main e148ca9). The AGENTS.md section-10 pre-PR full suite on a merged tree was not run; CI's merge ref and the queue judge the joint tree.",
"Commits carry the model-free trailer pair (Claude-Session plus Co-authored-by: Claude) that AGENTS.md prescribes, not the harness reminder's model-named Co-Authored-By. The PR body ends with AGENTS.md's session-URL footer, not the harness's emoji footer.",
"Changeset bumps @objectstack/lint minor beside @objectstack/spec minor, because the lint field-rule pass judges a new slot. Clause-②: yes is written identically in the changeset and on PR line 2.",
"objectui pinned evidence was read from the local /home/user/objectui checkout at origin/main 55e90fd and at the .objectui-sha pin f0268ad78. Read only; no objectui write."
],
"files_changed": [
".changeset/22227-field-deadline-due-like.md",
"content/docs/data-modeling/fields.mdx",
"content/docs/references/data/field.mdx",
"content/docs/references/data/object.mdx",
"content/docs/references/system/migration.mdx",
"examples/app-crm/src/objects/activity.object.ts",
"examples/app-showcase/src/data/objects/task.object.ts",
"examples/app-todo/src/objects/task.object.ts",
"packages/lint/src/validate-expressions.test.ts",
"packages/lint/src/validate-expressions.ts",
"packages/lint/src/validate-predicate-path-refs.test.ts",
"packages/metadata-core/src/object-schema-fls-references.ts",
"packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts",
"packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
"packages/qa/dogfood/test/expression-conformance.ledger.ts",
"packages/spec/authorable-surface/data.json",
"packages/spec/liveness/field.json",
"packages/spec/liveness/state-counts/field.md",
"packages/spec/src/data/field-due-like.test.ts",
"packages/spec/src/data/field.form.ts",
"packages/spec/src/data/field.zod.ts"
],
"mcp_calls": "0 — no MCP GitHub tool called, read or write. Reads: gh api REST GETs (issue 22227 and its comments; objectui#11815 and its comments; the open-PR list and each open PR's files; PR 22503 and its check runs).",
"api_writes": "3 relay writes as objectstack-fleet[bot], each one repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executed by fleet-write.yml. (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, draft: PR 22503; the stored body is byte-identical (9367 bytes). (2) the assignee through label-write.mjs, POST /repos//issues/22503/assignees os-tesla; read-back matches. (3) this os-dev-report comment through post-stamped.mjs, POST /repos//issues/22227/comments. Plus 8 git pushes of the branch, which are not REST.",
"open_questions": [
{
"question": "crm_activity declares a second finished status, cancelled, beside completed. Under the ruled settledWhen (record.status == 'completed') a cancelled activity past its due date keeps the overdue affordance once objectui reads settledWhen. app-todo's deferred is the same shape, and the app's own overdue definition counts only completed.",
"options": [
"A: keep the card's ruled predicates (shipped this way). Zero further cost; a cancelled activity reads overdue.",
"B: settle crm_activity on record.status in ['completed', 'cancelled'], a one-line example change in a follow-up or a patch round on this PR."
],
"recommendation": "A as shipped, because the card text is the ruled spec. B is a one-line patch if the maintainer reads cancelled as settled; it is an example-app choice, not a protocol question."
}
],
"out_of_scope_findings": [
"carrier: objectui#11815 · noted, not filed. The settledWhen gate admits previous and parent, the family's bound roots, as it does for visibleWhen. A display-row evaluator in objectui may bind neither. The objectui card should honour the scope or file a narrowing.",
"carrier: none · noted in PR 22503 Acceptance notes, not filed. packages/lint/scripts/check-doc-formula-expressions.mjs FIELD_RULE_SLOTS (visibleWhen/readonlyWhen/requiredWhen) does not root-judge a docs example of settledWhen. No class a/b/c: no wrong answer was reached, only a docs gate's reach.",
"carrier: none · noted, not filed. packages/lint/src/validate-field-consumers.ts BEHAVIOUR_SEGMENTS lists visibleWhen/readonlyWhen/requiredWhen and not settledWhen, so a field read only by a settledWhen is classified by its root bucket in the removal-impact analysis. Advisory; no wrong answer reached."
]
}objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actions🔁 REWORK — PR #22503 at
a520b4eea5: the at-tier contract review FAILs on a missed ratchet, and CI is red in two shards. The widening itself standsdomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T15:51Z · holder of claim6081172569. Contract review FAIL6084330967.What is right, per the record:
- The two optional keys on the strict
FieldSchema. - Both refusals: either key off
date/datetime, andsettledWhenwithoutdueLike: true. - The CEL scope gate.
- No existing input is newly refused.
spec/lintminor with no ADR-0087 disposition.- The nine ratchets added, each forced and correctly classified.
- The
crm_activitycancelledquestion is answered A, as shipped. The card's ruled predicate governs; it is an example-app authoring choice, revisited when objectui#11815 lands.
What failed (CI on
a520b4eea5):Test Core (3/6)andTemporal Conformance:packages/drivers/driver-sqlbuiltin-column-collision.test.ts:49, "unclassified FieldSchema key(s): ['dueLike','settledWhen']".FIELD_KEY_STORAGE_CLASSinbuiltin-column-collision.tsis pinned againstObject.keys(FieldSchema.shape): the tenth ratchet.Test Core (5/6):packages/metadata-protocoltestexits 1. The assertion is not in the annotations; reproduce it locally.
Asked of the patch round:
- Classify both keys in
FIELD_KEY_STORAGE_CLASS. The record namespresentationfor both. Confirm the class from the module's own definitions. - Reproduce the
metadata-protocolfailure. Fix it if this PR causes it (another key-shape ratchet is likely). If it ismain's red, name its signature onmain. settledWhenis a field-rule slot. Add it to the two lists that enumerate the family, with each list's own pin if it has one:FIELD_RULE_SLOTSinpackages/lint/scripts/check-doc-formula-expressions.mjs, so a docs example of it is root-judged;BEHAVIOUR_SEGMENTSinpackages/lint/src/validate-field-consumers.ts.
- Grep every test that pins
Object.keys(FieldSchema.shape)or the field-rule slot list acrosspackages/, and name each one in the report. Run the test suites of the packages that hold them:driver-sql,metadata-protocol, and any other that shows up.
- The two optional keys on the strict
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22227,
"status": "done",
"branch": "claude/issue-22227-date-due-like",
"pr": "#22503",
"session": "session_01VZqqwTj2wsihZEbfT6yyYN (the claim 6081172569 session; this subagent runs under it)",
"premise_still_valid": true,
"round": "patch round 1 — REWORK 6084352738, contract review FAIL 6084330967",
"summary": "Patch round 1. Both CI reds were key-shape ratchets this PR missed, and both are fixed. (1) packages/drivers/driver-sql/src/builtin-column-collision.ts FIELD_KEY_STORAGE_CLASS now has dueLike: 'presentation' and settledWhen: 'presentation'. The module defines storage as what the SQL driver's DDL layer would have read to shape the column, and presentation as what another layer (metadata, i18n, the engine's write contract, the UI) honours. Neither key is read by createColumn; both are read by the renderer, so both are presentation. (2) metadata-protocol was reproduced on the merged tree. One assertion failed: protocol.meta-types-degenerate-derivation.test.ts, 'control:fieldstill serves 75 top-level properties', expected 75, received 77. That is the per-type served-property positive control; it moves 75 to 77 by the picklist precedent. It is this PR's red, not main's (green on main per the review, and the 77 is exactly the two added keys). (3) settledWhen joins FIELD_RULE_SLOTS and FIELD_RULE_TEXT_RE in check-doc-formula-expressions.mjs, which must stay in step: the text tripwire reconciles against the parse. Three self-test cases pin it: RED bare reference, RED current_user root verdict, GREEN on the fields.mdx example. The corpus run judges 15 field-layer predicates clean, and fields.mdx is not in the skip list. settledWhen also joins BEHAVIOUR_SEGMENTS in validate-field-consumers.ts. That list has no pin, and the behaviour/display split changes no verdict, so it is not pinnable through the published rule. The #6585 user-alias table in validate-expressions.test.ts now covers settledWhen as well. (4) The census is in census_of_key_set_and_slot_pins; every holding package's suite is green at c73e779. (5) origin/main 2e10c9a was merged through scripts/pm/os-regen-merge.sh with no conflicts; check:generated exits 0 after a full build, so no regeneration commit is owed. The PR stays a draft. CI on c73e779, read once: 35 check runs completed, 33 success and 2 skipped (Console Pin Gate, packed-tarball smoke); all seven required contexts are success, including Test Core 1-6 and Temporal Conformance.",
"commits": [
{
"sha": "c064f4b335",
"holds": "driver-sql FIELD_KEY_STORAGE_CLASS: dueLike and settledWhen classified presentation. check-doc-formula-expressions.mjs: settledWhen added to FIELD_RULE_SLOTS and FIELD_RULE_TEXT_RE, plus three self-test cases. validate-field-consumers.ts: settledWhen added to BEHAVIOUR_SEGMENTS."
},
{
"sha": "23c192bfad",
"holds": "Merge of origin/main 2e10c9a through scripts/pm/os-regen-merge.sh. No conflicts. Step 2 kept the branch's bytes of the five generated paths it edited, which main did not touch. check:generated exits 0 after a full turbo build, so no regeneration commit follows."
},
{
"sha": "d0af72c6f8",
"holds": "metadata-protocol protocol.meta-types-degenerate-derivation.test.ts: CARD_PROPERTY_COUNTS field 75 to 77, with the docblock's history line. lint validate-expressions.test.ts: the #6585 user-alias slot table gains settledWhen (2 new cases)."
},
{
"sha": "c73e779f9a",
"holds": "lint validate-expressions.ts: fieldRuleRootIssue's docblock now says the docs gate judges the same field-rule slots, settledWhen included (it said 'three')."
}
],
"census_of_key_set_and_slot_pins": {
"field_key_set_pinned_against_the_live_FieldSchema_shape": [
"packages/drivers/driver-sql/src/builtin-column-collision.test.ts:44 — FIELD_KEY_STORAGE_CLASS classifies every key. RED at a520b4e; fixed in c064f4b. driver-sql suite: 218 files passed, 11 skipped; 3635 tests passed.",
"packages/metadata-protocol/src/protocol.meta-types-degenerate-derivation.test.ts:313 — served property count per type, field 75 to 77. RED at a520b4e; fixed in d0af72c. metadata-protocol suite: 223 files passed, 3 skipped; 28347 tests passed.",
"packages/metadata-core/src/object-schema-fls-references.test.ts — FIELD_REFERENCE_POSITIONS. Classified in round 1; metadata-core green.",
"packages/spec/src/system/metadata-form-zod-reconciliation.test.ts — the field form's top-level zod-only direction. Form rows added in round 1; spec local green.",
"packages/qa/dogfood/test/expression-conformance.test.ts — evaluated-slot discovery. Ledger row added in round 1; green.",
"packages/spec/scripts/liveness/check-liveness.mts (check:liveness, a gate, not a vitest suite). Rows added in round 1; green.",
"packages/lint/src/validate-expressions.test.ts:3279/3383/3411/3936 — the #5017 receiver meta-tests (read is a subset of declared) and the field-predicate loop list. :3410 was updated in round 1; lint green.",
"packages/lint/src/validate-security-posture.test.ts:1497/1500/1663 — receiver meta-tests, read is a subset of declared; an added key cannot turn them red. lint green.",
"packages/cli/test/data-model-rules.test.ts:737 — contains 'reference' and not 'reference_to'; unaffected. cli unit green.",
"packages/spec/src/data/field.test.ts:1018 — key count above 50 and contains deleteBehavior; unaffected.",
"packages/spec/src/data/field-autonumber-default-unique.test.ts:91 — shape order for the materialized default's position; unaffected; spec green.",
"packages/metadata-core/src/objects/builtin-column-storage-attributes.test.ts and packages/services/service-messaging/src/objects/builtin-column-storage-attributes.test.ts — consumers of FIELD_KEY_STORAGE_CLASS through undeliveredStorageAttributes. metadata-core green; service-messaging green, 48 files and 534 tests.",
"Forced by the two new form rows, not by the key set (round 1): packages/lint/src/validate-predicate-path-refs.test.ts, census 85 to 87; packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts, 665 to 667. Both green."
],
"field_rule_slot_lists": [
"packages/lint/src/validate-expressions.ts:2533, the field-rule loop, pinned by validate-expressions.test.ts:3410 (round 1).",
"packages/lint/src/validate-expressions.test.ts:1220, the #6585 user-alias table: settledWhen added (d0af72c).",
"packages/lint/src/validate-expressions.test.ts:1905, 'no two slots share a causal sentence': the three MEASURED slots only. settledWhen takes the generic clause, as conditionalRequired does, so it is deliberately left out.",
"packages/lint/scripts/check-doc-formula-expressions.mjs FIELD_RULE_SLOTS and FIELD_RULE_TEXT_RE: settledWhen added and pinned by three self-test cases (c064f4b). Ablation D: dropping the entry turns exactly those 3 cases red; the restore was proven.",
"packages/lint/src/validate-field-consumers.ts BEHAVIOUR_SEGMENTS: settledWhen added (c064f4b). The list has no pin, and per the module's docblock any behaviour OR display site counts as consumed, so the entry changes no verdict the published rule emits.",
"packages/spec/src/ui/component-props-unknown-members.pin.test.ts:268 FORM_FIELD_AST_PATHS: view form-field AST paths, not FieldSchema; unaffected; spec green.",
"Not field-rule lists for this slot, read and left: objectql rule-validator (the server-enforced requiredWhen / readonlyWhen / option visibleWhen) and metadata-protocol erased-authoring-mark.ts (generic over every evaluated slot, docblock mention only)."
]
},
"tests": "All test runs went through os-verify-lock (slot dev-22227) at HEAD c73e779 with a clean tree, after a full turbo build of the merged tree: 72 tasks. Results: metadata-protocol 223/28347 (3 files and 19 tests skipped); driver-sql 218/3635 (11 files and 206 tests skipped); lint 130/5958; metadata-core 17/387; service-messaging 48/534; platform-objects 68/1078; dogfood expression-conformance 1/7; spec local 631/18829 (1 todo); spec repo 54/915; objectql local 391/7716; cli unit 274/4053 (the integration tier is declared to CI); example-crm 5/45; example-todo 7/238; example-showcase 33/408. objectstack validate passes for all three apps. typecheck is green for spec, lint, metadata-core, metadata-protocol, driver-sql, platform-objects, dogfood and the three examples. Before the fix, at the merge commit 23c192b, metadata-protocol was red at the served-count control (expected 75, received 77) and driver-sql was already green because c064f4b had landed. Ablation D (new this round), through scripts/ablation-replace.mjs: settledWhen removed from FIELD_RULE_SLOTS; anchor 1 to 0; blob 93443a3f27a5 to c19d78cc06e2; the check-doc-formula-expressions self-test reports '3 case(s) failed', exactly the three new cases; the restore was proven with blob == HEAD and an empty git diff HEAD. The driver-sql pin needs no ablation, because CI on a520b4e already showed it red without the classification. Gates: dispatch-gates --commands re-derived at c73e779, unioned with the dispatch list, gives 123 commands, all exit 0 at c73e779. The re-derivation added 4 families: bare-root-worklist --self-test, check:driver-conformance, check:durability-log-level and check:pm-dispatch-gates (run unlocked, as a check:*). dispatch-gates --ran: 118 derived families, 118 run, 0 NOT-MEASURED, every one with an exit code.",
"gates": [
{
"cmd": "node scripts/check-adr-0087-registration.mjs --base origin/main",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-adr-0087-registration.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --base origin/main",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-ci-filter-parity.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-closing-keyword-parity.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-comment-mask-adoption.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-comment-mask-corpus.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-dev-prereqs.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-doc-frontmatter.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-doc-frontmatter.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-doc-route-spelling.mjs --advisory",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-doc-route-spelling.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-docs-section-name.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-docs-section-name.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-dts-emitted.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-empty-changeset.mjs --base origin/main",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-empty-changeset.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-issue-citations.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-keyed-text-bounds.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-platform-object-tenancy-census.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-plugin-teardown-shape.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-registry-log-declared.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-registry-log-declared.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-rest-log-spy-declared.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-section-landing-index.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-section-landing-index.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-system-context-census.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-system-context-census.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/check-undeclared-dep-imports.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/docs-audit/check-affected-docs.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/docs-audit/check-drift-comment.mjs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/pm/bare-root-worklist.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/pm/release-rehearsal-clone.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/release-pending-publish.mjs --self-test",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/lint run check:doc-formula-expressions",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/lint run check:doc-security-posture",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:api-surface",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:authorable-surface",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:browser-reachable-entries",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:docs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:dual-source-exports",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:duration-unit-keys",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:empty-state",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:entry-nameability",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:export-origins",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:exported-any",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:generated",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:liveness",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:llms-txt",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:migration-registry",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:objectui-pin-citations",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:skill-examples",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:skill-refs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:spec-changes",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:strictness-ledger",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:upgrade-guide",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:variant-docs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/spec run check:yaml-examples",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:changeset-gate-self-tests",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:corpus-claim-drift",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:cross-package-test-inputs",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:dispatcher-error-vocabulary",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:doc-anchors",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:doc-authoring",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:docs-audit-scope",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:docs-redirects",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:docs-single-h1",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:docs-spec-enumerations",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:docs-transcript-drift",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:driver-conformance",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:driver-memory-census",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:dts-closure",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:dual-build-cjs-loads",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:durability-log-level",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:engine-double-contract",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:error-status-conformance",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:examples-live-imports",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:future-spec-major",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:gitlink-declared",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:i18n",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:i18n-coverage",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:i18n-stale-fill",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:issue-citations",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:lean-entry-closure",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:logger-receiver-detach",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:merge-driver",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:nul-bytes",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:objectql-double-limit",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:objectui-changeset",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:org-identifier",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:page-declaration-shape",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:platform-checklist",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:pm-changeset-deadline-census",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:pm-dispatch-gates",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:pm-prior-rulings",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:published-files",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:published-readme-links",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:query-options-erasure",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:quick-reference-counts",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:react-page-adapter-contract",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:refd-timer-probe",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:role-word",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:skill-identifier-liveness",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:slot-lookup",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:sourcemap-no-sources-content",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:spec-parsed-alias",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:test-source-alias",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:tier-file-adoption",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:type-check-coverage",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:type-check-debt",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:vendor-version-stamps",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:watch-hint-literal",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm check:where-matcher",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/metadata-protocol exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 223 passed | 3 skipped (226) · Tests 28347 passed | 19 skipped (28366)"
},
{
"cmd": "pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 218 passed | 11 skipped (229) · Tests 3635 passed | 206 skipped (3841)"
},
{
"cmd": "pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 130 passed (130) · Tests 5958 passed (5958)"
},
{
"cmd": "pnpm --filter @objectstack/metadata-core exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 17 passed (17) · Tests 387 passed (387)"
},
{
"cmd": "pnpm --filter @objectstack/service-messaging exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 48 passed (48) · Tests 534 passed (534)"
},
{
"cmd": "pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 --passWithNoTests (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 68 passed (68) · Tests 1078 passed (1078)"
},
{
"cmd": "pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/expression-conformance.test.ts (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 1 passed (1) · Tests 7 passed (7)"
},
{
"cmd": "pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 631 passed (631) · Tests 18829 passed | 1 todo (18830)"
},
{
"cmd": "pnpm --filter @objectstack/spec exec vitest run --project repo --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 54 passed (54) · Tests 915 passed (915)"
},
{
"cmd": "pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 391 passed (391) · Tests 7716 passed (7716)"
},
{
"cmd": "pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 274 passed (274) · Tests 4053 passed (4053)"
},
{
"cmd": "pnpm --filter @objectstack/example-crm exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 5 passed (5) · Tests 45 passed (45)"
},
{
"cmd": "pnpm --filter @objectstack/example-todo exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 7 passed (7) · Tests 238 passed (238)"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase exec vitest run --maxWorkers=2 (os-verify-lock, slot dev-22227)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Test Files 33 passed (33) · Tests 408 passed (408)"
},
{
"cmd": "pnpm --filter @objectstack/example-crm validate (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/example-todo validate (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase validate (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a",
"verdict": "Validation passed"
},
{
"cmd": "pnpm --filter @objectstack/spec typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/lint typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/metadata-core typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/metadata-protocol typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/driver-sql typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/platform-objects typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/dogfood typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/example-crm typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/example-todo typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "pnpm --filter @objectstack/example-showcase typecheck (os-verify-lock)",
"exit": 0,
"head": "c73e779f9a"
},
{
"cmd": "node scripts/pm/dispatch-gates.mjs --ran ran2.txt --repo objectstack-ai/objectstack",
"exit": 0,
"head": "c73e779f9a",
"verdict": "118 derived families, 118 run, 0 NOT-MEASURED, all with a recorded exit code"
},
{
"cmd": "pnpm --filter @objectstack/spec check:generated (after the merge and a full turbo build)",
"exit": 0,
"head": "23c192bfad",
"verdict": "no stale artifact; no regeneration commit owed"
}
],
"line_budget": {
"additions": 608,
"deletions": 15,
"changed_lines": 623,
"files": 28,
"against": "origin/main 2e10c9a (three-dot)",
"threshold": "HUMAN_MERGE_LINE_THRESHOLD 3,000",
"verdict": "under"
},
"deviations": [
"Surface extension, round 2: four more files outside the claim's declared surface, all named by this REWORK. packages/drivers/driver-sql/src/builtin-column-collision.ts (the tenth ratchet), packages/metadata-protocol/src/protocol.meta-types-degenerate-derivation.test.ts (the eleventh ratchet, found by reproducing Test Core 5/6), packages/lint/scripts/check-doc-formula-expressions.mjs and packages/lint/src/validate-field-consumers.ts (the two family lists).",
"One edit beyond the four asked items: validate-expressions.test.ts's #6585 user-alias slot table gains settledWhen, and validate-expressions.ts's fieldRuleRootIssue docblock now counts the docs gate's slots correctly (my round-2 change had made 'three' stale). Both are on the file surface this card was given.",
"PR body not edited: the dev writes the body once, at pr_create. For the seat to write if wanted: (a) the Tests section's head and counts move to c73e779, using this report's numbers; (b) the 'Files beyond the claim's declared surface' list gains driver-sql builtin-column-collision.ts, metadata-protocol protocol.meta-types-degenerate-derivation.test.ts, check-doc-formula-expressions.mjs and validate-field-consumers.ts; (c) the Acceptance notes drop 'Not merged with origin/main' (merged in 23c192b) and 'One reader not taught the new slot' (fixed in c064f4b).",
"Worktree: the round-1 worktree had been removed after the round-1 report, so /home/user/objectstack-issue-22227 was recreated on the existing branch at a520b4e. It will be removed again after this report.",
"Two of my runs were stopped by PID right after they started (the locked suite was still queued for the lock and the gate runner was on its first gate). I stopped them to commit the docblock fix first. Both were rerun in full at c73e779; no reading from the stopped runs is used."
],
"files_changed": [
".changeset/22227-field-deadline-due-like.md",
"content/docs/data-modeling/fields.mdx",
"content/docs/references/data/field.mdx",
"content/docs/references/data/object.mdx",
"content/docs/references/system/migration.mdx",
"examples/app-crm/src/objects/activity.object.ts",
"examples/app-showcase/src/data/objects/task.object.ts",
"examples/app-todo/src/objects/task.object.ts",
"packages/drivers/driver-sql/src/builtin-column-collision.ts",
"packages/lint/scripts/check-doc-formula-expressions.mjs",
"packages/lint/src/validate-expressions.test.ts",
"packages/lint/src/validate-expressions.ts",
"packages/lint/src/validate-field-consumers.ts",
"packages/lint/src/validate-predicate-path-refs.test.ts",
"packages/metadata-core/src/object-schema-fls-references.ts",
"packages/metadata-protocol/src/protocol.meta-types-degenerate-derivation.test.ts",
"packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
"packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts",
"packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
"packages/qa/dogfood/test/expression-conformance.ledger.ts",
"packages/spec/authorable-surface/data.json",
"packages/spec/liveness/field.json",
"packages/spec/liveness/state-counts/field.md",
"packages/spec/src/data/field-due-like.test.ts",
"packages/spec/src/data/field.form.ts",
"packages/spec/src/data/field.zod.ts"
],
"mcp_calls": "0 — no MCP GitHub tool called, read or write. Reads: gh api REST GETs (comment 6084352738, comment 6084330967, PR 22503, the check runs on c73e779).",
"api_writes": "1 relay write as objectstack-fleet[bot] this round: this os-dev-report comment through post-stamped.mjs, POST /repos//issues/22227/comments, carried by POST /repos/objectstack-ai/objectstack/dispatches. No PR body edit, no label or assignee write, no ready flip. Plus 3 git pushes (c064f4b with 23c192b, d0af72c, c73e779), which are not REST.",
"open_questions": [],
"out_of_scope_findings": []
}objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actions✅ ACCEPT — PR #22503 at
c73e779f9a(dueLikeandsettledWhenon date and datetime fields). Lands when every check is greendomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T17:32Z · holder of claim6081172569. Reports:os-dev-reportround 0 and patch round 1 on this card. Thread-read: the patch-round report.Checked in the diff, not from the reports:
- Shape: draft, base
main, line 1Fixes #22227, line 2Clause-②: yes; 28 files, +608 / −15 (under the 3,000 human-merge line); assigneeos-tesla. No governed path. - The widening:
FieldSchemagains two optional keys.dueLike(boolean, no default) andsettledWhen(a CEL predicate in thevisibleWhenfamily) are refused offDEADLINE_FIELD_TYPES(date,datetime), andsettledWhenis refused withoutdueLike: true. The refusals run in asuperRefine, the idiommaxLength/valueDomainalready use, and each carries a prescription.- The field-rule authoring gate judges
settledWhenas it judgesvisibleWhen: it must parse, readrecord.FIELD, name a declared field, and use only the bound roots. That gate runs atos build,os validateand the object save door. - No existing input is newly refused.
- The examples: the showcase
taskdeclaresstatus == 'done', and the app-todotaskand the crmactivitydeclarestatus == 'completed', each measured from the object's own select options.crm_activity'scancelledstays as the card ruled (answer A); the question is revisited when objectui#11815 lands. - The ratchets: eleven classification rows, each one forced by a gate. The first head missed two, and CI caught them (
driver-sqlFIELD_KEY_STORAGE_CLASS, themetadata-protocolserved count); patch round 1 fixed both.settledWhenalso joins the docs gate's slot list andBEHAVIOUR_SEGMENTS. - Changeset, read sentence by sentence:
@objectstack/specminor plus@objectstack/lintminor. It names the authoring doors that now judge the keys and says objectui reads them after the spec publishes. No ADR-0087 disposition is owed for a widening. - Contract review: at-tier PASS on
c73e779f9a(6085939799), after FAIL6084330967ata520b4eea5. - CI on
c73e779f9a: 35 runs, 33 success, 2 skipped.
Out-of-scope findings:
previous/parentadmitted on a display predicate → carrier objectui#11815 (Acceptance notes).settledWhenis a 35th evaluated-expression position thatevaluated-slot-population.test.tsdoes not list → Acceptance notes, carrier spec(ui): field-level conditionalFormatting — a field declares[{ condition, style }]cell rules (CEL overvalueandrecord), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228, which adds the next evaluated position on the field definition and adds both rows.- The docs gate and
BEHAVIOUR_SEGMENTSgaps are fixed in this PR.
Next: ready, then auto-merge. On merge, objectui#11815's
Blocked-by:this card clears, and #22228 follows onfield.zod.ts.- Shape: draft, base
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded: PR #22503 →
215e66204a(dueLikeandsettledWhenon date and datetime fields).Fixes #22227closed this carddomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T19:09Z · holder of claim6081172569, released by this act.- Landed: merged through the merge queue as
215e66204a(2026-10-09T18:08Z). It has one parent,da989bbb24, and is an ancestor oforigin/main. - Content check: all 28 PR paths on
215e66204aare blob-equal to the reviewed headc73e779f9a: ACCEPT6085975638; at-tier contract review PASS6085939799, after FAIL6084330967. - What now holds (
@objectstack/specminor,@objectstack/lintminor):- A
date/datetimefield may declaredueLike: trueand asettledWhenCEL predicate. - Either key on another type, or
settledWhenwithoutdueLike: true, is refused with a prescription. - The field-rule gate judges
settledWhenas it judgesvisibleWhen, atos build,os validateand the object save door. - The showcase task, the todo task and the crm activity declare it.
- A
- Unblocks date cells: a due-like date on a completed record still renders red "Overdue Nd" (Done tasks flagged overdue) objectui#11815 (
Blocked-by:this card). objectui consumes the published@objectstack/spec, so its unlock check is whether the keys are installable from a release, not this merge. - Acceptance notes carried:
crm_activity'scancelledstays unsettled, as the card ruled; revisit when objectui#11815 lands.previous/parentare admitted on a display predicate; carrier objectui#11815.settledWhenis a 35th evaluated-expression position missing fromevaluated-slot-population.test.ts; carrier spec(ui): field-level conditionalFormatting — a field declares[{ condition, style }]cell rules (CEL overvalueandrecord), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228.
Release:
session_01VZqqwTj2wsihZEbfT6yyYN· why: the card is delivered and closed byFixes #22227· to: closed, unassigned. This act removespm:dispatchedand the assigneeos-tesla.- Landed: merged through the merge queue as
Filing gate: ③ a maintainer-directed task, the protocol half of objectui#11815's ruling D. Filed by the director seat (seat post #12708, summon #35,
session_01VYToj6PQehTEKNrjGM9akg). The maintainer's words on objectui#11815: 「每个状态不是可以自己配置颜色吗?done 配置为红色不是元数据的 bug 吗?为什么平台要兜一圈」, then 「同意」 to the seat's option D (declared-only overdue: no name guessing, the deadline declares when it is settled). ⛔ Not a claim.Reader: the
domain:specseat.Clause-②: yes— the published accept set of the date and datetime field definitions widens by two keys; the spec-lane review at tier applies.priority:p3(cosmetic today; nothing is stored wrong). objectui#11815 isBlocked-by:this card and lands after the spec publishes.Why the protocol, and not objectui alone
packages/fields/src/index.tsx,resolveDueLikeandisOverdueInstant): a field is due-like when its runtime metadata carriesdueLike: trueor its name matches/(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/; a due-like date before today paintstext-red-600and the wording "Overdue Nd". A finished record stays red for ever.dueLikeis an objectui-owned key (objectui#9738, ruled A on 2026-09-18: "objectui-owned until the protocol claims it"), declared on objectui'sDateFieldMetadata(packages/types/src/field-types.ts) and enriched from the detail-view field config. The protocol's view schemas are strict and their passthrough window is shut (packages/spec/src/ui/view.zod.ts), so an application validated by@objectstack/spec— the example apps, hotcrm — cannot authordueLikeat all. Today the only way a date goes red is the name guess.conditionalFormattingcard filed beside this one is for presentational rules without a semantic).What this card adds, and only this
On the
dateanddatetimefield definitions (packages/spec/src/data/field.zod.ts):dueLike: boolean(optional, default absent) — this field is a deadline; a renderer may show relative overdue wording and an overdue affordance for it. ⛔ No name-pattern inference anywhere: absent means not a deadline.settledWhen(optional) — a per-record CEL predicate in thevisibleWhen/readonlyWhen/requiredWhenfamily, evaluated against the record; when it holds the deadline is settled and no overdue wording or affordance applies (for examplerecord.status == 'done', orrecord.done == true). Authoring-gate rules as for its siblings: it parses, or the metadata is refused with a prescription;settledWhenwithoutdueLikeis refused (ADR-0049: a declared key is enforced).visibleWhen, a pin test for the gate and for the two scope names.task(due_date, settled onstatus == 'done'), app-todotask(settled onstatus == 'completed'), crmactivity(settled onstatus == 'completed'), so the example grids keep their overdue affordance after objectui retires the guess.Changeset:
@objectstack/specminor.⛔ Not this card
settledWhencan then read it.dueLikeand the host-evaluatedsettledWhenthrough one optional cell prop, and decides whether its mirror's view-leveldueLikeis retired or kept as an override.Dedupe: the 128 open objectstack issues listed through the repository endpoint and scanned (title and body) for dueLike / settledWhen / overdue / terminal option / 逾期: 0. Prior rulings read: objectui#9738 (
dueLikeobjectui-owned until the protocol claims it — this card is the protocol claiming it), objectui#11676 ruling A (no guessing a record's state), objectui#11815 ruling D → 3 hits; ADR-0049, ADR-0087.Related:
packages/spec/src/data/field.zod.ts· objectuipackages/fields/src/index.tsx· objectuipackages/types/src/field-types.ts· objectuipackages/core/src/utils/date-display.ts·examples/app-showcase·examples/app-todo·examples/app-crm.Generated by Claude Code