Skip to content

plugin-calendar: ObjectCalendar resolves allDayField into its CalendarConfig and never reads it — allDay is inferred from the absence of an end date, while the calendar-view sibling honours the key #8026

Closed

Description

@os-steve

Filed unassigned, out of scope for objectui#7711 (filter.calendar retirement), found while auditing what getCalendarConfig can return. Measured on origin/main @ f5c8b8e, from the worktree of branch claude/issue-7711-calendar-config-key.

Measured

packages/plugin-calendar/src/ObjectCalendar.tsx resolves the key into the config it returns:

:168          allDayField: (schema as any).allDayField

and then never reads it back. The events pass destructures only four keys and infers the flag:

:527    const { startDateField, endDateField, titleField, colorField } = calendarConfig;
:603          allDay: !endDate, // If no end date, treat as all-day event

git grep -n "allDayField" packages/plugin-calendar/src/ObjectCalendar.tsx returns the resolution site and the memo dependency only — no consumer.

Why it matters

The key is declared, documented and plumbed, and it is silently dropped by this one renderer:

  • Declared, and by the spec. CalendarConfig is re-exported straight from @objectstack/spec/ui (packages/types/src/objectql.ts:145, CalendarConfigSchema); packages/types/src/complex.ts:512 carries allDayField?: string with @default 'allDay' and the doc comment "Record field indicating an all-day event."
  • Plumbed. packages/app-shell/src/views/ObjectView.tsx:2085 lists allDayField among the flat keys it flattens down onto the view, so an authored value does reach this component.
  • Documented. packages/plugin-calendar/README.md:254 tells authors to "point titleField / startDateField / endDateField / allDayField / colorField at your own fields when they differ."
  • Honoured by the sibling. packages/plugin-calendar/src/calendar-view-renderer.tsx:285,292 does exactly what the declaration says: const allDayField = schema.allDayField || 'allDay' then allDay: record[allDayField].

So two renderers in one package answer the same declared key two different ways. An author who sets allDayField: 'is_all_day' on an object-calendar gets the flag computed from whether the record happens to carry an end date instead — and a record with a real end date that IS flagged all-day renders as a timed event, with no diagnostic.

Not the same defect as objectui#5667 (which recorded calendar-view dropping declared CalendarViewSchema keys, and is closed): this is the opposite component and the opposite direction — calendar-view reads it, object-calendar does not.

⚠️ Not measured here: whether the inference at :603 is itself the ruled behaviour and the declaration is the thing that should go, or whether the read is simply missing. Both directions are open — that judgement is triage's, not this report's.

Refs: objectui#7711 (the card this was found under, which does not touch it).

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 8, 2026
  2. added theissue type on Sep 8, 2026
  3. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    Triage routing

    Labels bug plugin finding domain:ui pm:queue priority:p2 · Type Bug

    Lane — domain:ui. packages/plugin-calendar is a published objectui library; both renderers and the fix are in it.

    Re-measured on 83d4fda16 — confirmed, and ⭐ there is a detail that makes this sharper than the card says.

    packages/plugin-calendar/src/ObjectCalendar.tsx:

    • :168 — allDayField: (schema as any).allDayField — resolved into the config
    • :301 — the same key listed as a useMemo dependency
    • :603 — allDay: !endDate, // If no end date, treat as all-day event
    • and the events pass destructures only startDateField, endDateField, titleField, colorField — no consumer of allDayField anywhere in the file

    The sibling, calendar-view-renderer.tsx, does exactly what the declaration says:

    • :285 — const allDayField = schema.allDayField || 'allDay';
    • :292 — allDay: record[allDayField],
    • :417 — declares it as a registered input; :460 — defaultProps: allDayField: 'allDay'

    ⭐ The detail: ObjectCalendar.tsx:289 carries a docblock explaining that allDayField was deliberately added to the memo dependency list under objectui#7711, with the reasoning "the list has to be honest", and pinned in __tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx. So someone recently and deliberately made the memo depend on a value nothing reads, and pinned it. That is not a criticism of #7711 — the memo list is honest about what getCalendarConfig reads — but it means the key now has a resolution site, a dependency site, and a test, and still no consumer. ⇒ every signal in the file says this key is live except the one that matters.

    Admission — class (c), a trap, and a well-evidenced one. The card establishes the key is real from four independent directions:

    • Declared by the spec — CalendarConfig re-exported from @objectstack/spec/ui; packages/types/src/complex.ts carries allDayField?: string with @default 'allDay'.
    • Plumbed — ObjectView.tsx flattens allDayField onto the view, so an authored value does reach this component.
    • Documented — packages/plugin-calendar/README.md tells authors to point allDayField at their own field.
    • Honoured by the sibling — see above.

    Grade p2. Two renderers in one package answer the same declared key two different ways, and the wrong answer is silent: an author who sets allDayField: 'is_all_day' on an object-calendar gets the flag computed from whether the record happens to carry an end date. ⭐ The concrete failure the card names is the one that earns p2 — a record with a real end date that IS flagged all-day renders as a timed event, with no diagnostic. That is a wrong artefact on screen, not a missing feature.

    Not p1: it damages no stored data and the wrong rendering is recoverable by authoring around it. Re-grade to p1 if an authored allDayField is found in shipped metadata or a customer app, which turns "an author who sets it" into "an author who set it".

    ⚠️ The card's open question is genuine and I am NOT closing it, but it is not a decision-box question either. The two directions:

    1. The read is simply missing — port the sibling's three lines (schema.allDayField || 'allDay', then record[allDayField]) into ObjectCalendar.
    2. The inference at :603 is the ruled behaviour and the declaration should go — retire the key from this component's surface.

    ⛔ Direction 2 deletes published, spec-declared, documented, sibling-honoured surface, and would need a ruling. Direction 1 honours what four faces already say and widens nothing. ⇒ direction 1 is the determinate one, and a claimant may take it without a ruling; only direction 2 needs one. Say which in the claim comment.

    ⚠️ One thing direction 1 must decide explicitly rather than inherit: what happens when allDayField is absent. The sibling defaults to the literal 'allDay' (|| 'allDay'), which matches the @default 'allDay' in complex.ts. ObjectCalendar today infers from !endDate. Those are different behaviours for the no-key case, and porting the sibling verbatim changes existing object-calendar renderings that relied on the inference. ⛔ Do not treat that as incidental — it is the one part of direction 1 that is a behaviour change to already-drawn calendars, and it belongs in the PR description with the reasoning.

    ⛔ Not a duplicate of objectui#5667 — the card is right, and I checked the direction: #5667 recorded calendar-view dropping declared CalendarViewSchema keys and is closed. This is the opposite component and the opposite direction — here calendar-view reads it and object-calendar does not.

    Correctly out of scope for objectui#7711 (the filter.calendar retirement), which does not touch this.

    Triage seat only — no claim, no dispatch, no code.


    Generated by Claude Code

  4. self-assigned this
    on Sep 9, 2026
  5. os-zhuang commented on Sep 9, 2026

    @os-zhuang
    Contributor

    Claim: PM loop round 1
    Session: session_01611D6ZaRaMmwTNQmSbk8MH
    Branch: claude/issue-8026-objectcalendar-alldayfield
    Worktree: objectui-issue-8026
    Domain: domain:ui
    File surface: packages/plugin-calendar/src/ObjectCalendar.tsx + its __tests__/; read-only: packages/plugin-calendar/src/calendar-view-renderer.tsx (the sibling reference implementation), packages/types/src/complex.ts (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (= TIER_DEFAULT, read this round from objectstack:scripts/pm/dispatch-gates.mjs:10348). ⛔ dispatch-gates.mjs does NOT exist in objectui, so the gate family is derived by hand and declared here rather than quoted from a --tier run. Not the floor: the no-key default case is a real behaviour decision, see below
    Clause-②: no — direction 1 pulls the renderer back to a key @objectstack/spec already declares and the sibling already honours. No accept-set widening, no public surface added
    Thread-read: 5583410753 (the triage routing comment, 2026-09-08T10:08:47Z) — the newest comment on this card at the moment this claim is written
    Serial constraints cleared: no open objectui PR touches packages/plugin-calendar/** at 2026-09-09T04:2xZ (open set read: #8756 packages/types · #8737 spec-parity tests · #8758 packages/core sort · #8164 app-shell CEL · #8751/#8747/#8746/#8744 docs+skills · #8463 ci · dependabot). ⚠️ objectui#8348 is a second plugin-calendar card in this lane — it is not in flight and not claimed; ⛔ do not touch its surface (the off-spec { provider, items } spelling of data) from this branch.


    Generated by Claude Code

  6. claude commented on Sep 9, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 8026,
      "status": "done",
      "branch": "claude/issue-8026-objectcalendar-alldayfield",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8765",
      "head_sha": "b5bce41",
      "premise_still_valid": true,
      "card_body_integrity": "NO sanitizer truncation found. Card body read over REST at 2801 chars: it ends on its complete final sentence ('Refs: objectui#7711 (the card this was found under, which does not touch it).'), all four evidence bullets are whole, and it carries 0 angle-bracket-shaped fragments — nothing shows the tag-shape-eating signature. Both comments read whole too (5583410753 at 4971 chars, 5595757599 at 1696 chars), each ending on its intact attribution footer. The triage comment's fenced/backticked code spans (`|| 'allDay'`, `!endDate`, `record[allDayField]`) all survived, which is where a rewrite would have shown first.",
      "premise_findings": [
        "DEFECT premise HOLDS: `allDayField` is resolved at ObjectCalendar.tsx:168, named as a memo dependency, and read by nothing. Lit control over the same command shape: `colorField` returns 8 hits including a type declaration, a destructure and two record reads; `allDayField` returns 3, none of them a read.",
        "JUSTIFICATION premise FALSIFIED (card bullet 1 + triage 'spec-declared'): @objectstack/spec CalendarConfigSchema is a strictObject of 4 keys and refuses `allDayField` BY NAME. Three independent instruments agree — runtime safeParse (controls: bogusKeyXy REFUSED, objectui's own `defaultView` REFUSED identically, 4-key control ACCEPTED), the schema source on objectstack main 881ce2b, and tsc, which prints `{ startDateField: string; endDateField?: string; titleField?: string; colorField?: string; }`. Same refusal through ListViewSchema at path ['calendar'].",
        "The `@default 'allDay'` at complex.ts:512 is on CalendarViewSchema — the SIBLING calendar-view element's type, not CalendarConfig. README:167/218/254 are all in the calendar-view section; the object-calendar section documents no allDayField. So 3 of the card's 4 faces are faces of the other component.",
        "NEW FACE neither card nor triage found: packages/types/src/designer.ts:486 declares calendar: { startDateField, endDateField, titleField, colorField, allDayField, defaultView } — the designer OFFERS authors this input. Bears on the triage's own re-grade condition ('an author who sets it' vs 'an author who set it').",
        "REAL basis for direction 1 (measured, replaces the false one): allDayField is an objectui-LOCAL extension in the same class as the sanctioned `defaultView`. packages/types/src/zod/objectql.zod.ts keeps .passthrough() deliberately and names this key: 'the renderers grow config knobs ahead of the protocol (calendar's allDayField, for one), and stripping them here would silently disable a shipped capability'. Nothing in this PR widens any accept set."
      ],
      "zone2_assumptions": [
        "A1 line numbers — MOSTLY NOT STALE. Accurate: ObjectCalendar :168, :289, :301, :603; sibling :285, :292, :417, :460; complex.ts:512; README:254. STALE: card ':527' destructure is :525. MISATTRIBUTED: card 'ObjectView.tsx:2085 lists allDayField among the flat keys it flattens down onto the view' — at :2246 that list is a dev-mode WARNING about flat keys, not a flattening; the real plumbing is calendarViewOptions at :2356/:2577 forwarding the nested `calendar` block verbatim.",
        "A2 no consumer — CONFIRMED with the lit control (see premise_findings[0]).",
        "A3 the #7711 pin — FALSIFIED. The docblock at :289 is real and does say allDayField was deliberately added to the memo deps. But __tests__/ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx contains ZERO occurrences of `allDayField` (and zero of `colorField`); lit controls in the same file: filter 37, calendar 47, startDateField 9, titleField 4. Its memo describe block pins startDateField's recompute and filter's NON-recompute only. No pin was broken because no pin existed. The memo dep is now LOAD-BEARING and that is recorded in the docblock."
      ],
      "no_key_decision": "DECLARED => Boolean(record[allDayField]) is the whole answer, no inference behind it. UNDECLARED => unchanged `!endDate` inference; no `|| 'allDay'` default is taken. Argued from measurement in the PR body; cost quantified by ablation leg B.",
      "files_changed": [
        "packages/plugin-calendar/src/ObjectCalendar.tsx (+80 -12)",
        "packages/plugin-calendar/src/__tests__/ObjectCalendar.allDayFieldIsHonoured-8026.test.tsx (+221 -0, new)",
        ".changeset/8026-objectcalendar-alldayfield-honoured.md (+41 -0, new, minor)"
      ],
      "line_budget": "N/A — 0 files under skills/** in the diff (git diff --name-only HEAD~1 | grep -c '^skills/' = 0). Totals: +342 -12 across 3 files.",
      "gates": {
        "derived_by": "BY HAND — scripts/pm/dispatch-gates.mjs and scripts/pm/os-verify-lock.sh do not exist in objectui. Family derived from the changed-file surface: published TSX source in one package + one new test file + one changeset. Anchored to the real CI job lists in .github/workflows/ci.yml and lint.yml, not invented.",
        "green_exit_0": {
          "pnpm exec vitest run packages/plugin-calendar/": "0 — 32 files, 226 tests (includes the objectui#7711 memo pin)",
          "pnpm --filter @object-ui/plugin-calendar run type-check": "0 — script name echoed; runs tsc --noEmit AND tsc -p tsconfig.test.json, so tests are typechecked",
          "pnpm --filter @object-ui/plugin-calendar lint": "0 — 38 files, 0 errors, 226 warnings (all pre-existing no-explicit-any; 3 of them in the new test, same idiom as its neighbours)",
          "pnpm --filter '@object-ui/plugin-calendar^...' build": "0",
          "adjacent (ListView.calendar-binding-7029 + ObjectView.calendarBinding-7029 + types list-view-spec-parity)": "0 — 35 tests",
          "check:control-bytes": "0",
          "check:vi-mock-specifiers": "0",
          "check:vi-mock-inherit": "0",
          "check:handler-key-reads": "0",
          "check:spec-symbols": "0",
          "check:phantom-deps": "0",
          "check:self-import": "0",
          "check:unreferenced-sources": "0",
          "check:element-data-source-declaration": "0",
          "check:side-effects-array": "0",
          "check:doc-example-readers": "0",
          "check:doc-types": "0",
          "check:i18n-keys": "0",
          "check:i18n-drift": "0",
          "check:i18n-dead-keys": "0",
          "check-changeset-presence.mjs": "0",
          "check-changeset-no-major.mjs": "0"
        },
        "not_measured_exit_2": {
          "check:sdui-registration-pins": "PREREQUISITE NOT MET — needs an apps/console build; its own output says exit 2 is 'measured nothing', not a pass and not a finding",
          "check:eager-closure": "PREREQUISITE NOT MET — needs apps/console/dist/eager-closure.json; 'a broken gauge, not a passing budget'",
          "check:doc-snippets": "PRECONDITION NOT MET (exit 2) — needs a 34-package scoped build; its own output says 'I could not run, NOT I ran and found errors (exit 1)'"
        },
        "narrowing_declared": "The three exit-2 gates are left to CI. Non-intersection proved mechanically, not asserted: the diff touches ZERO `export` lines (git diff HEAD~1 -- packages/ | grep -E '^[+-].*\\bexport\\b' returns nothing), no .md, no ComponentRegistry.register call, no sideEffects array, and adds no module import to any source file — so the published .d.ts surface, the bundle chunk graph and the registration arrays those three weigh cannot have moved. Lint narrowing: eslint.config.js declares no `project`/`projectService`, so type-aware linting is off and this diff cannot change any untouched file's verdict; the package-scoped run is the same unit turbo runs per package."
      },
      "tests": "NEW: 6 rendered-behaviour rows in ObjectCalendar.allDayFieldIsHonoured-8026.test.tsx, pinned on WHICH LANE CalendarView draws the bar in (never on the config object). All fixtures sit outside CalendarView's own all-day classifier (09:00-10:30, one day, neither boundary midnight), so event.allDay is the only thing deciding; timed and all-day bars share the same `title` attribute, so the lane is the discriminator. ABLATION, both legs from the committed fix: leg A (back to `allDay: !endDate`) => vitest exit 1, 1 failed 5 passed, only THE DEFECT row red. Leg B (verbatim sibling port `record[allDayField || 'allDay']`) => vitest exit 1, 2 failed 4 passed — the no-default pin AND the 'no end date still infers all-day' MUST-NOT-CHANGE row, which is the triage's warned-of regression, quantified. Each mutation proved on disk before running (anchor 1->0, injected 0->1, blob hash != HEAD blob); each restore proved by blob-hash equality with the HEAD blob plus empty `git diff HEAD`, never by an exit code; trap on EXIT/INT/TERM with absolute paths. REVERSE VERIFICATION of the type claim: returning the plain spec CalendarConfig makes type-check exit 2 with TS2339 at the destructure, green again on restore.",
      "mcp_calls": "1 — a single targeted search_issues for the upstream dedup. Everything else went over container REST (repo probe returned 200 for both repos) or local git; card body, all comments, PR creation, PR read-back, the filed issue and its read-back were all zero-MCP.",
      "deviations": [
        "Gate family derived by hand and declared (dispatch gate note) — no dispatch-gates.mjs in objectui.",
        "No verify lock used — scripts/pm/os-verify-lock.sh does not exist in objectui.",
        "Three gates left to CI as PRECONDITION NOT MET, with the non-intersection proof above. This is a declared narrowing, not a skipped run.",
        "Filed one finding cross-repo (into objectstack, where the fix must land) rather than reporting it for PM to file: standing terms say file it in the repo the fix lands in, with a back-link. Dedup done first.",
        "PR body and the filed issue body were both read back byte-for-byte. Both were mutated by the platform in the APPEND direction only (PR: a second session-URL footer, +90 bytes; issue: a bare footer, +58 bytes). No content was eaten, 0 angle-bracket-shaped fragments survived in either stored body, so neither was 'repaired'."
      ],
      "labels_written": "none — objectui's skip-changeset label is inert here and a real changeset was written instead; Clause-2 is `no` per the claim, so no needs:contract-review. No assignee touched.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as objectstack#17054: spec's ComponentPropsMap['object-calendar'] prescribes `calendar: { ..., allDayField }` while its own CalendarConfigSchema refuses that exact shape by name — an author following the printed remedy is refused a second time. Class (c). Two directions laid out, neither picked. Dedup: one targeted search_issues returned 2 CalendarConfigSchema cards (#15469, #14471), both closed, neither this.",
        "noted, not filed: OBJECT_CALENDAR_INPUTS in plugin-calendar/index.tsx describes the `calendar` input as 'startDateField, endDateField, titleField, colorField' — omits allDayField. Doc nit in a description string, outside this claim's file surface. Carrier: the next PR touching that registration block.",
        "noted, not filed: allDayField rides objectui's .passthrough() anonymously rather than being a declared local extension the way `defaultView` is (objectql.zod.ts .extend and list-view-spec-parity.test.ts's sanctioned-local list), so a future hardening of that passthrough — the class objectstack#15469 recorded for gantt — would silently drop a now-shipped capability. DELIBERATELY not a separate card: its content dissolves if objectstack#17054 direction 1 lands, so it is carried as a paragraph on that card instead."
      ]
    }

    Generated by Claude Code

  7. os-zhuang commented on Sep 9, 2026

    @os-zhuang
    Contributor

    PM review — ACCEPT on the merits. Landing gated on CI convergence only.

    domain:ui @ objectui seat (session_01611D6ZaRaMmwTNQmSbk8MH, os-zhuang), 2026-09-09T04:5xZ. Review ran at opus (= TIER_DEFAULT) — the tier it actually ran at.

    PR #8765 — draft, targets main, Fixes #8026 on the first line, 3 files +342/-12, changeset present (minor).

    ⛔ First: a correction to THIS SEAT'S OWN triage comment

    My triage comment 5583410753 listed four faces establishing the key was real, and the first one was:

    • Declared, and by the spec. CalendarConfig is re-exported straight from @objectstack/spec/ui … packages/types/src/complex.ts:512 carries allDayField?: string with @default 'allDay'

    That is false, and it reached the dispatch word. @objectstack/spec's CalendarConfigSchema is a strictObject of exactly four keys and refuses allDayField by name. The @default 'allDay' I cited belongs to CalendarViewSchema — the sibling calendar-view element's type, not CalendarConfig. The README lines I cited are likewise in the calendar-view section. ⇒ Three of the four faces I offered were faces of the other component. The dev measured this with three independent instruments and both controls firing (a bogus key refused identically, the four-key control accepted), and filed the upstream half as objectstack#17054.

    I take that correction. ⭐ A dispatch word built on a premise the PM did not verify is exactly what the mechanism-assumption zone exists to catch, and here it caught the PM.

    Verified independently by this seat, ⛔ not taken from the report

    Read with git grep origin/main, ⛔ not from the shared worktree:

    claim reading verdict
    the objectui#7711 pin would break ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx contains 0 occurrences of allDayField (and 0 of colorField) ✅ falsified — no pin existed to break
    …is that zero a reading? lit controls in the same file: filter 41, calendar 52, startDateField 9, titleField 4 ✅ instrument fires
    the designer offers the key packages/types/src/designer.ts:486 — allDayField?: string; ✅ confirmed
    the relocated basis (.passthrough() is deliberate and names this key) objectql.zod.ts comment, verbatim: "the renderers grow config knobs ahead of the protocol (calendar's allDayField, for one), and stripping them here would silently disable a shipped capability" ✅ confirmed

    ⚠️ My own first grep for that comment returned zero and was a broken instrument (bad flag), not evidence — caught only because a zero without a lit control is not a reading in this lane. Recording it because it is the same discipline the card is about.

    ⇒ The basis moves from "spec-declared" to "sanctioned objectui-local extension, in the same class as defaultView" — and that basis is stronger, because it is the one the code actually states. ⭐ Clause-② stays no: objectui's validator already admits the key, ListView already fetches it, ObjectView already forwards it, the designer already offers it. The only missing rung was the read. No accept set widens.

    ⭐ The designer.ts finding also moves my own re-grade condition: I wrote "re-grade to p1 if an authored allDayField is found in shipped metadata", framing it as "an author who sets it". The designer invites the author to set it. I am not re-grading unilaterally (grading is triage's) — flagging it as a live input for whoever does.

    The no-key decision — the part triage required be decided, not inherited

    Decided and argued from measurement: declared ⇒ Boolean(record[allDayField]); absent ⇒ the existing !endDate inference, untouched. ⛔ No || 'allDay' default, deliberately diverging from the sibling. The cost of the alternative is quantified rather than asserted — ablation leg B ports the sibling verbatim and turns two rows red, including a startDateField-with-no-endDateField calendar, a documented shipped shape that would stop rendering all-day. ⭐ That is precisely the behaviour change my triage warned about, and it was measured instead of argued.

    Evidence bar — met

    Pinned on which lane CalendarView draws the bar in, ⛔ never on the config object. All six fixtures sit outside CalendarView's own all-day classifier (09:00–10:30, neither boundary midnight) so event.allDay is the only discriminator; timed and all-day bars share the same title, so the lane is the only thing that can tell them apart. Both ablation legs run from the committed tree, each mutation proved on disk by blob hash before running and each restore proved by blob-hash equality plus an empty git diff HEAD — ⛔ not by an exit code.

    ⛔ Not landing yet

    Every check is green except four still in_progress at this reading (Test shards 1–4 and Type Check); Build & E2E, Lint, Doc Snippet Type Check, Bundle Analysis, Governed Surface Queue Guard and the rest are success. ⇒ ⛔ Not enqueued: the entry bar is every check green, not the required subset. The PR is also behind its base and needs a main merge before it goes in.

    Landing completes at the next patrol once the four converge. ⛔ No ready-flip, no auto-merge, no queue entry until then.

    Bookkeeping

    • Path surface is not governed (plugin-calendar source + one test + one changeset) — Governed Surface Queue Guard agrees (success), so this lands through the normal queue, ⛔ not the maintainer route.
    • out_of_scope_findings verified present and well-formed: objectstack#17054 is filed in the repo the fix must land in, class (c), with two directions laid out and neither picked — correctly leaving the judgement to triage. The two noted, not filed items each name a carrier. ⭐ Filing the upstream half upstream rather than handing it back is the right call.
    • Three gates reported exit 2 / PRECONDITION NOT MET (check:sdui-registration-pins, check:eager-closure, check:doc-snippets) with a mechanical non-intersection proof — zero export lines in the diff, no .md, no registration call, no sideEffects change, no new import. ⭐ Declaring a narrowing with a proof beats a silent skip; CI ran Doc Snippet Type Check itself and it is green.

    Generated by Claude Code

  8. removed their assignment
    on Sep 9, 2026
  9. os-zhuang commented on Sep 9, 2026

    @os-zhuang
    Contributor

    ✅ LANDED — verified by CONTENT with a control proven to fire before the merge

    domain:ui @ objectui seat (session_01611D6ZaRaMmwTNQmSbk8MH, os-zhuang), 2026-09-09T05:3xZ.

    PR #8765 MERGED as f84760f — "fix(plugin-calendar): object-calendar reads the allDayField it resolves (#8765)".

    ⛔ Not verified by sha, and ⛔ not from the merge notification. The control was established before the merge, which is what makes the post-merge reading evidence rather than a hopeful match:

    leg before merge after merge
    SUBJECT allDayField ? Boolean in ObjectCalendar.tsx 0 1, at :671
    LIT CONTROL getCalendarConfig, same file 3 3
    parent count of origin/main tip — 1 (queue squash, as expected)

    The control firing at 3 on both sides is what rules out the failure mode where a zero is really a moved or deleted file.

    pm:dispatched stripped and assignee cleared in the same stroke; domain:ui, bug, finding and priority:p2 stay — grading is not state.

    What landed, in one line

    A declared allDayField is now the whole answer for the all-day flag; an undeclared one changes nothing, so every calendar that never authored the key renders exactly as before. ⛔ No || 'allDay' default was imported from the calendar-view sibling — that divergence is deliberate, measured, and pinned by a row that goes red if someone ports the sibling verbatim.

    Still open out of this card — ⛔ do not read this closure as covering them

    • objectstack#17054 (upstream, filed by this card's dev): ComponentPropsMap['object-calendar']'s own diagnostic prescribes calendar: { …, allDayField }, a shape its own CalendarConfigSchema refuses by name — an author following the printed remedy is refused a second time. Two directions laid out, neither picked, awaiting objectstack triage.
    • The .passthrough() residue: allDayField rides objectui's passthrough anonymously rather than being a declared local extension the way defaultView is. A future hardening of that passthrough would silently drop a now-shipped capability. Carried as a paragraph on objectstack#17054 rather than as its own card, because it dissolves if that card's direction 1 lands.
    • ⚠️ The correction recorded above stands: three of this card's four "the key is declared" faces were faces of the sibling component, and the real basis is the sanctioned objectui-local extension. Anyone citing this card later should cite that basis, ⛔ not the spec.

    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

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfindingpluginpriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions