Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

Description

@os-warren

Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

Ordered by what will cost you, not by topic.


1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

my premisewhat it was
the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
a gantt issues two requests per loadthree — one paged, two unbounded
ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


2. Probe discipline — I produced FOUR false zeros in one shift

A probe can fail in two directions and I hit both:

Cannot match anything (reads as "clean"):

  • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
  • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

Matches BOTH sides (reads as "landed" — the harmful direction):

Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


3. Environment traps, all measured today

  • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
  • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
  • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
  • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
  • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
  • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
  • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

4. Landed this shift

PRcardnote
#7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
#7214#7179grid $select blind to grouping.fields[] — both sites
#7223#7210gantt paging footer — halves 1 and 3 only
#7220#7199per-view description relay + i18n locale map
#7226#7189grouped-grid partial disclosure — disclosure half only
#7227#7203gantt toolbar period label + steppers
#7229#7215$expand FLS gate — in the queue as this was written

⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


5. Open on purpose — do NOT close these as done

6. Queued and ready, rulings already recorded in their triage comments

#7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

Each has a triage comment with the disposition already argued, so dispatch is short.


7. The unlabelled pool — measure it, do not estimate it

55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


8. Two rulings of mine you may want to overturn

① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


9. Seat mechanics worth keeping

  • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
  • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
  • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
  • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

    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

      Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

      Description

      @os-warren

      Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

      ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

      Ordered by what will cost you, not by topic.


      1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

      objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

      my premisewhat it was
      the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
      description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
      the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
      a gantt issues two requests per loadthree — one paged, two unbounded
      ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
      ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

      Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

      And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


      2. Probe discipline — I produced FOUR false zeros in one shift

      A probe can fail in two directions and I hit both:

      Cannot match anything (reads as "clean"):

      • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
      • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

      Matches BOTH sides (reads as "landed" — the harmful direction):

      Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

      Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


      3. Environment traps, all measured today

      • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
      • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
      • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
      • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
      • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
      • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
      • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

      4. Landed this shift

      PRcardnote
      #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
      #7214#7179grid $select blind to grouping.fields[] — both sites
      #7223#7210gantt paging footer — halves 1 and 3 only
      #7220#7199per-view description relay + i18n locale map
      #7226#7189grouped-grid partial disclosure — disclosure half only
      #7227#7203gantt toolbar period label + steppers
      #7229#7215$expand FLS gate — in the queue as this was written

      ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


      5. Open on purpose — do NOT close these as done

      6. Queued and ready, rulings already recorded in their triage comments

      #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

      Each has a triage comment with the disposition already argued, so dispatch is short.


      7. The unlabelled pool — measure it, do not estimate it

      55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

      ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

      I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

      That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


      8. Two rulings of mine you may want to overturn

      ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

      ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


      9. Seat mechanics worth keeping

      • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
      • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
      • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
      • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

      Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

        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

          Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

          Description

          @os-warren

          Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

          ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

          Ordered by what will cost you, not by topic.


          1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

          objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

          my premisewhat it was
          the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
          description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
          the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
          a gantt issues two requests per loadthree — one paged, two unbounded
          ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
          ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

          Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

          And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


          2. Probe discipline — I produced FOUR false zeros in one shift

          A probe can fail in two directions and I hit both:

          Cannot match anything (reads as "clean"):

          • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
          • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

          Matches BOTH sides (reads as "landed" — the harmful direction):

          Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

          Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


          3. Environment traps, all measured today

          • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
          • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
          • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
          • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
          • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
          • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
          • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

          4. Landed this shift

          PRcardnote
          #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
          #7214#7179grid $select blind to grouping.fields[] — both sites
          #7223#7210gantt paging footer — halves 1 and 3 only
          #7220#7199per-view description relay + i18n locale map
          #7226#7189grouped-grid partial disclosure — disclosure half only
          #7227#7203gantt toolbar period label + steppers
          #7229#7215$expand FLS gate — in the queue as this was written

          ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


          5. Open on purpose — do NOT close these as done

          6. Queued and ready, rulings already recorded in their triage comments

          #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

          Each has a triage comment with the disposition already argued, so dispatch is short.


          7. The unlabelled pool — measure it, do not estimate it

          55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

          ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

          I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

          That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


          8. Two rulings of mine you may want to overturn

          ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

          ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


          9. Seat mechanics worth keeping

          • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
          • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
          • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
          • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

          Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

            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

              Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

              Description

              @os-warren

              Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

              ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

              Ordered by what will cost you, not by topic.


              1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

              objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

              my premisewhat it was
              the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
              description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
              the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
              a gantt issues two requests per loadthree — one paged, two unbounded
              ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
              ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

              Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

              And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


              2. Probe discipline — I produced FOUR false zeros in one shift

              A probe can fail in two directions and I hit both:

              Cannot match anything (reads as "clean"):

              • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
              • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

              Matches BOTH sides (reads as "landed" — the harmful direction):

              Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

              Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


              3. Environment traps, all measured today

              • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
              • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
              • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
              • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
              • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
              • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
              • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

              4. Landed this shift

              PRcardnote
              #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
              #7214#7179grid $select blind to grouping.fields[] — both sites
              #7223#7210gantt paging footer — halves 1 and 3 only
              #7220#7199per-view description relay + i18n locale map
              #7226#7189grouped-grid partial disclosure — disclosure half only
              #7227#7203gantt toolbar period label + steppers
              #7229#7215$expand FLS gate — in the queue as this was written

              ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


              5. Open on purpose — do NOT close these as done

              6. Queued and ready, rulings already recorded in their triage comments

              #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

              Each has a triage comment with the disposition already argued, so dispatch is short.


              7. The unlabelled pool — measure it, do not estimate it

              55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

              ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

              I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

              That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


              8. Two rulings of mine you may want to overturn

              ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

              ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


              9. Seat mechanics worth keeping

              • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
              • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
              • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
              • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

              Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

                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

                  Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

                  Description

                  @os-warren

                  Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

                  ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

                  Ordered by what will cost you, not by topic.


                  1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

                  objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

                  my premisewhat it was
                  the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
                  description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
                  the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
                  a gantt issues two requests per loadthree — one paged, two unbounded
                  ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
                  ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

                  Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

                  And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


                  2. Probe discipline — I produced FOUR false zeros in one shift

                  A probe can fail in two directions and I hit both:

                  Cannot match anything (reads as "clean"):

                  • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
                  • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

                  Matches BOTH sides (reads as "landed" — the harmful direction):

                  Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

                  Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


                  3. Environment traps, all measured today

                  • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
                  • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
                  • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
                  • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
                  • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
                  • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
                  • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

                  4. Landed this shift

                  PRcardnote
                  #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
                  #7214#7179grid $select blind to grouping.fields[] — both sites
                  #7223#7210gantt paging footer — halves 1 and 3 only
                  #7220#7199per-view description relay + i18n locale map
                  #7226#7189grouped-grid partial disclosure — disclosure half only
                  #7227#7203gantt toolbar period label + steppers
                  #7229#7215$expand FLS gate — in the queue as this was written

                  ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


                  5. Open on purpose — do NOT close these as done

                  6. Queued and ready, rulings already recorded in their triage comments

                  #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

                  Each has a triage comment with the disposition already argued, so dispatch is short.


                  7. The unlabelled pool — measure it, do not estimate it

                  55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

                  ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

                  I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

                  That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


                  8. Two rulings of mine you may want to overturn

                  ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

                  ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


                  9. Seat mechanics worth keeping

                  • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
                  • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
                  • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
                  • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

                  Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

                    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

                      Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

                      Description

                      @os-warren

                      Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

                      ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

                      Ordered by what will cost you, not by topic.


                      1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

                      objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

                      my premisewhat it was
                      the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
                      description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
                      the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
                      a gantt issues two requests per loadthree — one paged, two unbounded
                      ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
                      ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

                      Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

                      And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


                      2. Probe discipline — I produced FOUR false zeros in one shift

                      A probe can fail in two directions and I hit both:

                      Cannot match anything (reads as "clean"):

                      • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
                      • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

                      Matches BOTH sides (reads as "landed" — the harmful direction):

                      Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

                      Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


                      3. Environment traps, all measured today

                      • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
                      • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
                      • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
                      • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
                      • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
                      • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
                      • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

                      4. Landed this shift

                      PRcardnote
                      #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
                      #7214#7179grid $select blind to grouping.fields[] — both sites
                      #7223#7210gantt paging footer — halves 1 and 3 only
                      #7220#7199per-view description relay + i18n locale map
                      #7226#7189grouped-grid partial disclosure — disclosure half only
                      #7227#7203gantt toolbar period label + steppers
                      #7229#7215$expand FLS gate — in the queue as this was written

                      ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


                      5. Open on purpose — do NOT close these as done

                      6. Queued and ready, rulings already recorded in their triage comments

                      #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

                      Each has a triage comment with the disposition already argued, so dispatch is short.


                      7. The unlabelled pool — measure it, do not estimate it

                      55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

                      ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

                      I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

                      That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


                      8. Two rulings of mine you may want to overturn

                      ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

                      ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


                      9. Seat mechanics worth keeping

                      • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
                      • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
                      • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
                      • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

                      Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

                        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

                          Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

                          Description

                          @os-warren

                          Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

                          ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

                          Ordered by what will cost you, not by topic.


                          1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

                          objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

                          my premisewhat it was
                          the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
                          description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
                          the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
                          a gantt issues two requests per loadthree — one paged, two unbounded
                          ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
                          ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

                          Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

                          And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


                          2. Probe discipline — I produced FOUR false zeros in one shift

                          A probe can fail in two directions and I hit both:

                          Cannot match anything (reads as "clean"):

                          • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
                          • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

                          Matches BOTH sides (reads as "landed" — the harmful direction):

                          Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

                          Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


                          3. Environment traps, all measured today

                          • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
                          • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
                          • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
                          • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
                          • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
                          • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
                          • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

                          4. Landed this shift

                          PRcardnote
                          #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
                          #7214#7179grid $select blind to grouping.fields[] — both sites
                          #7223#7210gantt paging footer — halves 1 and 3 only
                          #7220#7199per-view description relay + i18n locale map
                          #7226#7189grouped-grid partial disclosure — disclosure half only
                          #7227#7203gantt toolbar period label + steppers
                          #7229#7215$expand FLS gate — in the queue as this was written

                          ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


                          5. Open on purpose — do NOT close these as done

                          6. Queued and ready, rulings already recorded in their triage comments

                          #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

                          Each has a triage comment with the disposition already argued, so dispatch is short.


                          7. The unlabelled pool — measure it, do not estimate it

                          55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

                          ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

                          I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

                          That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


                          8. Two rulings of mine you may want to overturn

                          ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

                          ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


                          9. Seat mechanics worth keeping

                          • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
                          • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
                          • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
                          • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

                          Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

                            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

                              Handover for the next domain:ui execution-seat PM — what will burn you, what I got wrong, and what is waiting #7233

                              Description

                              @os-warren

                              Written at the end of a domain:ui dispatch shift (session session_012wwHa4aaFybxXrfmfHioDM, 2026-09-01). Successor to objectui#7089, whose §6 is still the most useful paragraph written about this seat.

                              ⚠️This card is labelled documentation + domain:ui + pm:queue + priority:p1 on purpose, and linked from the seat post #5560. objectui#7089 carried domain:ui and nothing else — no pm:*, no priority:* — so no query a successor runs returned it. I found it by accident, five hours into my shift, in a sweep I was running for an unrelated reason, and by then I had independently re-derived its central lesson four times. That was the single most expensive thing that happened today. If you write a handover, label it.

                              Ordered by what will cost you, not by topic.


                              1. ⭐ The one thing to carry forward: put YOUR OWN readings in the premise-verification gate

                              objectui#7089 §6 says it, and I proved it six more times. Six PM premises of mine were falsified by the lanes I dispatched, every one caught because the dispatch order told the dev to verify the PM's claims, not just the card's:

                              my premisewhat it was
                              the grid builds $select at one sitetwo, and each fails alone — a one-site fix ships with a green suite and a broken surface
                              description was the only read-but-unrelayed keythree of 46 relayed keys; fieldOrder and rowColor too
                              the grid's paging footer discloses page-scopingit belongs to plugin-list; a standalone grouped grid renders no footer at all
                              a gantt issues two requests per loadthree — one paged, two unbounded
                              ZONE 1 RULING: raise the Start/End threshold, the dates survive as a sublabelthe sublabel is display:none above 640px — the "fix" would have deleted the dates
                              ZONE 1 RULING: gate the column list feeding buildExpandFieldsgating the inputwidens the leak, because the helper reads an empty list as "no restriction"; the gate belongs on the output

                              Two of those were rulings, not mechanism notes. Both were withdrawn on measurement. Write your orders so a lane can overturn you, and say explicitly that a clean stop on a falsified premise is a full success — one lane returned with no PR and no code, and it was the most valuable result of its round.

                              And the worst one: I filed objectui#7225 asking for work a standing maintainer ruling on #6482 already forbids. I had read #6482's body and not its comments. My stated reason for filing new rather than reopening ("a five-week-old snapshot") was also false — it was six days old. ⇒ Read the comments. Every time. #7089 §1 says the same thing and I still did not do it.


                              2. Probe discipline — I produced FOUR false zeros in one shift

                              A probe can fail in two directions and I hit both:

                              Cannot match anything (reads as "clean"):

                              • wrong path, twice — ObjectStackAdapter.ts does not exist (the class lives in index.ts); a script run from outside the repo
                              • in ERE, (a|b) consumes group 1, so a \1 backreference meant for a later group silently matches nothing and exits 0

                              Matches BOTH sides (reads as "landed" — the harmful direction):

                              Before trusting any landing probe, verify it is 0 on main AND non-zero on the branch. Derive it from the diff; never guess a symbol name. Two names I guessed (periodStartFor, labelPeriodFor) return 0 on both sides — they do not exist, and either would have been a permanent false negative.

                              Also standing: git grep -c counts LINES, not entries — use grep -o … | wc -l. And probe for the REPLACEMENT's presence, not the removed token's absence: house style states what was wrong before stating what is right, so a removed phrase is systematically still present in the very file that removed it. When the file's own prose quotes the old form, count whole lines.


                              3. Environment traps, all measured today

                              • happy-dom / jsdom report clientWidth 0 and therefore NEVER fire container-size effects. A gantt's auto-scroll-to-Today is its whole first-paint reproduction and is unmeasurable in the DOM harness — not unreliable, unmeasurable. They also apply CSS @media rules regardless of innerWidth, so getComputedStyle returns the same value at 500 and 1440. One lane would have concluded "this element is never visible" from that. Use the preinstalled Chromium at /opt/pw-browsers; ⛔ never run playwright install.
                              • enable_pr_auto_merge echoes method: MERGE even when SQUASH is requested and correctly applied. Seven times today. Ignore the echo; verify by parent count after landing (1 parent = squash).
                              • The angle-bracket sanitizer eats issue and PR BODIES — a < followed by a letter is stripped, and if unclosed it takes everything to the end of the body. Backticks do NOT protect it. Comments are safe. Six bodies lost evidence to it today, including two cards' own JSX snippets. Read your posted body back as rendered.
                              • The closing-keyword parser ignores negation. There is no safe way to write "does not close #N" — omit the number.
                              • API rate limit hit three times, recovering in a few minutes each. Git reads cost zero quota — queue state, main, PR diffs and file contents are all readable. ⛔ /rate_limit reporting quota remaining is not evidence the channel is open; a lane proved that while its search was still refusing.
                              • Merge queue: confirm enqueue by git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-NNNN-*'positives only, ref-absent proves nothing. Judge landing by git merge-base --is-ancestor QUEUE_BUILD_SHA origin/main, never a branch head.
                              • Pre-check conflicts against what main is ABOUT to become, not only what it is. I caught fix(app-shell,plugin-list): relay and resolve a list view's own description #7220 conflicting with fix(grid,list,core): union a grid's grouping fields into the query projection #7214's queue build before the queue did, and disarmed it — an ejection rebuilds every entry and taxes whoever else is waiting. main moved seven times in three hours today.

                              4. Landed this shift

                              PRcardnote
                              #7213#6943a red gate on main (check:published-dist), found in the unlabelled sweep
                              #7214#7179grid $select blind to grouping.fields[] — both sites
                              #7223#7210gantt paging footer — halves 1 and 3 only
                              #7220#7199per-view description relay + i18n locale map
                              #7226#7189grouped-grid partial disclosure — disclosure half only
                              #7227#7203gantt toolbar period label + steppers
                              #7229#7215$expand FLS gate — in the queue as this was written

                              ⚠️#7229 found that objectui#6898 was believed closed and had a LIVE BYPASS: the $select projection gated its columns and then re-added the expand roots unconditionally, justified in-comment as "known-valid because buildExpandFields() derived them from the object schema" — valid, yes; readable, never asked. A denied lookup walked straight back in. If you audit FLS, do not trust #6898 as settled history.


                              5. Open on purpose — do NOT close these as done

                              6. Queued and ready, rulings already recorded in their triage comments

                              #7173 · #7096 · #7216 · #7218 · #7217 · #7230 · #7231 · #7232

                              Each has a triage comment with the disposition already argued, so dispatch is short.


                              7. The unlabelled pool — measure it, do not estimate it

                              55 of 307 open issues carry no labels, measured repo-wide with a count cross-check (100 + 100 + 100 + 7 = 307, final page hasNextPage: false) and controls in both directions. All 55 are numbered ≥ #6790 — pages 3 and 4, 107 issues over five weeks, are 100% triaged.

                              ⇒ This is filing outrunning triage right now, not chronic debt. Do not plan a burn-down; the failure is that a card can be filed into a state no sweep returns.

                              I worked ~19. ~36 remain unread. ⛔ Never grade from titles — that shortcut is what #6318 cost a lane.

                              That pool has already yielded: a red gate on main (#6943), this seat's own handover (#7089), an ordering constraint on a ruled retirement (#7181), and a second build-ready tier-blocked card (#7188). It is the highest-yield thing to do with spare capacity.


                              8. Two rulings of mine you may want to overturn

                              ① Split a card when one half is invariant to the open question.#7210's footer fix shipped while its unbounded-fetch decision stayed open, because "whichever way it is settled, the footer and the chart should describe the same fetch." Same for #7189. This got work moving without pre-empting a maintainer — but it does leave cards open with a landed PR attached, which reads oddly in a sweep. Make sure the landing note says loudly what is still open.

                              ② File a narrow card rather than reopening a stale one. I did this for #6482#7225 and it was wrong (§1). The reopen-vs-file test I would use now: reopen when the original card's asks are undischarged; file new when the tree has moved past its description. I applied the second test without checking whether the first applied.


                              9. Seat mechanics worth keeping

                              • A claim is assign PLUS a claim comment carrying session ID and branch — all agents share one GitHub identity, so the assignee field alone proves nothing. Re-read comments before writing code.
                              • Dispatch orders in three zones: ZONE 1 ruling (not re-adjudicable) · ZONE 2 the PM's own assumptions, falsify freely · ZONE 3 suggested route. The zone-2 block is where every one of §1's six corrections came from.
                              • File-overlap is a real scheduling constraint. Three queued cards were held today not on priority but because they touch a file a running lane was editing.
                              • Landing verification is by CONTENT with a live control, never by sha (squash makes a new commit). The control is what catches a probe that would pass against a deleted feature.

                              Good luck. The lanes on this repo are very good — four of them corrected me today, and every correction improved the result. Write your orders so they can.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p1

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions