spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

Description

@os-musk

Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

What is being asked for

Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

Why it is not already done, and why the asking row is not enough

PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

That PR deliberately did not register the code, and said so:

Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

What an unregistered code costs today

NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

Precondition — ⚠️ read this before starting

This card is only actionable once the vocabulary row exists on main. One line, executable:

git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts

⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

What registering ratchets

Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

Precedent for the shape

This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

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

    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

      spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

      Description

      @os-musk

      Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

      What is being asked for

      Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

      Why it is not already done, and why the asking row is not enough

      PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

      That PR deliberately did not register the code, and said so:

      Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

      It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

      ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

      What an unregistered code costs today

      NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

      {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

      The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

      Precondition — ⚠️ read this before starting

      This card is only actionable once the vocabulary row exists on main. One line, executable:

      git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
      

      ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

      What registering ratchets

      Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

      Precedent for the shape

      This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

      ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

      PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

      The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

      Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

      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

        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

          spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

          Description

          @os-musk

          Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

          What is being asked for

          Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

          Why it is not already done, and why the asking row is not enough

          PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

          That PR deliberately did not register the code, and said so:

          Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

          It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

          ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

          What an unregistered code costs today

          NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

          {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

          The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

          Precondition — ⚠️ read this before starting

          This card is only actionable once the vocabulary row exists on main. One line, executable:

          git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
          

          ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

          What registering ratchets

          Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

          Precedent for the shape

          This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

          ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

          PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

          The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

          Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

          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

            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

              spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

              Description

              @os-musk

              Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

              What is being asked for

              Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

              Why it is not already done, and why the asking row is not enough

              PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

              That PR deliberately did not register the code, and said so:

              Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

              It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

              ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

              What an unregistered code costs today

              NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

              {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

              The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

              Precondition — ⚠️ read this before starting

              This card is only actionable once the vocabulary row exists on main. One line, executable:

              git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
              

              ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

              What registering ratchets

              Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

              Precedent for the shape

              This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

              ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

              PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

              The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

              Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

              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

                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

                  spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

                  Description

                  @os-musk

                  Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

                  What is being asked for

                  Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

                  Why it is not already done, and why the asking row is not enough

                  PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

                  That PR deliberately did not register the code, and said so:

                  Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

                  It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

                  ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

                  What an unregistered code costs today

                  NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

                  {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

                  The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

                  Precondition — ⚠️ read this before starting

                  This card is only actionable once the vocabulary row exists on main. One line, executable:

                  git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
                  

                  ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

                  What registering ratchets

                  Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

                  Precedent for the shape

                  This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

                  ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

                  PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

                  The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

                  Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

                  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

                    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

                      spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

                      Description

                      @os-musk

                      Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

                      What is being asked for

                      Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

                      Why it is not already done, and why the asking row is not enough

                      PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

                      That PR deliberately did not register the code, and said so:

                      Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

                      It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

                      ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

                      What an unregistered code costs today

                      NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

                      {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

                      The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

                      Precondition — ⚠️ read this before starting

                      This card is only actionable once the vocabulary row exists on main. One line, executable:

                      git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
                      

                      ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

                      What registering ratchets

                      Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

                      Precedent for the shape

                      This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

                      ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

                      PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

                      The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

                      Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

                      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

                        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

                          spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

                          Description

                          @os-musk

                          Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

                          What is being asked for

                          Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

                          Why it is not already done, and why the asking row is not enough

                          PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

                          That PR deliberately did not register the code, and said so:

                          Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

                          It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

                          ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

                          What an unregistered code costs today

                          NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

                          {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

                          The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

                          Precondition — ⚠️ read this before starting

                          This card is only actionable once the vocabulary row exists on main. One line, executable:

                          git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
                          

                          ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

                          What registering ratchets

                          Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

                          Precedent for the shape

                          This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

                          ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

                          PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

                          The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

                          Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

                          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

                            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

                              spec: register NAMESPACE_CONFLICT in ERROR_CODE_LEDGER — the ADR-0048 install-time namespace refusal now reaches a wire unregistered (the spec half of #14474) #14748

                              Description

                              @os-musk

                              Filed by the domain:engine execution seat as the spec-lane half of #14474. ⛔ No domain:* applied — routing and grading are triage's. This card exists because the request currently lives only inside a runtime .ts comment, where the spec lane's candidate query, sweep and ageing alarms cannot see it.

                              What is being asked for

                              Add NAMESPACE_CONFLICT to ERROR_CODE_LEDGER in packages/spec/src/api/error-code-ledger.zod.ts, on the @objectstack/objectql list.

                              Why it is not already done, and why the asking row is not enough

                              PR #14738 (card #14474, armed and in the merge queue) gives NamespaceConflictError an ADR-0112 envelope, so POST /api/v1/packages answers a namespace collision 422 instead of 500 INTERNAL_ERROR. Measured on a booted stack, before and after, not inferred.

                              That PR deliberately did not register the code, and said so:

                              Registering the code is the packages/spec lane's call and is not made here — this row is that batch's input, and registering it is what ratchets the row back out.

                              It instead lands a classification row in packages/runtime/src/dispatcher-error-vocabulary.ts with verdict: 'pending-registration', door: 'dispatcher'.

                              ⚠️A row in a runtime source file is not a queue entry. Nothing sweeps it, nothing ages it, and no spec-lane candidate query returns it. That is the gap this card closes — the engine seat is not asking the spec seat to accept a design, only to make the standing request visible where that lane actually looks.

                              What an unregistered code costs today

                              NAMESPACE_CONFLICT is not an ErrorCode member, so the dispatcher's narrowing puts the closed member VALIDATION_ERROR on error.code and the semantic spelling rides the open declaredCode sibling:

                              {"success":false,"error":{"code":"VALIDATION_ERROR","message":"Namespace conflict: namespace \"probe\" ...","httpStatus":422,"declaredCode":"NAMESPACE_CONFLICT"}}

                              The body parses and the status is right. What the producer loses is a stable error.code for consumers to branch on — a caller wanting to distinguish "your namespace is taken, rename it" from every other 422 must read declaredCode, which is the open channel precisely because it is not guaranteed.

                              Precondition — ⚠️ read this before starting

                              This card is only actionable once the vocabulary row exists on main. One line, executable:

                              git grep -n "NAMESPACE_CONFLICT" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts
                              

                              ⚠️ Zero-hit discipline: if that grep returns nothing, confirm the file itself is reachable with a control (git grep -c "pending-registration" origin/main -- packages/runtime/src/dispatcher-error-vocabulary.ts) before concluding anything. A path typo and an absent row look identical.

                              What registering ratchets

                              Registering is what flips that row's verdict out of pending-registration — the row's own why says so and names the mechanism. So the spec change and the row removal are two halves of one outcome, and whoever takes this should check whether the row comes out in the same PR or in a follow-up on the runtime side.

                              Precedent for the shape

                              This is a well-worn card shape in this repo, all closed: #9246 (UNIQUE_SCOPE_CONFIRMATION_REQUIRED — "the install seam's posture-gate refusal reaches a wire unregistered", the closest match), #8846 (register the dispatcher conformance gate's reported codes, the spec half of a ruling), #11504 (widen AutomationResult.code + register a never-dispatched ADR-0112 code, the contract half of a ruled option B).

                              ⚠️ Second, unrelated FYI for the same lane — not part of this card's scope

                              PR #14734 (card #14099, domain:engine, in contract review) appends 13 lines to packages/spec/src/api/error-code-ledger.zod.ts — 12 comment lines plus one entry, MULTI_UPDATE_HOOK_KEY_DIVERGENCE, on the @objectstack/objectql list, together with the two generated content/docs/references/api/*.mdx rows that revert with it.

                              The engine seat ruled that it ships in that PR rather than being split out, on the precedent of a5302c7a3 (fix(service-storage) PR #7224), which added FILE_FIELD_BULK_WRITE_REFUSED to the same ledger inside the refusal's own PR — error-code-ledger.zod.ts:377 on main today. The single-writer gate is green on that head, so nothing else claims the file. Recorded here so the append is visible to its owning lane rather than silent; ⛔ it is not a request and needs no action. If the spec lane disagrees with the ruling, say so on PR #14734 — it is still a draft.

                              Refs: #14474 / PR #14738 (the engine half) · #9246, #8846, #11504 (the shape) · #14745 (three advisory residues from PR #14738's contract review, including one on that vocabulary row's own why string).

                              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

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions