IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

Description

@os-musk

Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

Measured at 909a4417

packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

const drv = driver as any;
…
if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
return applyHaving(aggregated, ast.having);
}

packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

Why this is not just the capability convention

The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

Consequence, stated narrowly

  • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
  • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
  • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

⛔ What is NOT claimed

  • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
  • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
  • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
  • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

Dedup — the channel fired, so this is a reading

One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

cardstatewhy it is not this
#6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
#4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
#12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
#8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

No open card covers IDataDriver's missing aggregate declaration.

Related

#14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

Activity

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

Metadata

Metadata

Assignees

No one assigned

    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

      IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

      Description

      @os-musk

      Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

      Measured at 909a4417

      packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

      const drv = driver as any;
      …
      if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
      const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
      return applyHaving(aggregated, ast.having);
      }
      

      packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

      Why this is not just the capability convention

      The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

      Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

      introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

      Consequence, stated narrowly

      • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
      • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
      • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

      ⛔ What is NOT claimed

      • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
      • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
      • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
      • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

      Dedup — the channel fired, so this is a reading

      One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

      cardstatewhy it is not this
      #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
      #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
      #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
      #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

      No open card covers IDataDriver's missing aggregate declaration.

      Related

      #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

      Activity

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

      Metadata

      Metadata

      Assignees

      No one assigned

        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

          IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

          Description

          @os-musk

          Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

          Measured at 909a4417

          packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

          const drv = driver as any;
          …
          if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
          const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
          return applyHaving(aggregated, ast.having);
          }
          

          packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

          Why this is not just the capability convention

          The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

          Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

          introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

          Consequence, stated narrowly

          • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
          • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
          • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

          ⛔ What is NOT claimed

          • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
          • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
          • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
          • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

          Dedup — the channel fired, so this is a reading

          One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

          cardstatewhy it is not this
          #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
          #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
          #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
          #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

          No open card covers IDataDriver's missing aggregate declaration.

          Related

          #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

          Activity

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

          Metadata

          Metadata

          Assignees

          No one assigned

            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

              IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

              Description

              @os-musk

              Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

              Measured at 909a4417

              packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

              const drv = driver as any;
              …
              if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
              const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
              return applyHaving(aggregated, ast.having);
              }
              

              packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

              Why this is not just the capability convention

              The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

              Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

              introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

              Consequence, stated narrowly

              • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
              • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
              • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

              ⛔ What is NOT claimed

              • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
              • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
              • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
              • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

              Dedup — the channel fired, so this is a reading

              One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

              cardstatewhy it is not this
              #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
              #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
              #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
              #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

              No open card covers IDataDriver's missing aggregate declaration.

              Related

              #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

              Activity

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

              Metadata

              Metadata

              Assignees

              No one assigned

                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

                  IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

                  Description

                  @os-musk

                  Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

                  Measured at 909a4417

                  packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

                  const drv = driver as any;
                  …
                  if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
                  const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
                  return applyHaving(aggregated, ast.having);
                  }
                  

                  packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

                  Why this is not just the capability convention

                  The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

                  Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

                  introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

                  Consequence, stated narrowly

                  • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
                  • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
                  • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

                  ⛔ What is NOT claimed

                  • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
                  • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
                  • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
                  • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

                  Dedup — the channel fired, so this is a reading

                  One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

                  cardstatewhy it is not this
                  #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
                  #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
                  #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
                  #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

                  No open card covers IDataDriver's missing aggregate declaration.

                  Related

                  #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

                  Activity

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

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    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

                      IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

                      Description

                      @os-musk

                      Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

                      Measured at 909a4417

                      packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

                      const drv = driver as any;
                      …
                      if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
                      const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
                      return applyHaving(aggregated, ast.having);
                      }
                      

                      packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

                      Why this is not just the capability convention

                      The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

                      Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

                      introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

                      Consequence, stated narrowly

                      • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
                      • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
                      • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

                      ⛔ What is NOT claimed

                      • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
                      • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
                      • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
                      • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

                      Dedup — the channel fired, so this is a reading

                      One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

                      cardstatewhy it is not this
                      #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
                      #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
                      #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
                      #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

                      No open card covers IDataDriver's missing aggregate declaration.

                      Related

                      #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

                      Activity

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

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        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

                          IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

                          Description

                          @os-musk

                          Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

                          Measured at 909a4417

                          packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

                          const drv = driver as any;
                          …
                          if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
                          const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
                          return applyHaving(aggregated, ast.having);
                          }
                          

                          packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

                          Why this is not just the capability convention

                          The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

                          Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

                          introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

                          Consequence, stated narrowly

                          • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
                          • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
                          • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

                          ⛔ What is NOT claimed

                          • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
                          • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
                          • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
                          • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

                          Dedup — the channel fired, so this is a reading

                          One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

                          cardstatewhy it is not this
                          #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
                          #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
                          #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
                          #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

                          No open card covers IDataDriver's missing aggregate declaration.

                          Related

                          #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

                          Activity

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

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            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

                              IDataDriver declares no aggregate, yet the engine dispatches to driver.aggregate through as any — the one engine-reached driver verb with no signature to match #14345

                              Description

                              @os-musk

                              Found while typing the recording driver double in packages/objectql/src/engine-filter-array-lowering.test.ts (#14117 / PR #14344). ⛔ Recording only — no severity asserted, routing is triage's. Not fixed there: out of that card's fence, and it moves a public contract.

                              Measured at 909a4417

                              packages/objectql/src/engine.ts reaches the driver's aggregation path by duck-typing, through a cast that erases the call:

                              const drv = driver as any;
                              …
                              if (typeof drv.aggregate === 'function' && allStructuredSupported && !tzRequiresInMemory && !hasAggregationFilter) {
                              const aggregated = await drv.aggregate(object, ast, this.buildDriverOptions(object, opCtx.context));
                              return applyHaving(aggregated, ast.having);
                              }
                              

                              packages/spec/src/contracts/data-driver.ts declares noaggregate member on IDataDriver — required or optional. Grep for aggregate in that file returns nothing.

                              Why this is not just the capability convention

                              The duck-typing itself is deliberate and documented: packages/spec/src/data/driver.zod.ts states the rule for DriverCapabilities — "aggregation on typeof driver.aggregate === 'function' … Do not add a boolean here for behaviour that a method's presence already decides". That rule is about capability bits, and it is right. It says nothing about whether the method should be declared.

                              Every other engine-reached optional verb IS declared: updateMany?, deleteMany?, explain?, syncSchemasBatch?, registerExternalObject?, registerObjectMetadata?, getSchemaSyncStats?, introspectSchema?, reclaimSpace?, temporalFilterValue?, temporalFilterColumnSql?. aggregate is the only one reached by the engine with nothing to match against.

                              introspectSchema's own TSDoc in that file argues exactly this case for itself, and the argument transfers verbatim: a driver author implementing the interface "had no signature to mis-match against, so a column flag spelled isPrimary … compiled clean and surfaced only as a federated table whose records silently could not be located". Today an author can write aggregate(query, object) with the arguments swapped, or return the wrong row shape, and tsc has nothing to say — the engine's as any absorbs it and the result reaches applyHaving.

                              Consequence, stated narrowly

                              • A custom driver's aggregate is unchecked in both directions: its parameters and its return.
                              • A test double for a driver cannot be annotated against the real contract without adding a local extension for this verb, which is what PR test(objectql): type the #13357 negative pin's witness seams against the driver contract #14344 had to do. Any future double faces the same choice, and the cheap one is any — the shape the tsc-program work is trying to retire.
                              • No drift is claimed to exist today. In-repo drivers are fine. The claim is only that a drift here would not be caught.

                              ⛔ What is NOT claimed

                              • ⛔ Not claimed the duck-typed dispatch is wrong. Presence-testing an optional member is the repo's stated convention and works.
                              • ⛔ Not claimed the capability schema needs a bit for this. driver.zod.ts rules that out explicitly and correctly.
                              • ⛔ Not claimed the engine's as any at that site must go. Declaring the member is the smaller move; whether the cast then narrows is a separate judgement.
                              • ⛔ No opinion offered on whether the declaration should be optional (matching the presence test) or required (matching the fact that four in-repo drivers implement it). That is the decision this card hands to triage.

                              Dedup — the channel fired, so this is a reading

                              One targeted semantic search returned 28 on-topic results. Nearest neighbours, all closed:

                              cardstatewhy it is not this
                              #6212closedsame verb, but about the object-name written twice at the driver boundary, not about the member being undeclared
                              #4406closedquery.object at the driver boundary — the redundancy DriverQuery then removed
                              #12248closedthe same defect shape on the engine contract (IDataEngine gaining declared optional members). Precedent for the class, on the other interface
                              #8112closedan as any hiding a wrong aggregation key in test fixtures — the consequence class, not this seam

                              No open card covers IDataDriver's missing aggregate declaration.

                              Related

                              #14117 / PR #14344 (where this was found) · #11493 / #11381 (the ruling that declared introspectSchema for this exact reason) · #12248 (same shape, engine side)

                              Activity

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

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions