Skip to content

types(date, datetime): declare dueLike and settledWhen by reference to @objectstack/spec once objectui installs the release carrying objectstack-ai/objectstack#22503 #12297

Closed

Description

@objectstack-fleet

Filing class: ① product defect, class (b): a contract the protocol declares that objectui's typed authoring face does not yet carry by reference. Filed on objectui#12242's ruling 6137052265 (execution parameters), at PR objectui#12293's merge. Reach: named producers. Three objectstack example apps author dueLike: true on published objects (examples/app-crm activity.object.ts, examples/app-showcase task.object.ts, examples/app-todo task.object.ts).

Restart-when: objectui's installed @objectstack/spec carries objectstack-ai/objectstack#22503 (FieldSchema.dueLike, commit 215e66204)
Restart-touch: pnpm-lock.yaml

  • Who acts: the domain:spec @ objectui seat (objectui#10217), when the Restart-when: line holds. Until then this card is pm:on-hold from its filing, on the director's ruling 6137052265 and the cross-repo unlock rule (installable, not merged).
  • Scope, this card only:
    • DateFieldMetadata.dueLike and DateTimeFieldMetadata.dueLike (packages/types/src/field-types.ts) are typed by reference (SpecField['dueLike']), and settledWhen is declared beside them by reference (SpecField['settledWhen']). objectui AGENTS.md #0.1 governs this.
    • DetailViewFieldSchema.dueLike follows if it still mirrors the field.
    • content/docs/fields/date.mdx, datetime.mdx and content/docs/api/schema-reference.md teach both keys as the spec does.
  • Not this card: the renderer's reads. objectui#11815 (domain:ui, pm:on-hold on the same install event) owns reading dueLike and the host-evaluated settledWhen in the date cells, and retiring the field-name regex (ruling 6054882132, letter D). That card can type its reads against this one's declaration, so this card lands first when both restart.
  • Dedupe: two objectui issue searches, closed included. "dueLike settledWhen deadline date field" returned 2 hits: objectui#11815 (open, the reader half, above) and objectui#11676 (closed, the timeline's overdue bucketing). "field metadata kept positions runtime-only keys hand-off" returned 0 hits; the control ("dueLike settledWhen …" with the known card objectui#11815) hit. Neither hit carries the types declaration.

The reading (this seat, on the day of filing)

  • The protocol: objectstack origin/main packages/spec/src/data/field.zod.ts: dueLike: z.boolean().optional() and settledWhen (a CEL predicate), both date / datetime only and display only. They landed in objectstack#22503 (215e66204, merged 2026-10-09).
  • The install face: npm @objectstack/spec latest is 17.7.0 (published 2026-10-06, before #22503). objectui's lockfile resolves 17.7.0. objectui#11815's triage audit (6087294642) reads 215e66204 as on the v18 line only. So the restart may coincide with objectui's major bump.
  • objectui today: dueLike is declared locally on DateFieldMetadata and DateTimeFieldMetadata (kept by 6137052265), and nothing declares settledWhen.

Dedupe words: dueLike by reference · settledWhen date field type · deadline semantic objectui types


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 13, 2026
  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:on-hold → pm:queue · the release this card waits on is already installed · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T07:38Z

  3. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: priority:p3 → p2 · domain:spec → domain:ui · pm:queue stands · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T04:56Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Why p2: it is the blocker of objectui#11815, now p2 with measured reach (see objectui#12726). At p3 it would hold a p2 behind a card the fleet never runs.
    • Why domain:ui: objectui's domain:spec seat is vacant (seat post objectui#10217, "⏳ vacant"), so packages/types cards route to domain:ui until it is filled. The contract-review owed on a types face is unchanged.

    Generated by Claude Code

  4. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    on Oct 17, 2026
  5. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (priority:p2 bug, contract face; filed on objectui#12242's ruling 6137052265, unlocked by the triage seat's install scan 6163379426, re-graded p2 and routed to domain:ui because objectui's domain:spec seat is vacant, 6229884299; the blocker of objectui#11815 and objectui#12726)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12297-duelike-by-reference
    Worktree: objectui-issue-12297 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/types/src/field-types.ts (DateFieldMetadata.dueLike and DateTimeFieldMetadata.dueLike typed by reference to @objectstack/spec, settledWhen declared beside them by reference); DetailViewFieldSchema.dueLike and any zod mirror of these members under packages/types/src/zod/ only if they still mirror the field; content/docs/fields/date.mdx, content/docs/fields/datetime.mdx, content/docs/api/schema-reference.md; tests beside; one .changeset/12297-*.md (@object-ui/types). ⛔ The renderer's reads (objectui#11815) and packages/components/src/ui/** stay out. Stop on breach; explain in the report.
    Container & model: S, mode:cloud, model: opus (cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 3 on 「当前任务处理完,后续并发降到3」, this session's chat, 2026-10-16)
    Clause-②: yes
    Clause-② reason: @object-ui/types publishes DateFieldMetadata and DateTimeFieldMetadata; dueLike is re-typed by reference and settledWhen is a new optional member. The seat's TIER_DEFAULT review comes before ready.
    Responsibility: n/a — a protocol key objectui's typed authoring face does not carry by reference
    Thread-read: 6229884299
    Serial constraints cleared: no open objectui PR touches packages/types/src/field-types.ts or the three docs pages (read at dispatch). objectui#11815 (the reader half) stays on hold and types its reads against this card's declaration after it lands. Not a governed surface (check-governed-queue-guard.mjs --test on the paths: none matched).

  6. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12297,
      "status": "done",
      "branch": "claude/issue-12297-duelike-by-reference",
      "pr": 12861,
      "session": "session_01Qe458QJ3QyHSzgf9t1dDEH",
      "premise_still_valid": true,
      "summary": "`DateFieldMetadata` and `DateTimeFieldMetadata` now take `dueLike` from the spec as `SpecField['dueLike']`, using the file's own `Field as SpecField` idiom (`Field` = `z.input<typeof FieldSchema>`). Beside it, on both interfaces, I declared `settledWhen?: SpecField['settledWhen']`, with doc comments taken from the spec: a CEL predicate, display only, `date`/`datetime` only, `dueLike: true` required. The comments also say two things the runtime does not do yet: today's cells still fall back to the field name when `dueLike` is absent, and `settledWhen` is declared but not rendered (both are objectui#11815's job). The docs pages date.mdx, datetime.mdx and schema-reference.md teach both keys the same way, and one minor changeset covers @object-ui/types. `DetailViewFieldSchema.dueLike` and its zod mirror are left untouched, for the reason in open_questions. No zod mirror of field metadata exists, so nothing was added there. All three PM mechanism assumptions held when measured on main `024d446`.",
      "tests": "At HEAD 868d7b8. `pnpm --filter @object-ui/types test` (run once, foreground, under os-verify-lock): VERDICT command-exit 0, Test Files 386 passed (386), Tests 10513 passed (10513). Targeted repo-root run `pnpm exec vitest run` on field-metadata-deadline-by-reference-12297.test.ts and field-metadata-family-retired-12242.test.ts: 2 files, 27 tests passed. The new pin, packages/types/src/__tests__/field-metadata-deadline-by-reference-12297.test.ts, has three parts. (1) Type half: exact `Equal` checks that `DateFieldMetadata` and `DateTimeFieldMetadata` `['dueLike']` and `['settledWhen']` equal `SpecField[KEY]`. (2) Control: `'dueLike'` and `'settledWhen'` are not in `keyof` `TimeFieldMetadata` or `TextFieldMetadata`, and fresh `time`/`text` literals carrying them are refused via `@ts-expect-error`. (3) Runtime half against the installed `FieldSchema`: both keys parse on date (bare string) and datetime (envelope); `dueLike` on `time` is refused at path `dueLike`, with a minimal `time` field as the control; `settledWhen` without `dueLike: true` is refused at `settledWhen`, and the same field with it passes. Ablation, once, after committing the fix: I replaced `DateFieldMetadata`'s `settledWhen?: SpecField['settledWhen']` with a local `settledWhen?: string`. On disk: marker grep count 1, and exactly 1 by-reference line left (the datetime one). `tsc -p tsconfig.test.json` then exited 2 with `field-metadata-deadline-by-reference-12297.test.ts(44,10): error TS2344: Type 'false' does not satisfy the constraint 'true'.`, which is exactly the Date settledWhen Equal row. I restored with `git checkout HEAD --` under an EXIT trap. The restored blob 81b45d441d7bd775107cdd243fe3453cc896eadd matches the HEAD blob, and `git diff HEAD` is empty. The test imports '../field-types.js' relatively, so tsc reads src and no dist rebuild was needed for the ablation.",
      "gates": "Local, at 868d7b8 unless stated; exit codes captured before any pipe. `pnpm --filter @object-ui/types type-check` EXIT=0, script name echoed; it runs tsc, tsconfig.examples and tsconfig.test, and tsconfig.test includes the new file. `pnpm --filter @object-ui/types lint` EXIT=0 with 0 errors; the 3 warnings on field-types.ts are pre-existing (no-explicit-any; the base blob gives the same 3). `pnpm --filter @object-ui/types build` via lock: VERDICT command-exit 0, dist completeness verified, and dist/field-types.d.ts carries settledWhen. Doc-snippet build closure (`turbo run build` with the `--build-filter` from check-doc-snippet-types, concurrency 2) via lock: VERDICT command-exit 0, 35/35 tasks. `pnpm check:doc-snippets` EXIT=0 (801 of 801 blocks judged, 0 failed). `pnpm check:doc-examples` EXIT=0. `node scripts/check-doc-json-fences.mjs` EXIT=0. `node scripts/check-doc-links.mjs` EXIT=0. `node scripts/check-doc-component-types.mjs` EXIT=0. `node scripts/check-doc-example-ids.mjs` EXIT=0. `node scripts/check-control-bytes.mjs` EXIT=0. `pnpm check:spec-symbols` EXIT=0, with output identical before and after the change (diff of the ✅ lines is empty), and the member-citation leg reads 'nothing cites a key its spec symbol does not declare'. `node scripts/check-changeset-presence.mjs` EXIT=0 (1 changeset declared for 3 released source files). `pnpm check:new-line-citations` EXIT=0 (0 new citations). Control-byte grep on the changed files: no hits. Model-name grep over `git log --format=%B 024d446..HEAD`: no hits. The first run of check-doc-snippet-types and check-doc-example-types exited 2 with PREREQUISITE (closure unbuilt), not as a measurement; both are green after the closure build. objectui has no dispatch-gates.mjs, so no `--ran` reconciliation is possible; I hand-derived this list from repo-gates.yml. CI check-runs: NOT MEASURED, because no PR exists yet (the PM opens it).",
      "mcp_calls": "6 in total. claude-code-remote add_repo x1 (objectstack-ai/objectstack, access read; it answered read_available and attached nothing). github issue_read x4: get #12297, get_comments #12297, get #11815, get_comments #12242 (for ruling 6137052265). ToolSearch x1 to load issue_read (not an MCP call itself). No write tool was used.",
      "api_writes": "0 REST writes. Two git pushes to objectui branch claude/issue-12297-duelike-by-reference: the empty branch (write probe), then the commits 8d1a432 and 868d7b8. No PR, no comment, no label write.",
      "open_questions": [
        {
          "question": "DetailViewFieldSchema.dueLike (packages/types/src/views.ts and the zod/views.zod.ts mirror): is it re-typed by reference? Ruling: it follows only if it still mirrors the field.",
          "options": [
            "A: leave it untouched (taken)",
            "B: re-type it as SpecField['dueLike'] and add settledWhen to it"
          ],
          "recommendation": "A. What I found: the installed spec declares `dueLike` only on `FieldSchema` (a grep of `@objectstack/spec@18.0.0-next.2` src finds it only in data/field.zod.ts), so no spec view schema carries it. The interface's own doc calls it 'a different key of the same name' on the authored detail-view entry. Its runtime meaning also differs from the spec's: an absent key falls back to the name convention, and the authored entry wins over the object field. Its type is already `boolean | undefined`, equal to the spec's. Against the four axes: B would claim spec provenance for a key the spec does not declare on any view (axis 3: declaring what the contract does not say). Adding `settledWhen` there would create a new capability with no spec row and no reader (axis 4). Neither has any business pull today (axis 1). Whether the detail entry keeps `dueLike` after objectui#11815 retires the name fallback belongs to that card."
        },
        {
          "question": "Where my contract (objectstack .claude/agents/os-dev.md at 265ef64) and this dispatch disagree",
          "options": [
            "Followed the dispatch on writes; contract notes follow"
          ],
          "recommendation": "(1) The contract makes opening the draft PR and posting the os-dev-report comment the dev's job. The dispatch says not to, because the fleet-write relay is refused from this container. I did neither, put `pr_title_draft`/`pr_body_draft` in this report, and did not route the writes through MCP. The contract itself sends every GitHub write through the relay and never through MCP, so I read this as the channel being down rather than a real conflict; the PM posts this report on the card. (2) The harness attribution reminder asked for a model-named Co-Authored-By trailer. I used AGENTS.md's model-free pair instead, as both AGENTS.md and the contract direct. (3) The contract's `scripts/ablation-replace.mjs` and `ablation-dist-preflight.mjs` live only in objectstack, not in objectui. The ablation used an inline replace that asserts exactly one match, grep counts on both sides, and HEAD-blob hash restore. No dist path was involved because the test compiles src. (4) The worktree is not removed: the contract removes it after the PR opens, and I did not open the PR. (5) objectui AGENTS.md names the lock at /home/user/objectstack/scripts/pm/os-verify-lock.sh, but in this container the read-only clone is at /home/user/objectstack-ai/objectstack. I used that path."
        },
        {
          "question": "Doc pages: how to teach `dueLike` when the spec says 'absent = not a deadline, nothing inferred from the name' but today's cells still infer from the name",
          "options": [
            "A: state both, the spec meaning and today's fallback, with the retirement owed by objectui#11815 (taken)",
            "B: teach only the spec meaning"
          ],
          "recommendation": "A. B would have the docs promise behaviour the runtime does not deliver: an author writing `dueLike: false` on `due_at` would still see red. The ruling bans documenting undelivered capability (axis 3), and spec > implementation > docs means the gap is objectui#11815's to close, not the docs'. The pages therefore say which of the two answers is the spec's and which is today's renderer."
        }
      ],
      "out_of_scope_findings": [
        "carrier: objectui#11815 · noted, not filed: the spec reads an absent or false `dueLike` as 'not a deadline, nothing inferred from the name', but `resolveDueLike` (@object-ui/fields) still falls back to the field-name regex and ignores `false`. The new comments and docs state this gap, and retiring the regex is already that card's scope."
      ],
      "pr_title_draft": "fix(types): type dueLike by reference and declare settledWhen on date and datetime field metadata",
      "pr_body_draft": "(elided here: it is the body of objectstack-ai/objectui#12861, the dev's draft verbatim)"
    }

    Relayed by seat domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final report (degraded channel: the session pushed and returned pr: null). The seat opened #12861 from claude/issue-12297-duelike-by-reference at 868d7b8 and set pr above. The three open questions (DetailViewFieldSchema.dueLike, the contract notes, how the docs teach the name fallback) are ruled in the ACCEPT on the PR, and the seat's TIER_DEFAULT contract review follows it.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #12861 merged as 8106db1 on main · read 2026-10-17T05:53Z

    probe on origin/main 8106db1 reading control
    DateFieldMetadata in packages/types/src/field-types.ts dueLike?: SpecField['dueLike'] (:600), settledWhen?: SpecField['settledWhen'] (:615) typed by reference, as AGENTS.md #0.1 requires
    DateTimeFieldMetadata dueLike (:646), settledWhen (:654), both SpecField[...] the same
    DetailViewFieldSchema.dueLike unchanged no spec row (ruling 1 of the ACCEPT)
    field-metadata-deadline-by-reference-12297.test.ts present type Equal rows, a keyof CONTROL, a runtime half
    .changeset/12297-date-deadline-keys-by-reference.md present: @object-ui/types minor —
    a model name in the merge commit's message 0 —
    PNG files in the merge's diff 0 no screenshots on this card

    State change: the card closed as completed through Fixes #12297, and pm:dispatched is removed in this act. The cloud session session_01Qe458QJ3QyHSzgf9t1dDEH is archived.

    Records of this card:

    • the report relayed: 6230158528;
    • the ACCEPT: 6230165399;
    • the TIER_DEFAULT contract review: 6230173962 (PASS);
    • the landing note: 6230267513.

    Unblocked: objectui#11815 (the reader half: reading dueLike / settledWhen in the date cells and retiring the name regex) can restart against this declaration, and objectui#12726 waits on it.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions