Deliver answers to suspended workflows for later resumption #300

Description

@taras

Story

As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

Current delivery state

Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

Settled sequencing

#367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

This story has two delivery slices:

  1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
  2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

Slice 1: typed durable answer delivery

The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

Before durable storage, the host:

  • finds the exact retained run and suspension request without executing the document;
  • requires the suspension ID to name that run's current unanswered request;
  • validates the value against the response schema retained with that request; and
  • sends the complete retained answer state through the existing persistence secret gate.

A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

Slice 2: explicit scheduling

After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

Scheduling:

  • acquires the same executor lock as foreground resume;
  • observes the same lifecycle admission and cancellation rules;
  • calls the same provider-neutral resume operation;
  • cannot create a second executor or bypass explicit answer delivery; and
  • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

Acceptance: typed delivery

  • One value is correlated to the exact retained suspension ID and response schema.
  • Delivery validates before persistence and crosses the existing secret gate.
  • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
  • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
  • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
  • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
  • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
  • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
  • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

Acceptance: scheduling

  • Answer availability may schedule only the ordinary resume path.
  • Competing schedulers and manual resume are serialized by the same executor lock.
  • Process exit requires no in-memory waiter or hidden Agent transcript.
  • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
  • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
  • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

Dependencies

Typed delivery

Scheduling

End goal: #181.

Out of scope

  • Automatically resuming as part of answer delivery.
  • Untyped generic answers passed to workflow resume.
  • File watchers, branch watchers, or unattended iteration arbitration.
  • A public remote-host selector.
  • Human actor identity or attestation.
  • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

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

      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

      Deliver answers to suspended workflows for later resumption #300

      Description

      @taras

      Story

      As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

      Current delivery state

      Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

      Settled sequencing

      #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

      This story has two delivery slices:

      1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
      2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

      Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

      Slice 1: typed durable answer delivery

      The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

      Before durable storage, the host:

      • finds the exact retained run and suspension request without executing the document;
      • requires the suspension ID to name that run's current unanswered request;
      • validates the value against the response schema retained with that request; and
      • sends the complete retained answer state through the existing persistence secret gate.

      A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

      On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

      A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

      Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

      This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

      Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

      Slice 2: explicit scheduling

      After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

      Scheduling:

      • acquires the same executor lock as foreground resume;
      • observes the same lifecycle admission and cancellation rules;
      • calls the same provider-neutral resume operation;
      • cannot create a second executor or bypass explicit answer delivery; and
      • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

      The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

      Acceptance: typed delivery

      • One value is correlated to the exact retained suspension ID and response schema.
      • Delivery validates before persistence and crosses the existing secret gate.
      • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
      • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
      • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
      • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
      • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
      • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
      • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

      Acceptance: scheduling

      • Answer availability may schedule only the ordinary resume path.
      • Competing schedulers and manual resume are serialized by the same executor lock.
      • Process exit requires no in-memory waiter or hidden Agent transcript.
      • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
      • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
      • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

      Dependencies

      Typed delivery

      Scheduling

      End goal: #181.

      Out of scope

      • Automatically resuming as part of answer delivery.
      • Untyped generic answers passed to workflow resume.
      • File watchers, branch watchers, or unattended iteration arbitration.
      • A public remote-host selector.
      • Human actor identity or attestation.
      • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

      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

          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

          Deliver answers to suspended workflows for later resumption #300

          Description

          @taras

          Story

          As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

          Current delivery state

          Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

          Settled sequencing

          #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

          This story has two delivery slices:

          1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
          2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

          Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

          Slice 1: typed durable answer delivery

          The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

          Before durable storage, the host:

          • finds the exact retained run and suspension request without executing the document;
          • requires the suspension ID to name that run's current unanswered request;
          • validates the value against the response schema retained with that request; and
          • sends the complete retained answer state through the existing persistence secret gate.

          A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

          On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

          A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

          Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

          This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

          Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

          Slice 2: explicit scheduling

          After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

          Scheduling:

          • acquires the same executor lock as foreground resume;
          • observes the same lifecycle admission and cancellation rules;
          • calls the same provider-neutral resume operation;
          • cannot create a second executor or bypass explicit answer delivery; and
          • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

          The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

          Acceptance: typed delivery

          • One value is correlated to the exact retained suspension ID and response schema.
          • Delivery validates before persistence and crosses the existing secret gate.
          • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
          • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
          • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
          • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
          • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
          • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
          • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

          Acceptance: scheduling

          • Answer availability may schedule only the ordinary resume path.
          • Competing schedulers and manual resume are serialized by the same executor lock.
          • Process exit requires no in-memory waiter or hidden Agent transcript.
          • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
          • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
          • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

          Dependencies

          Typed delivery

          Scheduling

          End goal: #181.

          Out of scope

          • Automatically resuming as part of answer delivery.
          • Untyped generic answers passed to workflow resume.
          • File watchers, branch watchers, or unattended iteration arbitration.
          • A public remote-host selector.
          • Human actor identity or attestation.
          • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

          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

              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

              Deliver answers to suspended workflows for later resumption #300

              Description

              @taras

              Story

              As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

              Current delivery state

              Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

              Settled sequencing

              #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

              This story has two delivery slices:

              1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
              2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

              Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

              Slice 1: typed durable answer delivery

              The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

              Before durable storage, the host:

              • finds the exact retained run and suspension request without executing the document;
              • requires the suspension ID to name that run's current unanswered request;
              • validates the value against the response schema retained with that request; and
              • sends the complete retained answer state through the existing persistence secret gate.

              A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

              On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

              A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

              Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

              This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

              Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

              Slice 2: explicit scheduling

              After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

              Scheduling:

              • acquires the same executor lock as foreground resume;
              • observes the same lifecycle admission and cancellation rules;
              • calls the same provider-neutral resume operation;
              • cannot create a second executor or bypass explicit answer delivery; and
              • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

              The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

              Acceptance: typed delivery

              • One value is correlated to the exact retained suspension ID and response schema.
              • Delivery validates before persistence and crosses the existing secret gate.
              • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
              • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
              • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
              • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
              • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
              • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
              • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

              Acceptance: scheduling

              • Answer availability may schedule only the ordinary resume path.
              • Competing schedulers and manual resume are serialized by the same executor lock.
              • Process exit requires no in-memory waiter or hidden Agent transcript.
              • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
              • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
              • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

              Dependencies

              Typed delivery

              Scheduling

              End goal: #181.

              Out of scope

              • Automatically resuming as part of answer delivery.
              • Untyped generic answers passed to workflow resume.
              • File watchers, branch watchers, or unattended iteration arbitration.
              • A public remote-host selector.
              • Human actor identity or attestation.
              • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

              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

                  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

                  Deliver answers to suspended workflows for later resumption #300

                  Description

                  @taras

                  Story

                  As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

                  Current delivery state

                  Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

                  Settled sequencing

                  #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

                  This story has two delivery slices:

                  1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
                  2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

                  Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

                  Slice 1: typed durable answer delivery

                  The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

                  Before durable storage, the host:

                  • finds the exact retained run and suspension request without executing the document;
                  • requires the suspension ID to name that run's current unanswered request;
                  • validates the value against the response schema retained with that request; and
                  • sends the complete retained answer state through the existing persistence secret gate.

                  A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

                  On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

                  A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

                  Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

                  This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

                  Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

                  Slice 2: explicit scheduling

                  After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

                  Scheduling:

                  • acquires the same executor lock as foreground resume;
                  • observes the same lifecycle admission and cancellation rules;
                  • calls the same provider-neutral resume operation;
                  • cannot create a second executor or bypass explicit answer delivery; and
                  • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

                  The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

                  Acceptance: typed delivery

                  • One value is correlated to the exact retained suspension ID and response schema.
                  • Delivery validates before persistence and crosses the existing secret gate.
                  • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
                  • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
                  • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
                  • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
                  • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
                  • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
                  • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

                  Acceptance: scheduling

                  • Answer availability may schedule only the ordinary resume path.
                  • Competing schedulers and manual resume are serialized by the same executor lock.
                  • Process exit requires no in-memory waiter or hidden Agent transcript.
                  • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
                  • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
                  • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

                  Dependencies

                  Typed delivery

                  Scheduling

                  End goal: #181.

                  Out of scope

                  • Automatically resuming as part of answer delivery.
                  • Untyped generic answers passed to workflow resume.
                  • File watchers, branch watchers, or unattended iteration arbitration.
                  • A public remote-host selector.
                  • Human actor identity or attestation.
                  • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

                  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

                      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

                      Deliver answers to suspended workflows for later resumption #300

                      Description

                      @taras

                      Story

                      As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

                      Current delivery state

                      Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

                      Settled sequencing

                      #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

                      This story has two delivery slices:

                      1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
                      2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

                      Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

                      Slice 1: typed durable answer delivery

                      The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

                      Before durable storage, the host:

                      • finds the exact retained run and suspension request without executing the document;
                      • requires the suspension ID to name that run's current unanswered request;
                      • validates the value against the response schema retained with that request; and
                      • sends the complete retained answer state through the existing persistence secret gate.

                      A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

                      On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

                      A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

                      Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

                      This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

                      Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

                      Slice 2: explicit scheduling

                      After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

                      Scheduling:

                      • acquires the same executor lock as foreground resume;
                      • observes the same lifecycle admission and cancellation rules;
                      • calls the same provider-neutral resume operation;
                      • cannot create a second executor or bypass explicit answer delivery; and
                      • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

                      The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

                      Acceptance: typed delivery

                      • One value is correlated to the exact retained suspension ID and response schema.
                      • Delivery validates before persistence and crosses the existing secret gate.
                      • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
                      • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
                      • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
                      • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
                      • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
                      • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
                      • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

                      Acceptance: scheduling

                      • Answer availability may schedule only the ordinary resume path.
                      • Competing schedulers and manual resume are serialized by the same executor lock.
                      • Process exit requires no in-memory waiter or hidden Agent transcript.
                      • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
                      • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
                      • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

                      Dependencies

                      Typed delivery

                      Scheduling

                      End goal: #181.

                      Out of scope

                      • Automatically resuming as part of answer delivery.
                      • Untyped generic answers passed to workflow resume.
                      • File watchers, branch watchers, or unattended iteration arbitration.
                      • A public remote-host selector.
                      • Human actor identity or attestation.
                      • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

                      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

                          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

                          Deliver answers to suspended workflows for later resumption #300

                          Description

                          @taras

                          Story

                          As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

                          Current delivery state

                          Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

                          Settled sequencing

                          #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

                          This story has two delivery slices:

                          1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
                          2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

                          Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

                          Slice 1: typed durable answer delivery

                          The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

                          Before durable storage, the host:

                          • finds the exact retained run and suspension request without executing the document;
                          • requires the suspension ID to name that run's current unanswered request;
                          • validates the value against the response schema retained with that request; and
                          • sends the complete retained answer state through the existing persistence secret gate.

                          A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

                          On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

                          A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

                          Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

                          This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

                          Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

                          Slice 2: explicit scheduling

                          After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

                          Scheduling:

                          • acquires the same executor lock as foreground resume;
                          • observes the same lifecycle admission and cancellation rules;
                          • calls the same provider-neutral resume operation;
                          • cannot create a second executor or bypass explicit answer delivery; and
                          • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

                          The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

                          Acceptance: typed delivery

                          • One value is correlated to the exact retained suspension ID and response schema.
                          • Delivery validates before persistence and crosses the existing secret gate.
                          • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
                          • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
                          • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
                          • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
                          • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
                          • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
                          • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

                          Acceptance: scheduling

                          • Answer availability may schedule only the ordinary resume path.
                          • Competing schedulers and manual resume are serialized by the same executor lock.
                          • Process exit requires no in-memory waiter or hidden Agent transcript.
                          • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
                          • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
                          • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

                          Dependencies

                          Typed delivery

                          Scheduling

                          End goal: #181.

                          Out of scope

                          • Automatically resuming as part of answer delivery.
                          • Untyped generic answers passed to workflow resume.
                          • File watchers, branch watchers, or unattended iteration arbitration.
                          • A public remote-host selector.
                          • Human actor identity or attestation.
                          • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

                          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

                              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

                              Deliver answers to suspended workflows for later resumption #300

                              Description

                              @taras

                              Story

                              As a workflow user, I want to deliver a typed answer to one retained suspension and resume explicitly, so a durable wait can continue without an in-memory waiter, hidden transcript reconstruction, or another execution authority.

                              Current delivery state

                              Typed durable answer delivery and claim are shipped by PR #479. The remaining work is slice 2: scheduling the ordinary resume path after #301 supplies the real composed consumer. Answer delivery itself remains non-executing.

                              Settled sequencing

                              #367 now supplies inspection, suspension, cancellation, executor ownership, and executor-lock release. A suspended run can survive its host, but without an answer every resume reaches the same retained request and suspends again.

                              This story has two delivery slices:

                              1. Typed durable answer delivery is shipped by PR 📥 Deliver a typed answer to a suspended workflow run #479. It depends on the retained suspension contract, not on the completed adversarial workflow.
                              2. Scheduling follows Compose the supervised adversarial implementation workflow #301. It resumes a real composed consumer when an answer becomes available; it does not define another way to execute a run.

                              Delivery and execution remain separate observable operations. Offering an answer records it only. It does not acquire the executor lock, start a document execution, or call resume. The existing explicit workflow resume path later acquires the lock, claims the answer, and continues the run.

                              Slice 1: typed durable answer delivery

                              The public correlation boundary is the retained suspension ID and its retained response schema. An authorized host may offer one JSON value for that exact pending request.

                              Before durable storage, the host:

                              • finds the exact retained run and suspension request without executing the document;
                              • requires the suspension ID to name that run's current unanswered request;
                              • validates the value against the response schema retained with that request; and
                              • sends the complete retained answer state through the existing persistence secret gate.

                              A successful delivery retains pending answer state and returns without changing run status. It appends no answer event and does not consume the value.

                              On a later explicit resume, only authenticated retained answer state may let suspendFor() continue. The resumed execution publishes one ordinary filtered answer Yield and marks the pending delivery consumed in the same transaction. Only after that commit does suspendFor() return the value to the document. A crash before the transaction commits leaves the answer pending and eligible for the same request; a crash after it commits replays the retained answer event without consuming or publishing another answer.

                              A contextual handler's return value, document state, props, middleware, a same-named API, or an answer supplied to resume cannot substitute for retained answer state.

                              Duplicate, late, already-consumed, wrong-run, wrong-request, and schema-invalid delivery is refused without mutation. Cancellation or deletion cannot leave an answer that later authorizes a reused public run ID. Diagnostics retain neither rejected values nor secret matches.

                              This slice defines the provider-neutral delivery and claim contract and the first local host adapter. It does not combine answer delivery with resume. A public remote-host selector, unattended scheduler, file watcher, or generic untyped resume --answer option is not introduced.

                              Recording who supplied an answer is a separate provenance decision. This slice authenticates the host's authority to deliver and the retained request/value correlation; it does not invent human actor identity.

                              Slice 2: explicit scheduling

                              After #301 supplies the supervised workflow that consumes durable answers, a host may schedule the same existing resume operation when an answer becomes available.

                              Scheduling:

                              • acquires the same executor lock as foreground resume;
                              • observes the same lifecycle admission and cancellation rules;
                              • calls the same provider-neutral resume operation;
                              • cannot create a second executor or bypass explicit answer delivery; and
                              • requires no file watcher, implicit branch movement, document-path lookup, or hidden Agent state.

                              The first scheduler is explicit host behavior. Configured source watching, unattended iteration-completion arbitration, and a public remote-host selector remain deferred until a concrete product contract requires them.

                              Acceptance: typed delivery

                              • One value is correlated to the exact retained suspension ID and response schema.
                              • Delivery validates before persistence and crosses the existing secret gate.
                              • Successful delivery changes neither run status nor document-execution history and acquires no executor lock.
                              • Explicit resume publishes one filtered answer event, consumes the pending delivery atomically, and returns the value from suspendFor().
                              • A crash before publication leaves the answer pending; replay after publication emits no duplicate event and requests no replacement answer.
                              • Duplicate, late, consumed, mismatched, invalid, cancelled-run, and deleted-run delivery is refused without mutation.
                              • Public middleware, contextual return values, props, document code, and same-name APIs cannot manufacture answer authority.
                              • Strict storage recognition covers any durable input-delivery schema amendment; older development-only schema handling follows the repository's settled pre-release compatibility policy.
                              • Deno and the compiled binary supply the local durable adapter; unsupported entrypoints refuse before mutation.

                              Acceptance: scheduling

                              • Answer availability may schedule only the ordinary resume path.
                              • Competing schedulers and manual resume are serialized by the same executor lock.
                              • Process exit requires no in-memory waiter or hidden Agent transcript.
                              • Duplicate or late scheduling cannot consume an answer twice or start concurrent execution.
                              • Cancellation at acquisition, answer claim, and resumed execution preserves the existing durable lifecycle outcome rules.
                              • Local and future remote hosts can implement the same contextual lifecycle API without changing documents.

                              Dependencies

                              Typed delivery

                              Scheduling

                              End goal: #181.

                              Out of scope

                              • Automatically resuming as part of answer delivery.
                              • Untyped generic answers passed to workflow resume.
                              • File watchers, branch watchers, or unattended iteration arbitration.
                              • A public remote-host selector.
                              • Human actor identity or attestation.
                              • Replacing the executor lock, lifecycle state machine, journal secret policy, or suspension identity.

                              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

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions