types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

Description

@os-litant

Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

Why this card exists

The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

Measured on 2956d7af8

Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

file:linekeymirror.describe()TS twin
app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

Ask (one executable criterion)

Per key, the #6124 treatment, measured not assumed:

  1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
  2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
  3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
  4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

Not in this card

Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

Activity

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

Metadata

Metadata

Labels

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

    types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

    Description

    @os-litant

    Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

    Why this card exists

    The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

    PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

    Measured on 2956d7af8

    Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

    file:linekeymirror.describe()TS twin
    app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
    blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
    blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
    blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
    blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
    reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
    reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
    views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
    crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
    crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
    crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

    Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

    The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

    Ask (one executable criterion)

    Per key, the #6124 treatment, measured not assumed:

    1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
    2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
    3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
    4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

    Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

    Not in this card

    Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

    Activity

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

    Metadata

    Metadata

    Labels

    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

      types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

      Description

      @os-litant

      Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

      Why this card exists

      The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

      PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

      Measured on 2956d7af8

      Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

      file:linekeymirror.describe()TS twin
      app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
      blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
      blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
      blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
      blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
      reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
      reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
      views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
      crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
      crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
      crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

      Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

      The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

      Ask (one executable criterion)

      Per key, the #6124 treatment, measured not assumed:

      1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
      2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
      3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
      4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

      Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

      Not in this card

      Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

      Activity

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

      Metadata

      Metadata

      Labels

      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

        types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

        Description

        @os-litant

        Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

        Why this card exists

        The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

        PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

        Measured on 2956d7af8

        Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

        file:linekeymirror.describe()TS twin
        app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
        blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
        blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
        blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
        blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
        reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
        reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
        views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
        crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
        crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
        crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

        Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

        The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

        Ask (one executable criterion)

        Per key, the #6124 treatment, measured not assumed:

        1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
        2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
        3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
        4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

        Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

        Not in this card

        Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

        Activity

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

        Metadata

        Metadata

        Labels

        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

          types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

          Description

          @os-litant

          Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

          Why this card exists

          The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

          PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

          Measured on 2956d7af8

          Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

          file:linekeymirror.describe()TS twin
          app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
          blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
          blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
          blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
          blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
          reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
          reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
          views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
          crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
          crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
          crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

          Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

          The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

          Ask (one executable criterion)

          Per key, the #6124 treatment, measured not assumed:

          1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
          2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
          3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
          4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

          Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

          Not in this card

          Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

          Activity

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

          Metadata

          Metadata

          Labels

          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

            types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

            Description

            @os-litant

            Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

            Why this card exists

            The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

            PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

            Measured on 2956d7af8

            Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

            file:linekeymirror.describe()TS twin
            app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
            blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
            blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
            blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
            blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
            reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
            reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
            views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
            crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
            crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
            crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

            Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

            The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

            Ask (one executable criterion)

            Per key, the #6124 treatment, measured not assumed:

            1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
            2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
            3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
            4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

            Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

            Not in this card

            Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

            Activity

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

            Metadata

            Metadata

            Labels

            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

              types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

              Description

              @os-litant

              Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

              Why this card exists

              The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

              PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

              Measured on 2956d7af8

              Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

              file:linekeymirror.describe()TS twin
              app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
              blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
              blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
              blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
              blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
              reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
              reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
              views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
              crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
              crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
              crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

              Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

              The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

              Ask (one executable criterion)

              Per key, the #6124 treatment, measured not assumed:

              1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
              2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
              3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
              4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

              Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

              Not in this card

              Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

              Activity

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

              Metadata

              Metadata

              Labels

              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

                types: 8 on* handler mirrors still declare the z.string() expression dialect and 3 declare z.any() — the per-key treatment the #6182 ruling assigned to #6124's sweep, not covered by PR #7339 #7344

                Description

                @os-litant

                Filed by the domain:ui execution seat (session session_01NRRumy89BYdW9ogbcdHTho) while reconciling #6124's close. Dedupe: semantic search for the string-dialect sweep returns #6182 (the ruling card), #7069, #5927, #6058, #5684 — none is an execution card for these sites; control query on #6182's own title hit.

                Why this card exists

                The maintainer ruling on #6182 (2026-08-25, batch 4, verbatim 「同意」, Option A) says the handler-expression string dialect is NOT a supported authoring form, and rules the consequence: "The 11 z.string() handler mirrors join #6124's per-key sweep with the same treatment". #6124's own ruling (2026-08-30, batch #8, 「批次 #8 同意」) then fixed the shape of that treatment: on the zod face a named refusal arm (handlerKeyRefusal in packages/types/src/zod/tombstone.zod.ts, landed by PR #7339), no declarative-object arm, no expression arm; on the TypeScript face, keep the function type only where a runtime consumer measurably reads the key, else ?: never.

                PR #7339 executed that shape over the 58 on* sites declared z.function() and closed #6124. Its census was anchored on z\.function\(, so the string-dialect and z.any() mirrors were never in its population — they live in files the PR did not touch. #6182's close condition, re-run on the merged ref (origin/main = 2956d7af8), still finds them.

                Measured on 2956d7af8

                Anchored on[A-Z][A-Za-z]*:\s*z\.(function|string|any) over packages/types/src/zod/, function sites excluded (0 remain after PR #7339):

                file:linekeymirror.describe()TS twin
                app.zod.ts:205onClickz.string()"Click handler expression"app.ts:716onClick?: string
                blocks.zod.ts:108onInstallz.string()"Install callback"blocks.ts:303string
                blocks.zod.ts:109onPreviewz.string()"Preview callback"blocks.ts:308string
                blocks.zod.ts:122onSavez.string()"Save callback"blocks.ts:345string
                blocks.zod.ts:123onCancelz.string()"Cancel callback"blocks.ts:350string
                reports.zod.ts:170onSavez.string()"Save callback"reports.ts:514string
                reports.zod.ts:171onCancelz.string()"Cancel callback"reports.ts:519string
                views.zod.ts:117onBackz.string()"Custom back action"views.ts:578string
                crud.zod.ts:105onClickz.any()"Custom click handler"crud.ts:210() => void | Promise<void>
                crud.zod.ts:145onBackz.any()"Custom back action"crud.ts:303() => void
                crud.zod.ts:160onClosez.any()"Close handler"crud.ts:345() => void

                Excluded by ruling, listed so nobody re-sweeps them: views.zod.ts:152onViewChange, :177onChange, :197onChange are z.string()event NAMES (PR #6899; the :152 describe text says "an event NAME, not a callback or a handler expression"). The dev confirms :177 / :197 carry the same describe text before excluding them; if one does not, it joins the table above.

                The z.any() three are the mirror-wider-than-declared direction (#7069): the TS face says function, the mirror accepts any JSON value, so an authored string or object parses green and reaches a slot that expects a function.

                Ask (one executable criterion)

                Per key, the #6124 treatment, measured not assumed:

                1. Find the runtime consumer (schema.onX / props.onX / spread onto a component that declares the prop). None reads it ⇒ ?: never on the TS face + handlerKeyRefusal(key, 'retired', …) on the mirror. A consumer reads it as a function ⇒ TS keeps the function type + refusal arm with the 'runtime-slot' disposition. A consumer reads it as a string and does something with it (dispatches it as an event name, resolves it against an action registry) ⇒ STOP for that key and report: that is a third class the rulings did not name, and it goes back to the decision box rather than being guessed.
                2. The eight string TS twins stop declaring string (the ruling says the expression dialect is unsupported on both faces).
                3. Extend handler-keys-json-refusal-6124.test.ts's pattern (a sibling pin file is fine): each site declared with the guidance, an authored string refused by name with code: 'custom', a live function refused on the mirror, zod-mirror-parity.test.tsKnownDrift rows added for runtime-slot keys.
                4. Close condition = [Decision] Is an authored handler EXPRESSION a supported dialect? 56 mirrors say function, 11 say string, and both appear in files that mirror the other #6182's rg on the merged ref returns only the three event-name keys (or zero if the dev finds those were mis-described).

                Clause-② yes (the accept set of published validators moves): build at fable, contract review in-seat at tier before release; the PR carries needs:contract-review and stays draft until PASS. Changeset @object-ui/types: minor (objectui refuses major).

                Not in this card

                Refs: #6182 (the ruling; its Blocked-by: now points here) · #6124 / PR #7339 (the shape) · #7069 · #4453 (an authored string handler is silently dropped) · #5155 (rejection lives at the zod/publish boundary).

                Activity

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

                Metadata

                Metadata

                Labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions