An outer <PrintErrors> does not print a failure an <Output> region decided #327

Description

@taras

Motivation

architecture.md is authoritative on the error model, and its mode table says:

ModeAn undecided error…Installed by
outputfails the run; <PrintErrors> can print insteadevery <Output> region

§6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

Reproduction

Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

<!-- components/OutFail.md -->
<Output>before <Nope /> after</Output>
<!-- components/Holder.md -->
<Output><Content /></Output>

Control — print at the root works.

<PrintErrors>
<Nope />
</PrintErrors>
TAIL REACHED

exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

Case 1 — the failure is in the callee's own <Output> region.

<PrintErrors>
<OutFail />
</PrintErrors>
TAIL REACHED

Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

Case 2 — the failure is projected into a callee's <Output> region.

<PrintErrors>
<Holder><Nope /></Holder>
</PrintErrors>
TAIL REACHED

Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

Where to look

decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

Partial output

Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

Acceptance criteria

  • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
  • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
  • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
  • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
  • A durability failure is still never printed.
  • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

Impact

Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

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

    Labels

    No labels
    No labels

    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 \u003cpre\u003e\u003ccode\u003e 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

      An outer <PrintErrors> does not print a failure an <Output> region decided #327

      Description

      @taras

      Motivation

      architecture.md is authoritative on the error model, and its mode table says:

      ModeAn undecided error…Installed by
      outputfails the run; <PrintErrors> can print insteadevery <Output> region

      §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

      On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

      Reproduction

      Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

      <!-- components/OutFail.md -->
      <Output>before <Nope /> after</Output>
      <!-- components/Holder.md -->
      <Output><Content /></Output>

      Control — print at the root works.

      <PrintErrors>
      <Nope />
      </PrintErrors>
      TAIL REACHED

      exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

      Case 1 — the failure is in the callee's own <Output> region.

      <PrintErrors>
      <OutFail />
      </PrintErrors>
      TAIL REACHED

      Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
      Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

      Case 2 — the failure is projected into a callee's <Output> region.

      <PrintErrors>
      <Holder><Nope /></Holder>
      </PrintErrors>
      TAIL REACHED

      Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
      Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

      Where to look

      decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

      Partial output

      Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

      Acceptance criteria

      • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
      • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
      • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
      • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
      • A durability failure is still never printed.
      • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

      Impact

      Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

      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

        Labels

        No labels
        No labels

        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

          An outer <PrintErrors> does not print a failure an <Output> region decided #327

          Description

          @taras

          Motivation

          architecture.md is authoritative on the error model, and its mode table says:

          ModeAn undecided error…Installed by
          outputfails the run; <PrintErrors> can print insteadevery <Output> region

          §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

          On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

          Reproduction

          Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

          <!-- components/OutFail.md -->
          <Output>before <Nope /> after</Output>
          <!-- components/Holder.md -->
          <Output><Content /></Output>

          Control — print at the root works.

          <PrintErrors>
          <Nope />
          </PrintErrors>
          TAIL REACHED

          exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

          Case 1 — the failure is in the callee's own <Output> region.

          <PrintErrors>
          <OutFail />
          </PrintErrors>
          TAIL REACHED

          Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
          Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

          Case 2 — the failure is projected into a callee's <Output> region.

          <PrintErrors>
          <Holder><Nope /></Holder>
          </PrintErrors>
          TAIL REACHED

          Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
          Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

          Where to look

          decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

          Partial output

          Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

          Acceptance criteria

          • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
          • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
          • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
          • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
          • A durability failure is still never printed.
          • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

          Impact

          Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

          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

            Labels

            No labels
            No labels

            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 \u003e 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

              An outer <PrintErrors> does not print a failure an <Output> region decided #327

              Description

              @taras

              Motivation

              architecture.md is authoritative on the error model, and its mode table says:

              ModeAn undecided error…Installed by
              outputfails the run; <PrintErrors> can print insteadevery <Output> region

              §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

              On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

              Reproduction

              Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

              <!-- components/OutFail.md -->
              <Output>before <Nope /> after</Output>
              <!-- components/Holder.md -->
              <Output><Content /></Output>

              Control — print at the root works.

              <PrintErrors>
              <Nope />
              </PrintErrors>
              TAIL REACHED

              exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

              Case 1 — the failure is in the callee's own <Output> region.

              <PrintErrors>
              <OutFail />
              </PrintErrors>
              TAIL REACHED

              Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
              Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

              Case 2 — the failure is projected into a callee's <Output> region.

              <PrintErrors>
              <Holder><Nope /></Holder>
              </PrintErrors>
              TAIL REACHED

              Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
              Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

              Where to look

              decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

              Partial output

              Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

              Acceptance criteria

              • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
              • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
              • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
              • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
              • A durability failure is still never printed.
              • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

              Impact

              Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

              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

                Labels

                No labels
                No labels

                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

                  An outer <PrintErrors> does not print a failure an <Output> region decided #327

                  Description

                  @taras

                  Motivation

                  architecture.md is authoritative on the error model, and its mode table says:

                  ModeAn undecided error…Installed by
                  outputfails the run; <PrintErrors> can print insteadevery <Output> region

                  §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

                  On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

                  Reproduction

                  Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

                  <!-- components/OutFail.md -->
                  <Output>before <Nope /> after</Output>
                  <!-- components/Holder.md -->
                  <Output><Content /></Output>

                  Control — print at the root works.

                  <PrintErrors>
                  <Nope />
                  </PrintErrors>
                  TAIL REACHED

                  exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

                  Case 1 — the failure is in the callee's own <Output> region.

                  <PrintErrors>
                  <OutFail />
                  </PrintErrors>
                  TAIL REACHED

                  Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
                  Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

                  Case 2 — the failure is projected into a callee's <Output> region.

                  <PrintErrors>
                  <Holder><Nope /></Holder>
                  </PrintErrors>
                  TAIL REACHED

                  Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
                  Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

                  Where to look

                  decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

                  Partial output

                  Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

                  Acceptance criteria

                  • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
                  • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
                  • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
                  • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
                  • A durability failure is still never printed.
                  • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

                  Impact

                  Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

                  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

                    Labels

                    No labels
                    No labels

                    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

                      An outer <PrintErrors> does not print a failure an <Output> region decided #327

                      Description

                      @taras

                      Motivation

                      architecture.md is authoritative on the error model, and its mode table says:

                      ModeAn undecided error…Installed by
                      outputfails the run; <PrintErrors> can print insteadevery <Output> region

                      §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

                      On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

                      Reproduction

                      Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

                      <!-- components/OutFail.md -->
                      <Output>before <Nope /> after</Output>
                      <!-- components/Holder.md -->
                      <Output><Content /></Output>

                      Control — print at the root works.

                      <PrintErrors>
                      <Nope />
                      </PrintErrors>
                      TAIL REACHED

                      exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

                      Case 1 — the failure is in the callee's own <Output> region.

                      <PrintErrors>
                      <OutFail />
                      </PrintErrors>
                      TAIL REACHED

                      Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
                      Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

                      Case 2 — the failure is projected into a callee's <Output> region.

                      <PrintErrors>
                      <Holder><Nope /></Holder>
                      </PrintErrors>
                      TAIL REACHED

                      Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
                      Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

                      Where to look

                      decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

                      Partial output

                      Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

                      Acceptance criteria

                      • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
                      • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
                      • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
                      • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
                      • A durability failure is still never printed.
                      • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

                      Impact

                      Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

                      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

                        Labels

                        No labels
                        No labels

                        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

                          An outer <PrintErrors> does not print a failure an <Output> region decided #327

                          Description

                          @taras

                          Motivation

                          architecture.md is authoritative on the error model, and its mode table says:

                          ModeAn undecided error…Installed by
                          outputfails the run; <PrintErrors> can print insteadevery <Output> region

                          §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

                          On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

                          Reproduction

                          Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

                          <!-- components/OutFail.md -->
                          <Output>before <Nope /> after</Output>
                          <!-- components/Holder.md -->
                          <Output><Content /></Output>

                          Control — print at the root works.

                          <PrintErrors>
                          <Nope />
                          </PrintErrors>
                          TAIL REACHED

                          exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

                          Case 1 — the failure is in the callee's own <Output> region.

                          <PrintErrors>
                          <OutFail />
                          </PrintErrors>
                          TAIL REACHED

                          Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
                          Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

                          Case 2 — the failure is projected into a callee's <Output> region.

                          <PrintErrors>
                          <Holder><Nope /></Holder>
                          </PrintErrors>
                          TAIL REACHED

                          Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
                          Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

                          Where to look

                          decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

                          Partial output

                          Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

                          Acceptance criteria

                          • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
                          • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
                          • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
                          • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
                          • A durability failure is still never printed.
                          • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

                          Impact

                          Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

                          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

                            Labels

                            No labels
                            No labels

                            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

                              An outer <PrintErrors> does not print a failure an <Output> region decided #327

                              Description

                              @taras

                              Motivation

                              architecture.md is authoritative on the error model, and its mode table says:

                              ModeAn undecided error…Installed by
                              outputfails the run; <PrintErrors> can print insteadevery <Output> region

                              §6.8.1 says the same from the other side: a failure an output decision selected is deliberately not in the never-printed list — "the region it left has already stopped, so printing it resumes nothing." throw is named as the one mode a boundary does not replace.

                              On 511776e an outer <PrintErrors> does not print such a failure. The run fails instead. The contract is the architecture's; this is the engine not meeting it.

                              Reproduction

                              Shared fixture — a name that resolves to nothing, which raises an ordinary printed error under print:

                              <!-- components/OutFail.md -->
                              <Output>before <Nope /> after</Output>
                              <!-- components/Holder.md -->
                              <Output><Content /></Output>

                              Control — print at the root works.

                              <PrintErrors>
                              <Nope />
                              </PrintErrors>
                              TAIL REACHED

                              exit 0; stdout carries <!-- ERROR: Failed to import component Nope … --> and TAIL REACHED. Correct.

                              Case 1 — the failure is in the callee's own <Output> region.

                              <PrintErrors>
                              <OutFail />
                              </PrintErrors>
                              TAIL REACHED

                              Expected: the boundary prints one error whose cause is the original failure, and TAIL REACHED renders.
                              Actual: exit 1. stdout holds only the partial text before ; the message goes to stderr; TAIL REACHED never renders.

                              Case 2 — the failure is projected into a callee's <Output> region.

                              <PrintErrors>
                              <Holder><Nope /></Holder>
                              </PrintErrors>
                              TAIL REACHED

                              Expected: §6.3 says "the error mode is captured at the expansion site and carried across", and the expansion site here is inside <PrintErrors> — so this should print for that reason alone, independently of the output question.
                              Actual: exit 1, nothing on stdout, TAIL REACHED never renders.

                              Where to look

                              decidedByOutput() (packages/core/src/errors.ts:264) exists precisely to distinguish an output decision from a throw decision at a printing boundary, and its comment states the intended difference. Its only consumer is expand.ts:2292, on the ContentExpansionFailure branch. Case 1 does not reach that branch at all, and case 2 reaches it but still fails — so the two cases may not share a cause. Both should be checked rather than assumed to be one fix.

                              Partial output

                              Case 1 shows the partial-output rule already working: before reached the output stream before the failure. Whatever fixes printing must keep that — the region's already-rendered text stays, and printing adds the error after it rather than replacing it.

                              Acceptance criteria

                              • An outer <PrintErrors> turns a failure an <Output> region decided into exactly one printed error whose cause is the complete original failure, and the run continues past the boundary.
                              • The same holds whether the failure arose in the callee's own <Output> region or in content projected into one.
                              • A throw decision is still never printed — documentation and value roots keep failing through a boundary.
                              • Text a failing region had already rendered still reaches the output stream, and the printed error does not replace it.
                              • A durability failure is still never printed.
                              • Tests discriminate the three cases above by exit status and by whether the tail after the boundary renders — an assertion on stderr alone would pass today.

                              Impact

                              Reported while synchronizing the #181 living end-goal target (#292). The workflow documents describe the architectural behavior, as architecture.md is authoritative, and classify this as missing pending this issue. No workflow document writes <PrintErrors> today, so nothing is blocked on it — but a stage that wants to survive a failed region cannot, and the target's error-mode table would otherwise have to contradict the registry.

                              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

                                Labels

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions