Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

Description

@os-project-manager

Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


⏳ Time-critical: (1) closes at the next release

Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

(1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

  • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
  • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
  • The export list omits the type NonGridCeilingResult. ⇒ add it.

(2) Two row-ceiling pins do not grade the cap they are named for

packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

(3) Two pin docblocks state a reverse-verification mechanism that is false

  • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
  • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
  • The calendar and map docblocks make the same "red at the footnote" claim.

The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

(4) Calendar external-data sync leaves rowCeiling stale

packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

(5) The false dependency comment — packages/react/src/index.ts:100-104

It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

(6) Stale headroom comment

packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


Fences

  • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
  • ⛔ No test may be skipped, disabled or quarantined to get green.
  • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
  • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

Activity

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

Metadata

Metadata

Labels

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

    Description

    @os-project-manager

    Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

    This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


    ⏳ Time-critical: (1) closes at the next release

    Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

    (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

    • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
    • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
    • The export list omits the type NonGridCeilingResult. ⇒ add it.

    (2) Two row-ceiling pins do not grade the cap they are named for

    packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

    Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

    ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

    (3) Two pin docblocks state a reverse-verification mechanism that is false

    • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
    • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
    • The calendar and map docblocks make the same "red at the footnote" claim.

    The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

    (4) Calendar external-data sync leaves rowCeiling stale

    packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

    (5) The false dependency comment — packages/react/src/index.ts:100-104

    It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

    The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

    ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

    (6) Stale headroom comment

    packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


    Fences

    • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
    • ⛔ No test may be skipped, disabled or quarantined to get green.
    • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
    • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

    Activity

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

    Metadata

    Metadata

    Labels

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

      Description

      @os-project-manager

      Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

      This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


      ⏳ Time-critical: (1) closes at the next release

      Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

      (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

      • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
      • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
      • The export list omits the type NonGridCeilingResult. ⇒ add it.

      (2) Two row-ceiling pins do not grade the cap they are named for

      packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

      Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

      ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

      (3) Two pin docblocks state a reverse-verification mechanism that is false

      • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
      • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
      • The calendar and map docblocks make the same "red at the footnote" claim.

      The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

      (4) Calendar external-data sync leaves rowCeiling stale

      packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

      (5) The false dependency comment — packages/react/src/index.ts:100-104

      It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

      The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

      ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

      (6) Stale headroom comment

      packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


      Fences

      • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
      • ⛔ No test may be skipped, disabled or quarantined to get green.
      • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
      • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

      Activity

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

      Metadata

      Metadata

      Labels

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

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

        Description

        @os-project-manager

        Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

        This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


        ⏳ Time-critical: (1) closes at the next release

        Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

        (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

        • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
        • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
        • The export list omits the type NonGridCeilingResult. ⇒ add it.

        (2) Two row-ceiling pins do not grade the cap they are named for

        packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

        Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

        ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

        (3) Two pin docblocks state a reverse-verification mechanism that is false

        • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
        • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
        • The calendar and map docblocks make the same "red at the footnote" claim.

        The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

        (4) Calendar external-data sync leaves rowCeiling stale

        packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

        (5) The false dependency comment — packages/react/src/index.ts:100-104

        It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

        The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

        ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

        (6) Stale headroom comment

        packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


        Fences

        • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
        • ⛔ No test may be skipped, disabled or quarantined to get green.
        • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
        • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

        Activity

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

        Metadata

        Metadata

        Labels

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

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

          Description

          @os-project-manager

          Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

          This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


          ⏳ Time-critical: (1) closes at the next release

          Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

          (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

          • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
          • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
          • The export list omits the type NonGridCeilingResult. ⇒ add it.

          (2) Two row-ceiling pins do not grade the cap they are named for

          packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

          Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

          ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

          (3) Two pin docblocks state a reverse-verification mechanism that is false

          • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
          • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
          • The calendar and map docblocks make the same "red at the footnote" claim.

          The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

          (4) Calendar external-data sync leaves rowCeiling stale

          packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

          (5) The false dependency comment — packages/react/src/index.ts:100-104

          It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

          The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

          ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

          (6) Stale headroom comment

          packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


          Fences

          • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
          • ⛔ No test may be skipped, disabled or quarantined to get green.
          • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
          • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

          Activity

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

          Metadata

          Metadata

          Labels

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

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

            Description

            @os-project-manager

            Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

            This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


            ⏳ Time-critical: (1) closes at the next release

            Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

            (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

            • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
            • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
            • The export list omits the type NonGridCeilingResult. ⇒ add it.

            (2) Two row-ceiling pins do not grade the cap they are named for

            packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

            Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

            ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

            (3) Two pin docblocks state a reverse-verification mechanism that is false

            • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
            • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
            • The calendar and map docblocks make the same "red at the footnote" claim.

            The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

            (4) Calendar external-data sync leaves rowCeiling stale

            packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

            (5) The false dependency comment — packages/react/src/index.ts:100-104

            It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

            The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

            ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

            (6) Stale headroom comment

            packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


            Fences

            • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
            • ⛔ No test may be skipped, disabled or quarantined to get green.
            • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
            • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

            Activity

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

            Metadata

            Metadata

            Labels

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

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

              Description

              @os-project-manager

              Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

              This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


              ⏳ Time-critical: (1) closes at the next release

              Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

              (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

              • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
              • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
              • The export list omits the type NonGridCeilingResult. ⇒ add it.

              (2) Two row-ceiling pins do not grade the cap they are named for

              packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

              Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

              ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

              (3) Two pin docblocks state a reverse-verification mechanism that is false

              • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
              • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
              • The calendar and map docblocks make the same "red at the footnote" claim.

              The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

              (4) Calendar external-data sync leaves rowCeiling stale

              packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

              (5) The false dependency comment — packages/react/src/index.ts:100-104

              It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

              The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

              ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

              (6) Stale headroom comment

              packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


              Fences

              • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
              • ⛔ No test may be skipped, disabled or quarantined to get green.
              • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
              • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

              Activity

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

              Metadata

              Metadata

              Labels

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

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                Post-merge correctives to #7391: two row-ceiling pins don't grade the cap, two docblocks name the wrong discriminator, changeset level+copy, calendar stale ceiling #7507

                Description

                @os-project-manager

                Filed from the post-hoc contract audit of merged PR #7391 (verbatim at objectui#7391 comment 5527977938; auditor tier-verified claude-fable-5-1, 75/75 turns, no fallback). That PR landed without its Clause-② review — three consecutive HTTP 529 deaths killed the commissioned review and another actor flipped it ready and merged it — so the review ran afterwards as an audit and its findings are already in main.

                This card carries the unforked correctives. The one genuine design fork the audit raised — the five symbols published on @object-ui/react's sole entry, against ruling a′'s "the constant is internal" — is a separate card and is ⛔ not part of this one.


                ⏳ Time-critical: (1) closes at the next release

                Both .changeset/ files are still pending on origin/main. Once released, the semver level is frozen into the per-package CHANGELOG and cannot be corrected without a lie or a note. Do (1) first.

                (1) Changeset level and copy — .changeset/7210-non-grid-row-ceiling.md

                • plugin-gantt / plugin-calendar / plugin-map / plugin-tree declare patch, but they carry the user-visible break: result sets above 2000 rows are no longer fully drawn. Policy is minor-with-the-break-spelled-out. The fixed group makes the released version identical either way — the defect is that the CHANGELOG will file a behaviour break under "Patch Changes". ⇒ flip the four to minor.
                • The example reads Showing the first 2,000 of 41,234 recordsseparators the note never renders. The i18next config carries no format, and the provider-less fallback uses String(v); the unit test's toContain('41234') passing is the proof. ⇒ change the example to the rendered copy: Showing the first 2000 of 41234 records.
                • The export list omits the type NonGridCeilingResult. ⇒ add it.

                (2) Two row-ceiling pins do not grade the cap they are named for

                packages/plugin-map/src/ObjectMap.rowCeiling-7210.test.tsx and packages/plugin-calendar/src/ObjectCalendar.rowCeiling-7210.test.tsx.

                Measured: mutating setData(capped.rows)setData((result as any).data ?? capped.rows) in both — so 2001 rows are drawn while $top and the note stay intact — leaves both pins green, 4/4. They pin the $top and the footnote, not "draws at most N". Ruling a′'s pin is explicit: "the DOM row count equals the ceiling".

                ⇒ Assert the count handed to the child equals NON_GRID_ROW_CEILING in the above-ceiling case — marker/cluster input for the map, events for the calendar — the way the gantt pin already does via its stubbed child. The mutation above is the ablation: state the prediction first, then show both pins going red under it and green after restore.

                (3) Two pin docblocks state a reverse-verification mechanism that is false

                • packages/plugin-gantt/src/…/ObjectGantt.rowCeiling-7210.test.tsx:29-33 predicts that deleting $top fails "at the FOOTNOTE assertion". Measured: it fails at the $top assertion (:128). The adapter returns everything, the helper slices, and the note still renders.
                • ObjectTree.rowCeiling-7210.test.tsx:24-28 predicts failure "at BOTH the row count and the footnote". Measured: :98 ($top) only — the row count stays 2000.
                • The calendar and map docblocks make the same "red at the footnote" claim.

                The pins are not vacuous; the stated mechanism is simply wrong, which is worse than silence because the next reader trusts it. ⇒ rewrite to what actually happens: red at the $top assertion; the note still renders because the helper slices whatever arrives.

                (4) Calendar external-data sync leaves rowCeiling stale

                packages/plugin-calendar/src/ObjectCalendar.tsx:344-347 is the one setData path that does not also setRowCeiling({ truncated: false }). Latent today (ObjectView passes data from mount, so the stale state is never reached), one-line corrective. Pin it: a component that first draws a truncated fetch and then receives a short external data must drop the note.

                (5) The false dependency comment — packages/react/src/index.ts:100-104

                It reads that @object-ui/react is "the only package all four already depend on". Measured false: packages/plugin-{gantt,calendar,map,tree}/package.json each also list @object-ui/core, @object-ui/components and @object-ui/types.

                The real reason was the dispatching seat's same-round barrel fence (#7210 comment 5511301369 — core owned by #7349, types+components by #7182). ⇒ rewrite the comment to state the true reason, and cross-link the decision card below so the next reader finds the open question rather than a settled-sounding rationale.

                ⚠️Comment only. ⛔ Do not move, rename or unpublish any of the five symbols in this PR — that is the decision card's scope.

                (6) Stale headroom comment

                packages/i18n/src/locales/*.ts still says "~1 KB of headroom"; #7399 moved the framework chunk to ~8.3 KB of headroom against its ceiling. One-line refresh.


                Fences

                • ⛔ Nothing in this card touches the published surface of @object-ui/react. Findings ①(b), ② and ③ of the audit — relocating the non-React half to @object-ui/core, retiring NON_GRID_ROW_CEILING_TOP behind a query helper, reshaping NonGridRowCeilingNote to take NonGridCeilingResult — are all on the decision card and are ⛔ out of scope here.
                • ⛔ No test may be skipped, disabled or quarantined to get green.
                • The audit's finding ⑥ (the merge-reshaped expandFls-7230 assertion) is a resolution, not a weakening — verified in both directions, no FLS regression can pass it silently. ⛔ No action; do not "fix" it.
                • Boundary notes recorded by the audit, not defects and not in scope: ObjectMap still runs two queries per load (schema in deps); under ObjectView/ListView the calendar and map draw the host's $top: 100 page and never engage the ceiling; applyNonGridRowCeiling's total is not provenance-safe against a server that omits total (data-objectstack fabricates total = records.length, so such a server would render "first 2000 of 2001").

                Activity

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

                Metadata

                Metadata

                Labels

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

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions