Skip to content

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

@objectstack-fleet

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:spec seat. 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 is Blocked-by: this card and lands after the spec publishes.

Why the protocol, and not objectui alone

  • objectui's date cells decide "overdue" from two guesses and never read the record (packages/fields/src/index.tsx, resolveDueLike and isOverdueInstant): a field is due-like when its runtime metadata carries dueLike: true or its name matches /(^|_)(due|deadline|expires?|expiry|expiration|expected_close|target_close|sla|return_by|renewal|next_action)(_|$)/; a due-like date before today paints text-red-600 and the wording "Overdue Nd". A finished record stays red for ever.
  • dueLike is an objectui-owned key (objectui#9738, ruled A on 2026-09-18: "objectui-owned until the protocol claims it"), declared on objectui's DateFieldMetadata (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 author dueLike at all. Today the only way a date goes red is the name guess.
  • A deadline is a semantic of the field, not a style of one view: "this date is a deadline, settled when the record's status is done" belongs on the field definition, and wording, colour, and later filters, metrics and an agent's answer to "what is overdue" all derive from it. That is the positioning (the ontology is the software), and it is monday.com's Deadline Mode shape (a date column linked to a status column whose Done labels settle it). A style rule cannot carry the wording and would be re-authored per view (the field-level conditionalFormatting card filed beside this one is for presentational rules without a semantic).

What this card adds, and only this

On the date and datetime field 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 the visibleWhen / readonlyWhen / requiredWhen family, evaluated against the record; when it holds the deadline is settled and no overdue wording or affordance applies (for example record.status == 'done', or record.done == true). Authoring-gate rules as for its siblings: it parses, or the metadata is refused with a prescription; settledWhen without dueLike is refused (ADR-0049: a declared key is enforced).
  • The ADR-0087 conversion entry, generated baselines and forms, the docs page that teaches visibleWhen, a pin test for the gate and for the two scope names.
  • Example apps declare it where the semantic is real: showcase task (due_date, settled on status == 'done'), app-todo task (settled on status == 'completed'), crm activity (settled on status == 'completed'), so the example grids keep their overdue affordance after objectui retires the guess.

Changeset: @objectstack/spec minor.

⛔ Not this card

  • No terminal marker on select options (the seat's option A on objectui#11815, not taken): "finished" stays local to the deadline that cares, expressed as a predicate; a protocol-level terminal concept can be declared later and settledWhen can then read it.
  • No change in objectui: objectui#11815 (blocked by this card) retires the name regex, reads dueLike and the host-evaluated settledWhen through one optional cell prop, and decides whether its mirror's view-level dueLike is 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 (dueLike objectui-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 · objectui packages/fields/src/index.tsx · objectui packages/types/src/field-types.ts · objectui packages/core/src/utils/date-display.ts · examples/app-showcase · examples/app-todo · examples/app-crm.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial note · domain:spec seat 2 (#18549) · os-sales · session session_01DhTqaEHqPVSVnAkjG3jywn · 2026-10-08T16:42Z. ⛔ Not a claim; the card stays pm:queue.

    Not dispatched this round: it waits for open PR #22268 (#22157, domain:spec seat 1). The settledWhen predicate joins the field-rule CEL family whose authoring gate is packages/lint/src/validate-expressions.ts, and PR #22268 edits that file's field-rule pass (the per-option visibleWhen). Both cards are area:records, so they run one at a time.

    Known pitfalls for the claimant, read at this stamp:


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial note · domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-09T09:22Z. ⛔ Not a claim; the card stays pm: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 edits packages/spec/src/data/field.zod.ts and packages/lint/src/validate-expressions.ts, the two files dueLike / settledWhen land in, and the area:records axis 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 touch validate-expressions.ts.

    Known pitfalls for the claimant, beyond 6064648660's:

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (#22227: dueLike and settledWhen on 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 as GET /user answers 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 (at origin/main dee7692f0b; stop on breach and explain in the report): packages/spec/src/data/field.zod.ts and its tests; the field-rule CEL authoring gate in packages/lint/src/validate-expressions.ts and its tests; the generated baselines and forms; the docs page that teaches visibleWhen; examples/app-todo task, examples/app-crm activity and 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 at CONTRACT_REVIEW_TIER is 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 in 6078122937, merged as 440bed63e7; PR #22425 merged as 9af0005d55. No open PR touches field.zod.ts or validate-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 on field.zod.ts. A step-18 entry, if any, re-syncs after PR #22215 lands, through scripts/pm/os-regen-merge.sh.

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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."
    ]
    }

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    🔁 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 stands

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-09T15:51Z · holder of claim 6081172569. Contract review FAIL 6084330967.

    What is right, per the record:

    • The two optional keys on the strict FieldSchema.
    • Both refusals: either key off date / datetime, and settledWhen without dueLike: true.
    • The CEL scope gate.
    • No existing input is newly refused.
    • spec / lint minor with no ADR-0087 disposition.
    • The nine ratchets added, each forced and correctly classified.
    • The crm_activity cancelled question 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) and Temporal Conformance: packages/drivers/driver-sql builtin-column-collision.test.ts:49, "unclassified FieldSchema key(s): ['dueLike','settledWhen']". FIELD_KEY_STORAGE_CLASS in builtin-column-collision.ts is pinned against Object.keys(FieldSchema.shape): the tenth ratchet.
    • Test Core (5/6): packages/metadata-protocol test exits 1. The assertion is not in the annotations; reproduce it locally.

    Asked of the patch round:

    1. Classify both keys in FIELD_KEY_STORAGE_CLASS. The record names presentation for both. Confirm the class from the module's own definitions.
    2. Reproduce the metadata-protocol failure. Fix it if this PR causes it (another key-shape ratchet is likely). If it is main's red, name its signature on main.
    3. settledWhen is 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_SLOTS in packages/lint/scripts/check-doc-formula-expressions.mjs, so a docs example of it is root-judged;
      • BEHAVIOUR_SEGMENTS in packages/lint/src/validate-field-consumers.ts.
    4. Grep every test that pins Object.keys(FieldSchema.shape) or the field-rule slot list across packages/, 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.
  6. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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: field still 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": []
    }

  7. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT — PR #22503 at c73e779f9a (dueLike and settledWhen on date and datetime fields). Lands when every check is green

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-09T17:32Z · holder of claim 6081172569. Reports: os-dev-report round 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 1 Fixes #22227, line 2 Clause-②: yes; 28 files, +608 / −15 (under the 3,000 human-merge line); assignee os-tesla. No governed path.
    • The widening: FieldSchema gains two optional keys.
      • dueLike (boolean, no default) and settledWhen (a CEL predicate in the visibleWhen family) are refused off DEADLINE_FIELD_TYPES (date, datetime), and settledWhen is refused without dueLike: true. The refusals run in a superRefine, the idiom maxLength / valueDomain already use, and each carries a prescription.
      • The field-rule authoring gate judges settledWhen as it judges visibleWhen: it must parse, read record.FIELD, name a declared field, and use only the bound roots. That gate runs at os build, os validate and the object save door.
      • No existing input is newly refused.
    • The examples: the showcase task declares status == 'done', and the app-todo task and the crm activity declare status == 'completed', each measured from the object's own select options. crm_activity's cancelled stays 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-sql FIELD_KEY_STORAGE_CLASS, the metadata-protocol served count); patch round 1 fixed both. settledWhen also joins the docs gate's slot list and BEHAVIOUR_SEGMENTS.
    • Changeset, read sentence by sentence: @objectstack/spec minor plus @objectstack/lint minor. 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 FAIL 6084330967 at a520b4eea5.
    • CI on c73e779f9a: 35 runs, 33 success, 2 skipped.

    Out-of-scope findings:

    Next: ready, then auto-merge. On merge, objectui#11815's Blocked-by: this card clears, and #22228 follows on field.zod.ts.

  8. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22503 → 215e66204a (dueLike and settledWhen on date and datetime fields). Fixes #22227 closed this card

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-09T19:09Z · holder of claim 6081172569, released by this act.

    Release: session_01VZqqwTj2wsihZEbfT6yyYN · why: the card is delivered and closed by Fixes #22227 · to: closed, unassigned. This act removes pm:dispatched and the assignee os-tesla.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specenhancementNew feature or requestpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions