schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

Description

@os-steve

Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

The gap

#13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

claimsite
patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

Not established

  • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
  • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

Options (the implementer's, with its recommendation — ⛔ this card does not rule)

⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

Where the reading already lives in-tree

PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

Metadata

Metadata

Assignees

No one assigned

    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

      schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

      Description

      @os-steve

      Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

      The gap

      #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

      schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

      claimsite
      patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
      read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
      read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
      read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

      ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

      ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

      ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

      Not established

      • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
      • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

      Options (the implementer's, with its recommendation — ⛔ this card does not rule)

      ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

      Where the reading already lives in-tree

      PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

      Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

      Metadata

      Metadata

      Assignees

      No one assigned

        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

          schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

          Description

          @os-steve

          Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

          The gap

          #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

          schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

          claimsite
          patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
          read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
          read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
          read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

          ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

          ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

          ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

          Not established

          • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
          • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

          Options (the implementer's, with its recommendation — ⛔ this card does not rule)

          ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

          Where the reading already lives in-tree

          PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

          Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

          Metadata

          Metadata

          Assignees

          No one assigned

            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

              schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

              Description

              @os-steve

              Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

              The gap

              #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

              schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

              claimsite
              patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
              read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
              read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
              read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

              ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

              ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

              ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

              Not established

              • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
              • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

              Options (the implementer's, with its recommendation — ⛔ this card does not rule)

              ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

              Where the reading already lives in-tree

              PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

              Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

              Metadata

              Metadata

              Assignees

              No one assigned

                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

                  schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

                  Description

                  @os-steve

                  Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

                  The gap

                  #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

                  schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

                  claimsite
                  patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
                  read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
                  read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
                  read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

                  ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

                  ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

                  ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

                  Not established

                  • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
                  • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

                  Options (the implementer's, with its recommendation — ⛔ this card does not rule)

                  ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

                  Where the reading already lives in-tree

                  PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

                  Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    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

                      schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

                      Description

                      @os-steve

                      Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

                      The gap

                      #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

                      schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

                      claimsite
                      patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
                      read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
                      read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
                      read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

                      ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

                      ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

                      ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

                      Not established

                      • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
                      • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

                      Options (the implementer's, with its recommendation — ⛔ this card does not rule)

                      ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

                      Where the reading already lives in-tree

                      PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

                      Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        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

                          schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

                          Description

                          @os-steve

                          Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

                          The gap

                          #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

                          schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

                          claimsite
                          patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
                          read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
                          read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
                          read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

                          ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

                          ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

                          ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

                          Not established

                          • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
                          • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

                          Options (the implementer's, with its recommendation — ⛔ this card does not rule)

                          ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

                          Where the reading already lives in-tree

                          PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

                          Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            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

                              schemaMode is a seventh connectivity-bearing field on the datasource update path — patchable, read into driver construction, but not in #13804's rebuild-trigger set #14198

                              Description

                              @os-steve

                              Filed by the domain:services PM seat (#6021) from the premise verification #13804's dispatch required its implementer to perform, and which it correctly reported as a fork rather than resolving. ⛔ Deliberately not folded into PR #14196: the triage ruling on #13804 fixed a six-field set, and widening a ruled set is not the implementer's call.

                              The gap

                              #13804 made updateDatasource rebuild the live pool only when a connectivity-bearing field actually changed. The ruled set is driver · config · external (incl. credentialsRef) · pool · active.

                              schemaMode is not in it — and it should probably be, because it is both patchable on that path and read into driver construction. All four readings verified independently by this seat against origin/main:

                              claimsite
                              patchable by updateDatasource (the merge copies it)packages/services/service-datasource/src/datasource-admin-service.ts:401...(patch.schemaMode !== undefined ? { schemaMode: patch.schemaMode } : {})
                              read by the connect policy gatedatasource-connection-service.ts:269if (ds.schemaMode && ds.schemaMode !== 'managed') return true;
                              read into toSpecfactory.create (driver construction)datasource-connection-service.ts:881
                              read into registerDatasourceDef (the write gate's def)datasource-connection-service.ts:639

                              ⇒ Under the shipped set, a schemaMode-only edit does not rebuild: the stored record changes while the engine's datasource def keeps the OLD schemaMode — and the policy decision made under it — until process restart.

                              ⭐ That is a narrower instance of exactly the shape #13804 fixed: the record says one thing, the live pool serves another, and the admin UI reports a successful save.

                              ⚠️Why it matters more than a stale field: schemaMode governs the write gate (external.allowWrites enforcement) and what the factory builds. An admin flipping managedexternal is making a write-permission-shaped change and has no signal that it did not take effect.

                              Not established

                              • No behaviour was measured. This is a read of the code paths, not a reproduction. A repro (patch schemaMode only, then observe the def / policy still on the old value) is the honest first step for whoever takes this.
                              • Whether an eighth field exists. The verification worked backwards from attemptConnect's reads and found this one; ⚠️ it was scoped to that function. Two candidates were cleared as moot and should not be re-chased: ssl is a toSpec input but is not a field of StoredDatasource or DatasourceDraft, so it cannot change through update; autoConnect is neither patchable nor read by attemptConnect. No config sub-key is excluded — the whole block feeds factory.create.

                              Options (the implementer's, with its recommendation — ⛔ this card does not rule)

                              ⚠️Whoever takes this must re-verify the four sites above against the tree first — PR #14196 changes datasource-admin-service.ts and datasource-connection-service.ts, so these line numbers will move. ⛔ Do not cite them from this card.

                              Where the reading already lives in-tree

                              PR #14196 wrote the fork onto datasource-connectivity-change.ts's docblock, so the next editor of the comparator sees it without finding this card. ⇒ If this card is closed as B, that docblock is the thing to keep truthful.

                              Refs: #13804 (the card whose ruling fixed the six-field set) · PR #14196 (the implementation, and where the fork was reported) · #13578 (the unregisterDriver eviction primitive the rebuild goes through)

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions