Validate supplied document structure without executing it #653

Description

@taras

Motivation

xmd prompt (#260) must reject a generated program with a missing component or
an invalid component invocation before asking a person to approve it. Core's
current document inspection reads the root source and validates root metadata,
but it does not resolve components in the document body or validate their
declared props. Those failures are currently discovered only when execution
begins.

Provide one reusable core boundary that validates a supplied document without
executing it. The CLI can then use the same result for generated source, and
other hosts do not need to reproduce expansion rules.

Contract

The validation operation accepts the same declarative document context needed
to interpret a supplied root source: source text and identity, contextual cwd,
ordered includes, root props, the contextual component registry, and the plain
identity-component declarations the host supplies. It does not run an
ExecutionInstallation, call an identity factory, or install an operational
provider. This is the same declaration-only environment inspectSyntax() uses,
not a second registry or a reconstruction of the execution host.

Validation starts with the selected root projection, using the existing root
target selection and definition-validation order. It then follows normal
component selection through the recursive closure of resolved Markdown
component definitions. Each definition is parsed once by source identity, so a
cycle does not recurse forever, and every authored invocation site in those
sources is reported in source order. Validation does not interpret control-flow
reachability: an invocation inside a branch is still authored program structure.
Children authored beneath an origin-only TypeScript invocation remain part of
the containing source and are inspected even though validation cannot know
whether that component will project them.

The operation returns one versioned result:

interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

code is a closed set for version 1 rather than rendered CLI prose. A schema
diagnostic carries the same normalized AJV issues normal validation already
produces; consumers do not parse message to recover a property or keyword.
Sources are ordered by putting the root first, then processing a FIFO queue of
Markdown definitions in the order their first invocation is encountered. Within
one source, diagnostics and invocation records are ordered by source position;
multiple diagnostics at one position use the DocumentValidationCode order
shown above. An invocation's indexes point into that one ordered diagnostic
array. Root parse, target, frontmatter, props-declaration and return-declaration
failures have no invocation record when no invocation exists.
The document outcome is invalid exactly when the result contains a diagnostic
that represents a definite validation failure. An opaque invocation by itself
does not make the document invalid.

The version-1 diagnostic codes cover every condition core can establish before
execution:

  • source failures emitted by the parser normal execution shares;
  • invalid root or Markdown-component frontmatter, props declarations, and
    return declarations;
  • target-selection failures for a targeted supplied root;
  • unresolved or ambiguous component selection;
  • invocation-form and engine-owned body-shape violations;
  • missing required props when their absence is statically established;
  • schema violations when every schema-visible prop value is static; and
  • invalid as, capture, return, or structural usage that the shared expansion
    rules can decide without evaluating document code.

Validation uses the existing parser exactly as normal execution does. It does
not add a strict MDX grammar beside that parser. Text the shared scanner does not
recognize as an invocation remains text, and spread attributes retain their
current execution semantics. A future change that makes either one an error
changes parsing for validation and execution together.

Invocation outcomes

Validation applies checks whose answers do not depend on runtime values even
when another part of the invocation is opaque. A definite resolution, authored
form, engine-owned body-shape, or independently established structural failure
makes the invocation invalid.

Full props-schema validation runs only when every schema-visible prop value is
static. A dynamic schema-visible expression or origin-only TypeScript contract
that prevents the complete check makes an otherwise non-invalid invocation
not-statically-checkable. A declared capture keeps the same deliberate schema
bypass it has during execution and does not by itself make the invocation
opaque. Validation does not implement a partial JSON Schema solver to infer
additional failures from a mixture of static and dynamic prop values.

Outcome precedence is therefore:

  1. invalid when any no-execution check proves a failure;
  2. not-statically-checkable when no failure is proven but at least one
    applicable check needs runtime information; and
  3. valid only when all applicable checks are statically proven.

Repository TypeScript components whose catalog entry identifies only their
origin have no invented props, forms, captures, returns, or documentation
contract. Their invocation is not statically checkable unless a separate
engine-owned rule already proves it invalid.

No-execution boundary

Validation does not invoke a component, evaluate a document expression, render
or project content, start an agent, prompt or elicit, create or read a journal,
execute a command, call an identity factory, install an operational provider, or
perform a filesystem effect expressed by the document. It may read the supplied
root and the component-definition files normal selection identifies, just as
inspection does.

Component resolution, declaration admission, schemas, authored forms, body
rules, target selection, and source positions come from the same definitions as
normal execution and the structured syntax catalog from #632. The operation
must not introduce a second component registry, schema dialect, parser, or
handwritten catalog.

Acceptance criteria

  • A supplied document containing <DefinitelyMissing /> returns an unresolved
    component diagnostic without starting execution.
  • A supplied document containing <File /> without its required path returns
    a declaration/schema diagnostic without starting execution.
  • A valid document using built-in, registered, and included Markdown components
    passes validation.
  • A defect inside a recursively selected Markdown component is reported at that
    component source's authored position, including when the invocation is beneath
    authored control flow that validation does not evaluate.
  • Existing root-document parse, target, and declaration failures remain
    represented in the returned diagnostics.
  • A dynamic prop makes a schema-dependent invocation not statically checkable
    when no independent failure is certain; a definite form or body-shape failure
    on the same invocation still makes it invalid.
  • An origin-only TypeScript component is reported as not statically checkable
    where its invocation contract is unknown, rather than accepted under an
    invented schema or rejected merely for being opaque.
  • Repeated validation returns diagnostics and invocation records in the same
    documented order.
  • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
    person without parsing rendered CLI prose.
  • Focused evidence proves that validation creates no execution, agent, journal,
    elicitation, command, identity-factory, provider, or document-authored
    filesystem effects.

Specification

Update architecture.md and specs/executable-mdx-spec.md to define this
non-executing validation boundary, its traversal and ordering, its version-1
diagnostics, and the distinction between invalid and not-statically-checkable
invocations. Spec, tests, and mechanics move together in the implementation PR.

Sequencing

Complete this core capability before implementing #260's verification and
approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
result rather than defining another validator.

Out of scope

  • restricting generated programs to a safe component subset;
  • interpreting control-flow reachability;
  • partially solving JSON Schema across dynamic and static values;
  • proving dynamic JavaScript expressions or runtime-dependent prop values;
  • defining a stricter MDX grammar than normal execution uses;
  • executing a program to discover whether it succeeds; and
  • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

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

      Validate supplied document structure without executing it #653

      Description

      @taras

      Motivation

      xmd prompt (#260) must reject a generated program with a missing component or
      an invalid component invocation before asking a person to approve it. Core's
      current document inspection reads the root source and validates root metadata,
      but it does not resolve components in the document body or validate their
      declared props. Those failures are currently discovered only when execution
      begins.

      Provide one reusable core boundary that validates a supplied document without
      executing it. The CLI can then use the same result for generated source, and
      other hosts do not need to reproduce expansion rules.

      Contract

      The validation operation accepts the same declarative document context needed
      to interpret a supplied root source: source text and identity, contextual cwd,
      ordered includes, root props, the contextual component registry, and the plain
      identity-component declarations the host supplies. It does not run an
      ExecutionInstallation, call an identity factory, or install an operational
      provider. This is the same declaration-only environment inspectSyntax() uses,
      not a second registry or a reconstruction of the execution host.

      Validation starts with the selected root projection, using the existing root
      target selection and definition-validation order. It then follows normal
      component selection through the recursive closure of resolved Markdown
      component definitions. Each definition is parsed once by source identity, so a
      cycle does not recurse forever, and every authored invocation site in those
      sources is reported in source order. Validation does not interpret control-flow
      reachability: an invocation inside a branch is still authored program structure.
      Children authored beneath an origin-only TypeScript invocation remain part of
      the containing source and are inspected even though validation cannot know
      whether that component will project them.

      The operation returns one versioned result:

      interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

      code is a closed set for version 1 rather than rendered CLI prose. A schema
      diagnostic carries the same normalized AJV issues normal validation already
      produces; consumers do not parse message to recover a property or keyword.
      Sources are ordered by putting the root first, then processing a FIFO queue of
      Markdown definitions in the order their first invocation is encountered. Within
      one source, diagnostics and invocation records are ordered by source position;
      multiple diagnostics at one position use the DocumentValidationCode order
      shown above. An invocation's indexes point into that one ordered diagnostic
      array. Root parse, target, frontmatter, props-declaration and return-declaration
      failures have no invocation record when no invocation exists.
      The document outcome is invalid exactly when the result contains a diagnostic
      that represents a definite validation failure. An opaque invocation by itself
      does not make the document invalid.

      The version-1 diagnostic codes cover every condition core can establish before
      execution:

      • source failures emitted by the parser normal execution shares;
      • invalid root or Markdown-component frontmatter, props declarations, and
        return declarations;
      • target-selection failures for a targeted supplied root;
      • unresolved or ambiguous component selection;
      • invocation-form and engine-owned body-shape violations;
      • missing required props when their absence is statically established;
      • schema violations when every schema-visible prop value is static; and
      • invalid as, capture, return, or structural usage that the shared expansion
        rules can decide without evaluating document code.

      Validation uses the existing parser exactly as normal execution does. It does
      not add a strict MDX grammar beside that parser. Text the shared scanner does not
      recognize as an invocation remains text, and spread attributes retain their
      current execution semantics. A future change that makes either one an error
      changes parsing for validation and execution together.

      Invocation outcomes

      Validation applies checks whose answers do not depend on runtime values even
      when another part of the invocation is opaque. A definite resolution, authored
      form, engine-owned body-shape, or independently established structural failure
      makes the invocation invalid.

      Full props-schema validation runs only when every schema-visible prop value is
      static. A dynamic schema-visible expression or origin-only TypeScript contract
      that prevents the complete check makes an otherwise non-invalid invocation
      not-statically-checkable. A declared capture keeps the same deliberate schema
      bypass it has during execution and does not by itself make the invocation
      opaque. Validation does not implement a partial JSON Schema solver to infer
      additional failures from a mixture of static and dynamic prop values.

      Outcome precedence is therefore:

      1. invalid when any no-execution check proves a failure;
      2. not-statically-checkable when no failure is proven but at least one
        applicable check needs runtime information; and
      3. valid only when all applicable checks are statically proven.

      Repository TypeScript components whose catalog entry identifies only their
      origin have no invented props, forms, captures, returns, or documentation
      contract. Their invocation is not statically checkable unless a separate
      engine-owned rule already proves it invalid.

      No-execution boundary

      Validation does not invoke a component, evaluate a document expression, render
      or project content, start an agent, prompt or elicit, create or read a journal,
      execute a command, call an identity factory, install an operational provider, or
      perform a filesystem effect expressed by the document. It may read the supplied
      root and the component-definition files normal selection identifies, just as
      inspection does.

      Component resolution, declaration admission, schemas, authored forms, body
      rules, target selection, and source positions come from the same definitions as
      normal execution and the structured syntax catalog from #632. The operation
      must not introduce a second component registry, schema dialect, parser, or
      handwritten catalog.

      Acceptance criteria

      • A supplied document containing <DefinitelyMissing /> returns an unresolved
        component diagnostic without starting execution.
      • A supplied document containing <File /> without its required path returns
        a declaration/schema diagnostic without starting execution.
      • A valid document using built-in, registered, and included Markdown components
        passes validation.
      • A defect inside a recursively selected Markdown component is reported at that
        component source's authored position, including when the invocation is beneath
        authored control flow that validation does not evaluate.
      • Existing root-document parse, target, and declaration failures remain
        represented in the returned diagnostics.
      • A dynamic prop makes a schema-dependent invocation not statically checkable
        when no independent failure is certain; a definite form or body-shape failure
        on the same invocation still makes it invalid.
      • An origin-only TypeScript component is reported as not statically checkable
        where its invocation contract is unknown, rather than accepted under an
        invented schema or rejected merely for being opaque.
      • Repeated validation returns diagnostics and invocation records in the same
        documented order.
      • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
        person without parsing rendered CLI prose.
      • Focused evidence proves that validation creates no execution, agent, journal,
        elicitation, command, identity-factory, provider, or document-authored
        filesystem effects.

      Specification

      Update architecture.md and specs/executable-mdx-spec.md to define this
      non-executing validation boundary, its traversal and ordering, its version-1
      diagnostics, and the distinction between invalid and not-statically-checkable
      invocations. Spec, tests, and mechanics move together in the implementation PR.

      Sequencing

      Complete this core capability before implementing #260's verification and
      approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
      result rather than defining another validator.

      Out of scope

      • restricting generated programs to a safe component subset;
      • interpreting control-flow reachability;
      • partially solving JSON Schema across dynamic and static values;
      • proving dynamic JavaScript expressions or runtime-dependent prop values;
      • defining a stricter MDX grammar than normal execution uses;
      • executing a program to discover whether it succeeds; and
      • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

      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

          Validate supplied document structure without executing it #653

          Description

          @taras

          Motivation

          xmd prompt (#260) must reject a generated program with a missing component or
          an invalid component invocation before asking a person to approve it. Core's
          current document inspection reads the root source and validates root metadata,
          but it does not resolve components in the document body or validate their
          declared props. Those failures are currently discovered only when execution
          begins.

          Provide one reusable core boundary that validates a supplied document without
          executing it. The CLI can then use the same result for generated source, and
          other hosts do not need to reproduce expansion rules.

          Contract

          The validation operation accepts the same declarative document context needed
          to interpret a supplied root source: source text and identity, contextual cwd,
          ordered includes, root props, the contextual component registry, and the plain
          identity-component declarations the host supplies. It does not run an
          ExecutionInstallation, call an identity factory, or install an operational
          provider. This is the same declaration-only environment inspectSyntax() uses,
          not a second registry or a reconstruction of the execution host.

          Validation starts with the selected root projection, using the existing root
          target selection and definition-validation order. It then follows normal
          component selection through the recursive closure of resolved Markdown
          component definitions. Each definition is parsed once by source identity, so a
          cycle does not recurse forever, and every authored invocation site in those
          sources is reported in source order. Validation does not interpret control-flow
          reachability: an invocation inside a branch is still authored program structure.
          Children authored beneath an origin-only TypeScript invocation remain part of
          the containing source and are inspected even though validation cannot know
          whether that component will project them.

          The operation returns one versioned result:

          interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

          code is a closed set for version 1 rather than rendered CLI prose. A schema
          diagnostic carries the same normalized AJV issues normal validation already
          produces; consumers do not parse message to recover a property or keyword.
          Sources are ordered by putting the root first, then processing a FIFO queue of
          Markdown definitions in the order their first invocation is encountered. Within
          one source, diagnostics and invocation records are ordered by source position;
          multiple diagnostics at one position use the DocumentValidationCode order
          shown above. An invocation's indexes point into that one ordered diagnostic
          array. Root parse, target, frontmatter, props-declaration and return-declaration
          failures have no invocation record when no invocation exists.
          The document outcome is invalid exactly when the result contains a diagnostic
          that represents a definite validation failure. An opaque invocation by itself
          does not make the document invalid.

          The version-1 diagnostic codes cover every condition core can establish before
          execution:

          • source failures emitted by the parser normal execution shares;
          • invalid root or Markdown-component frontmatter, props declarations, and
            return declarations;
          • target-selection failures for a targeted supplied root;
          • unresolved or ambiguous component selection;
          • invocation-form and engine-owned body-shape violations;
          • missing required props when their absence is statically established;
          • schema violations when every schema-visible prop value is static; and
          • invalid as, capture, return, or structural usage that the shared expansion
            rules can decide without evaluating document code.

          Validation uses the existing parser exactly as normal execution does. It does
          not add a strict MDX grammar beside that parser. Text the shared scanner does not
          recognize as an invocation remains text, and spread attributes retain their
          current execution semantics. A future change that makes either one an error
          changes parsing for validation and execution together.

          Invocation outcomes

          Validation applies checks whose answers do not depend on runtime values even
          when another part of the invocation is opaque. A definite resolution, authored
          form, engine-owned body-shape, or independently established structural failure
          makes the invocation invalid.

          Full props-schema validation runs only when every schema-visible prop value is
          static. A dynamic schema-visible expression or origin-only TypeScript contract
          that prevents the complete check makes an otherwise non-invalid invocation
          not-statically-checkable. A declared capture keeps the same deliberate schema
          bypass it has during execution and does not by itself make the invocation
          opaque. Validation does not implement a partial JSON Schema solver to infer
          additional failures from a mixture of static and dynamic prop values.

          Outcome precedence is therefore:

          1. invalid when any no-execution check proves a failure;
          2. not-statically-checkable when no failure is proven but at least one
            applicable check needs runtime information; and
          3. valid only when all applicable checks are statically proven.

          Repository TypeScript components whose catalog entry identifies only their
          origin have no invented props, forms, captures, returns, or documentation
          contract. Their invocation is not statically checkable unless a separate
          engine-owned rule already proves it invalid.

          No-execution boundary

          Validation does not invoke a component, evaluate a document expression, render
          or project content, start an agent, prompt or elicit, create or read a journal,
          execute a command, call an identity factory, install an operational provider, or
          perform a filesystem effect expressed by the document. It may read the supplied
          root and the component-definition files normal selection identifies, just as
          inspection does.

          Component resolution, declaration admission, schemas, authored forms, body
          rules, target selection, and source positions come from the same definitions as
          normal execution and the structured syntax catalog from #632. The operation
          must not introduce a second component registry, schema dialect, parser, or
          handwritten catalog.

          Acceptance criteria

          • A supplied document containing <DefinitelyMissing /> returns an unresolved
            component diagnostic without starting execution.
          • A supplied document containing <File /> without its required path returns
            a declaration/schema diagnostic without starting execution.
          • A valid document using built-in, registered, and included Markdown components
            passes validation.
          • A defect inside a recursively selected Markdown component is reported at that
            component source's authored position, including when the invocation is beneath
            authored control flow that validation does not evaluate.
          • Existing root-document parse, target, and declaration failures remain
            represented in the returned diagnostics.
          • A dynamic prop makes a schema-dependent invocation not statically checkable
            when no independent failure is certain; a definite form or body-shape failure
            on the same invocation still makes it invalid.
          • An origin-only TypeScript component is reported as not statically checkable
            where its invocation contract is unknown, rather than accepted under an
            invented schema or rejected merely for being opaque.
          • Repeated validation returns diagnostics and invocation records in the same
            documented order.
          • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
            person without parsing rendered CLI prose.
          • Focused evidence proves that validation creates no execution, agent, journal,
            elicitation, command, identity-factory, provider, or document-authored
            filesystem effects.

          Specification

          Update architecture.md and specs/executable-mdx-spec.md to define this
          non-executing validation boundary, its traversal and ordering, its version-1
          diagnostics, and the distinction between invalid and not-statically-checkable
          invocations. Spec, tests, and mechanics move together in the implementation PR.

          Sequencing

          Complete this core capability before implementing #260's verification and
          approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
          result rather than defining another validator.

          Out of scope

          • restricting generated programs to a safe component subset;
          • interpreting control-flow reachability;
          • partially solving JSON Schema across dynamic and static values;
          • proving dynamic JavaScript expressions or runtime-dependent prop values;
          • defining a stricter MDX grammar than normal execution uses;
          • executing a program to discover whether it succeeds; and
          • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

          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

              Validate supplied document structure without executing it #653

              Description

              @taras

              Motivation

              xmd prompt (#260) must reject a generated program with a missing component or
              an invalid component invocation before asking a person to approve it. Core's
              current document inspection reads the root source and validates root metadata,
              but it does not resolve components in the document body or validate their
              declared props. Those failures are currently discovered only when execution
              begins.

              Provide one reusable core boundary that validates a supplied document without
              executing it. The CLI can then use the same result for generated source, and
              other hosts do not need to reproduce expansion rules.

              Contract

              The validation operation accepts the same declarative document context needed
              to interpret a supplied root source: source text and identity, contextual cwd,
              ordered includes, root props, the contextual component registry, and the plain
              identity-component declarations the host supplies. It does not run an
              ExecutionInstallation, call an identity factory, or install an operational
              provider. This is the same declaration-only environment inspectSyntax() uses,
              not a second registry or a reconstruction of the execution host.

              Validation starts with the selected root projection, using the existing root
              target selection and definition-validation order. It then follows normal
              component selection through the recursive closure of resolved Markdown
              component definitions. Each definition is parsed once by source identity, so a
              cycle does not recurse forever, and every authored invocation site in those
              sources is reported in source order. Validation does not interpret control-flow
              reachability: an invocation inside a branch is still authored program structure.
              Children authored beneath an origin-only TypeScript invocation remain part of
              the containing source and are inspected even though validation cannot know
              whether that component will project them.

              The operation returns one versioned result:

              interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

              code is a closed set for version 1 rather than rendered CLI prose. A schema
              diagnostic carries the same normalized AJV issues normal validation already
              produces; consumers do not parse message to recover a property or keyword.
              Sources are ordered by putting the root first, then processing a FIFO queue of
              Markdown definitions in the order their first invocation is encountered. Within
              one source, diagnostics and invocation records are ordered by source position;
              multiple diagnostics at one position use the DocumentValidationCode order
              shown above. An invocation's indexes point into that one ordered diagnostic
              array. Root parse, target, frontmatter, props-declaration and return-declaration
              failures have no invocation record when no invocation exists.
              The document outcome is invalid exactly when the result contains a diagnostic
              that represents a definite validation failure. An opaque invocation by itself
              does not make the document invalid.

              The version-1 diagnostic codes cover every condition core can establish before
              execution:

              • source failures emitted by the parser normal execution shares;
              • invalid root or Markdown-component frontmatter, props declarations, and
                return declarations;
              • target-selection failures for a targeted supplied root;
              • unresolved or ambiguous component selection;
              • invocation-form and engine-owned body-shape violations;
              • missing required props when their absence is statically established;
              • schema violations when every schema-visible prop value is static; and
              • invalid as, capture, return, or structural usage that the shared expansion
                rules can decide without evaluating document code.

              Validation uses the existing parser exactly as normal execution does. It does
              not add a strict MDX grammar beside that parser. Text the shared scanner does not
              recognize as an invocation remains text, and spread attributes retain their
              current execution semantics. A future change that makes either one an error
              changes parsing for validation and execution together.

              Invocation outcomes

              Validation applies checks whose answers do not depend on runtime values even
              when another part of the invocation is opaque. A definite resolution, authored
              form, engine-owned body-shape, or independently established structural failure
              makes the invocation invalid.

              Full props-schema validation runs only when every schema-visible prop value is
              static. A dynamic schema-visible expression or origin-only TypeScript contract
              that prevents the complete check makes an otherwise non-invalid invocation
              not-statically-checkable. A declared capture keeps the same deliberate schema
              bypass it has during execution and does not by itself make the invocation
              opaque. Validation does not implement a partial JSON Schema solver to infer
              additional failures from a mixture of static and dynamic prop values.

              Outcome precedence is therefore:

              1. invalid when any no-execution check proves a failure;
              2. not-statically-checkable when no failure is proven but at least one
                applicable check needs runtime information; and
              3. valid only when all applicable checks are statically proven.

              Repository TypeScript components whose catalog entry identifies only their
              origin have no invented props, forms, captures, returns, or documentation
              contract. Their invocation is not statically checkable unless a separate
              engine-owned rule already proves it invalid.

              No-execution boundary

              Validation does not invoke a component, evaluate a document expression, render
              or project content, start an agent, prompt or elicit, create or read a journal,
              execute a command, call an identity factory, install an operational provider, or
              perform a filesystem effect expressed by the document. It may read the supplied
              root and the component-definition files normal selection identifies, just as
              inspection does.

              Component resolution, declaration admission, schemas, authored forms, body
              rules, target selection, and source positions come from the same definitions as
              normal execution and the structured syntax catalog from #632. The operation
              must not introduce a second component registry, schema dialect, parser, or
              handwritten catalog.

              Acceptance criteria

              • A supplied document containing <DefinitelyMissing /> returns an unresolved
                component diagnostic without starting execution.
              • A supplied document containing <File /> without its required path returns
                a declaration/schema diagnostic without starting execution.
              • A valid document using built-in, registered, and included Markdown components
                passes validation.
              • A defect inside a recursively selected Markdown component is reported at that
                component source's authored position, including when the invocation is beneath
                authored control flow that validation does not evaluate.
              • Existing root-document parse, target, and declaration failures remain
                represented in the returned diagnostics.
              • A dynamic prop makes a schema-dependent invocation not statically checkable
                when no independent failure is certain; a definite form or body-shape failure
                on the same invocation still makes it invalid.
              • An origin-only TypeScript component is reported as not statically checkable
                where its invocation contract is unknown, rather than accepted under an
                invented schema or rejected merely for being opaque.
              • Repeated validation returns diagnostics and invocation records in the same
                documented order.
              • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
                person without parsing rendered CLI prose.
              • Focused evidence proves that validation creates no execution, agent, journal,
                elicitation, command, identity-factory, provider, or document-authored
                filesystem effects.

              Specification

              Update architecture.md and specs/executable-mdx-spec.md to define this
              non-executing validation boundary, its traversal and ordering, its version-1
              diagnostics, and the distinction between invalid and not-statically-checkable
              invocations. Spec, tests, and mechanics move together in the implementation PR.

              Sequencing

              Complete this core capability before implementing #260's verification and
              approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
              result rather than defining another validator.

              Out of scope

              • restricting generated programs to a safe component subset;
              • interpreting control-flow reachability;
              • partially solving JSON Schema across dynamic and static values;
              • proving dynamic JavaScript expressions or runtime-dependent prop values;
              • defining a stricter MDX grammar than normal execution uses;
              • executing a program to discover whether it succeeds; and
              • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

              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

                  Validate supplied document structure without executing it #653

                  Description

                  @taras

                  Motivation

                  xmd prompt (#260) must reject a generated program with a missing component or
                  an invalid component invocation before asking a person to approve it. Core's
                  current document inspection reads the root source and validates root metadata,
                  but it does not resolve components in the document body or validate their
                  declared props. Those failures are currently discovered only when execution
                  begins.

                  Provide one reusable core boundary that validates a supplied document without
                  executing it. The CLI can then use the same result for generated source, and
                  other hosts do not need to reproduce expansion rules.

                  Contract

                  The validation operation accepts the same declarative document context needed
                  to interpret a supplied root source: source text and identity, contextual cwd,
                  ordered includes, root props, the contextual component registry, and the plain
                  identity-component declarations the host supplies. It does not run an
                  ExecutionInstallation, call an identity factory, or install an operational
                  provider. This is the same declaration-only environment inspectSyntax() uses,
                  not a second registry or a reconstruction of the execution host.

                  Validation starts with the selected root projection, using the existing root
                  target selection and definition-validation order. It then follows normal
                  component selection through the recursive closure of resolved Markdown
                  component definitions. Each definition is parsed once by source identity, so a
                  cycle does not recurse forever, and every authored invocation site in those
                  sources is reported in source order. Validation does not interpret control-flow
                  reachability: an invocation inside a branch is still authored program structure.
                  Children authored beneath an origin-only TypeScript invocation remain part of
                  the containing source and are inspected even though validation cannot know
                  whether that component will project them.

                  The operation returns one versioned result:

                  interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

                  code is a closed set for version 1 rather than rendered CLI prose. A schema
                  diagnostic carries the same normalized AJV issues normal validation already
                  produces; consumers do not parse message to recover a property or keyword.
                  Sources are ordered by putting the root first, then processing a FIFO queue of
                  Markdown definitions in the order their first invocation is encountered. Within
                  one source, diagnostics and invocation records are ordered by source position;
                  multiple diagnostics at one position use the DocumentValidationCode order
                  shown above. An invocation's indexes point into that one ordered diagnostic
                  array. Root parse, target, frontmatter, props-declaration and return-declaration
                  failures have no invocation record when no invocation exists.
                  The document outcome is invalid exactly when the result contains a diagnostic
                  that represents a definite validation failure. An opaque invocation by itself
                  does not make the document invalid.

                  The version-1 diagnostic codes cover every condition core can establish before
                  execution:

                  • source failures emitted by the parser normal execution shares;
                  • invalid root or Markdown-component frontmatter, props declarations, and
                    return declarations;
                  • target-selection failures for a targeted supplied root;
                  • unresolved or ambiguous component selection;
                  • invocation-form and engine-owned body-shape violations;
                  • missing required props when their absence is statically established;
                  • schema violations when every schema-visible prop value is static; and
                  • invalid as, capture, return, or structural usage that the shared expansion
                    rules can decide without evaluating document code.

                  Validation uses the existing parser exactly as normal execution does. It does
                  not add a strict MDX grammar beside that parser. Text the shared scanner does not
                  recognize as an invocation remains text, and spread attributes retain their
                  current execution semantics. A future change that makes either one an error
                  changes parsing for validation and execution together.

                  Invocation outcomes

                  Validation applies checks whose answers do not depend on runtime values even
                  when another part of the invocation is opaque. A definite resolution, authored
                  form, engine-owned body-shape, or independently established structural failure
                  makes the invocation invalid.

                  Full props-schema validation runs only when every schema-visible prop value is
                  static. A dynamic schema-visible expression or origin-only TypeScript contract
                  that prevents the complete check makes an otherwise non-invalid invocation
                  not-statically-checkable. A declared capture keeps the same deliberate schema
                  bypass it has during execution and does not by itself make the invocation
                  opaque. Validation does not implement a partial JSON Schema solver to infer
                  additional failures from a mixture of static and dynamic prop values.

                  Outcome precedence is therefore:

                  1. invalid when any no-execution check proves a failure;
                  2. not-statically-checkable when no failure is proven but at least one
                    applicable check needs runtime information; and
                  3. valid only when all applicable checks are statically proven.

                  Repository TypeScript components whose catalog entry identifies only their
                  origin have no invented props, forms, captures, returns, or documentation
                  contract. Their invocation is not statically checkable unless a separate
                  engine-owned rule already proves it invalid.

                  No-execution boundary

                  Validation does not invoke a component, evaluate a document expression, render
                  or project content, start an agent, prompt or elicit, create or read a journal,
                  execute a command, call an identity factory, install an operational provider, or
                  perform a filesystem effect expressed by the document. It may read the supplied
                  root and the component-definition files normal selection identifies, just as
                  inspection does.

                  Component resolution, declaration admission, schemas, authored forms, body
                  rules, target selection, and source positions come from the same definitions as
                  normal execution and the structured syntax catalog from #632. The operation
                  must not introduce a second component registry, schema dialect, parser, or
                  handwritten catalog.

                  Acceptance criteria

                  • A supplied document containing <DefinitelyMissing /> returns an unresolved
                    component diagnostic without starting execution.
                  • A supplied document containing <File /> without its required path returns
                    a declaration/schema diagnostic without starting execution.
                  • A valid document using built-in, registered, and included Markdown components
                    passes validation.
                  • A defect inside a recursively selected Markdown component is reported at that
                    component source's authored position, including when the invocation is beneath
                    authored control flow that validation does not evaluate.
                  • Existing root-document parse, target, and declaration failures remain
                    represented in the returned diagnostics.
                  • A dynamic prop makes a schema-dependent invocation not statically checkable
                    when no independent failure is certain; a definite form or body-shape failure
                    on the same invocation still makes it invalid.
                  • An origin-only TypeScript component is reported as not statically checkable
                    where its invocation contract is unknown, rather than accepted under an
                    invented schema or rejected merely for being opaque.
                  • Repeated validation returns diagnostics and invocation records in the same
                    documented order.
                  • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
                    person without parsing rendered CLI prose.
                  • Focused evidence proves that validation creates no execution, agent, journal,
                    elicitation, command, identity-factory, provider, or document-authored
                    filesystem effects.

                  Specification

                  Update architecture.md and specs/executable-mdx-spec.md to define this
                  non-executing validation boundary, its traversal and ordering, its version-1
                  diagnostics, and the distinction between invalid and not-statically-checkable
                  invocations. Spec, tests, and mechanics move together in the implementation PR.

                  Sequencing

                  Complete this core capability before implementing #260's verification and
                  approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
                  result rather than defining another validator.

                  Out of scope

                  • restricting generated programs to a safe component subset;
                  • interpreting control-flow reachability;
                  • partially solving JSON Schema across dynamic and static values;
                  • proving dynamic JavaScript expressions or runtime-dependent prop values;
                  • defining a stricter MDX grammar than normal execution uses;
                  • executing a program to discover whether it succeeds; and
                  • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

                  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

                      Validate supplied document structure without executing it #653

                      Description

                      @taras

                      Motivation

                      xmd prompt (#260) must reject a generated program with a missing component or
                      an invalid component invocation before asking a person to approve it. Core's
                      current document inspection reads the root source and validates root metadata,
                      but it does not resolve components in the document body or validate their
                      declared props. Those failures are currently discovered only when execution
                      begins.

                      Provide one reusable core boundary that validates a supplied document without
                      executing it. The CLI can then use the same result for generated source, and
                      other hosts do not need to reproduce expansion rules.

                      Contract

                      The validation operation accepts the same declarative document context needed
                      to interpret a supplied root source: source text and identity, contextual cwd,
                      ordered includes, root props, the contextual component registry, and the plain
                      identity-component declarations the host supplies. It does not run an
                      ExecutionInstallation, call an identity factory, or install an operational
                      provider. This is the same declaration-only environment inspectSyntax() uses,
                      not a second registry or a reconstruction of the execution host.

                      Validation starts with the selected root projection, using the existing root
                      target selection and definition-validation order. It then follows normal
                      component selection through the recursive closure of resolved Markdown
                      component definitions. Each definition is parsed once by source identity, so a
                      cycle does not recurse forever, and every authored invocation site in those
                      sources is reported in source order. Validation does not interpret control-flow
                      reachability: an invocation inside a branch is still authored program structure.
                      Children authored beneath an origin-only TypeScript invocation remain part of
                      the containing source and are inspected even though validation cannot know
                      whether that component will project them.

                      The operation returns one versioned result:

                      interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

                      code is a closed set for version 1 rather than rendered CLI prose. A schema
                      diagnostic carries the same normalized AJV issues normal validation already
                      produces; consumers do not parse message to recover a property or keyword.
                      Sources are ordered by putting the root first, then processing a FIFO queue of
                      Markdown definitions in the order their first invocation is encountered. Within
                      one source, diagnostics and invocation records are ordered by source position;
                      multiple diagnostics at one position use the DocumentValidationCode order
                      shown above. An invocation's indexes point into that one ordered diagnostic
                      array. Root parse, target, frontmatter, props-declaration and return-declaration
                      failures have no invocation record when no invocation exists.
                      The document outcome is invalid exactly when the result contains a diagnostic
                      that represents a definite validation failure. An opaque invocation by itself
                      does not make the document invalid.

                      The version-1 diagnostic codes cover every condition core can establish before
                      execution:

                      • source failures emitted by the parser normal execution shares;
                      • invalid root or Markdown-component frontmatter, props declarations, and
                        return declarations;
                      • target-selection failures for a targeted supplied root;
                      • unresolved or ambiguous component selection;
                      • invocation-form and engine-owned body-shape violations;
                      • missing required props when their absence is statically established;
                      • schema violations when every schema-visible prop value is static; and
                      • invalid as, capture, return, or structural usage that the shared expansion
                        rules can decide without evaluating document code.

                      Validation uses the existing parser exactly as normal execution does. It does
                      not add a strict MDX grammar beside that parser. Text the shared scanner does not
                      recognize as an invocation remains text, and spread attributes retain their
                      current execution semantics. A future change that makes either one an error
                      changes parsing for validation and execution together.

                      Invocation outcomes

                      Validation applies checks whose answers do not depend on runtime values even
                      when another part of the invocation is opaque. A definite resolution, authored
                      form, engine-owned body-shape, or independently established structural failure
                      makes the invocation invalid.

                      Full props-schema validation runs only when every schema-visible prop value is
                      static. A dynamic schema-visible expression or origin-only TypeScript contract
                      that prevents the complete check makes an otherwise non-invalid invocation
                      not-statically-checkable. A declared capture keeps the same deliberate schema
                      bypass it has during execution and does not by itself make the invocation
                      opaque. Validation does not implement a partial JSON Schema solver to infer
                      additional failures from a mixture of static and dynamic prop values.

                      Outcome precedence is therefore:

                      1. invalid when any no-execution check proves a failure;
                      2. not-statically-checkable when no failure is proven but at least one
                        applicable check needs runtime information; and
                      3. valid only when all applicable checks are statically proven.

                      Repository TypeScript components whose catalog entry identifies only their
                      origin have no invented props, forms, captures, returns, or documentation
                      contract. Their invocation is not statically checkable unless a separate
                      engine-owned rule already proves it invalid.

                      No-execution boundary

                      Validation does not invoke a component, evaluate a document expression, render
                      or project content, start an agent, prompt or elicit, create or read a journal,
                      execute a command, call an identity factory, install an operational provider, or
                      perform a filesystem effect expressed by the document. It may read the supplied
                      root and the component-definition files normal selection identifies, just as
                      inspection does.

                      Component resolution, declaration admission, schemas, authored forms, body
                      rules, target selection, and source positions come from the same definitions as
                      normal execution and the structured syntax catalog from #632. The operation
                      must not introduce a second component registry, schema dialect, parser, or
                      handwritten catalog.

                      Acceptance criteria

                      • A supplied document containing <DefinitelyMissing /> returns an unresolved
                        component diagnostic without starting execution.
                      • A supplied document containing <File /> without its required path returns
                        a declaration/schema diagnostic without starting execution.
                      • A valid document using built-in, registered, and included Markdown components
                        passes validation.
                      • A defect inside a recursively selected Markdown component is reported at that
                        component source's authored position, including when the invocation is beneath
                        authored control flow that validation does not evaluate.
                      • Existing root-document parse, target, and declaration failures remain
                        represented in the returned diagnostics.
                      • A dynamic prop makes a schema-dependent invocation not statically checkable
                        when no independent failure is certain; a definite form or body-shape failure
                        on the same invocation still makes it invalid.
                      • An origin-only TypeScript component is reported as not statically checkable
                        where its invocation contract is unknown, rather than accepted under an
                        invented schema or rejected merely for being opaque.
                      • Repeated validation returns diagnostics and invocation records in the same
                        documented order.
                      • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
                        person without parsing rendered CLI prose.
                      • Focused evidence proves that validation creates no execution, agent, journal,
                        elicitation, command, identity-factory, provider, or document-authored
                        filesystem effects.

                      Specification

                      Update architecture.md and specs/executable-mdx-spec.md to define this
                      non-executing validation boundary, its traversal and ordering, its version-1
                      diagnostics, and the distinction between invalid and not-statically-checkable
                      invocations. Spec, tests, and mechanics move together in the implementation PR.

                      Sequencing

                      Complete this core capability before implementing #260's verification and
                      approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
                      result rather than defining another validator.

                      Out of scope

                      • restricting generated programs to a safe component subset;
                      • interpreting control-flow reachability;
                      • partially solving JSON Schema across dynamic and static values;
                      • proving dynamic JavaScript expressions or runtime-dependent prop values;
                      • defining a stricter MDX grammar than normal execution uses;
                      • executing a program to discover whether it succeeds; and
                      • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

                      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

                          Validate supplied document structure without executing it #653

                          Description

                          @taras

                          Motivation

                          xmd prompt (#260) must reject a generated program with a missing component or
                          an invalid component invocation before asking a person to approve it. Core's
                          current document inspection reads the root source and validates root metadata,
                          but it does not resolve components in the document body or validate their
                          declared props. Those failures are currently discovered only when execution
                          begins.

                          Provide one reusable core boundary that validates a supplied document without
                          executing it. The CLI can then use the same result for generated source, and
                          other hosts do not need to reproduce expansion rules.

                          Contract

                          The validation operation accepts the same declarative document context needed
                          to interpret a supplied root source: source text and identity, contextual cwd,
                          ordered includes, root props, the contextual component registry, and the plain
                          identity-component declarations the host supplies. It does not run an
                          ExecutionInstallation, call an identity factory, or install an operational
                          provider. This is the same declaration-only environment inspectSyntax() uses,
                          not a second registry or a reconstruction of the execution host.

                          Validation starts with the selected root projection, using the existing root
                          target selection and definition-validation order. It then follows normal
                          component selection through the recursive closure of resolved Markdown
                          component definitions. Each definition is parsed once by source identity, so a
                          cycle does not recurse forever, and every authored invocation site in those
                          sources is reported in source order. Validation does not interpret control-flow
                          reachability: an invocation inside a branch is still authored program structure.
                          Children authored beneath an origin-only TypeScript invocation remain part of
                          the containing source and are inspected even though validation cannot know
                          whether that component will project them.

                          The operation returns one versioned result:

                          interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

                          code is a closed set for version 1 rather than rendered CLI prose. A schema
                          diagnostic carries the same normalized AJV issues normal validation already
                          produces; consumers do not parse message to recover a property or keyword.
                          Sources are ordered by putting the root first, then processing a FIFO queue of
                          Markdown definitions in the order their first invocation is encountered. Within
                          one source, diagnostics and invocation records are ordered by source position;
                          multiple diagnostics at one position use the DocumentValidationCode order
                          shown above. An invocation's indexes point into that one ordered diagnostic
                          array. Root parse, target, frontmatter, props-declaration and return-declaration
                          failures have no invocation record when no invocation exists.
                          The document outcome is invalid exactly when the result contains a diagnostic
                          that represents a definite validation failure. An opaque invocation by itself
                          does not make the document invalid.

                          The version-1 diagnostic codes cover every condition core can establish before
                          execution:

                          • source failures emitted by the parser normal execution shares;
                          • invalid root or Markdown-component frontmatter, props declarations, and
                            return declarations;
                          • target-selection failures for a targeted supplied root;
                          • unresolved or ambiguous component selection;
                          • invocation-form and engine-owned body-shape violations;
                          • missing required props when their absence is statically established;
                          • schema violations when every schema-visible prop value is static; and
                          • invalid as, capture, return, or structural usage that the shared expansion
                            rules can decide without evaluating document code.

                          Validation uses the existing parser exactly as normal execution does. It does
                          not add a strict MDX grammar beside that parser. Text the shared scanner does not
                          recognize as an invocation remains text, and spread attributes retain their
                          current execution semantics. A future change that makes either one an error
                          changes parsing for validation and execution together.

                          Invocation outcomes

                          Validation applies checks whose answers do not depend on runtime values even
                          when another part of the invocation is opaque. A definite resolution, authored
                          form, engine-owned body-shape, or independently established structural failure
                          makes the invocation invalid.

                          Full props-schema validation runs only when every schema-visible prop value is
                          static. A dynamic schema-visible expression or origin-only TypeScript contract
                          that prevents the complete check makes an otherwise non-invalid invocation
                          not-statically-checkable. A declared capture keeps the same deliberate schema
                          bypass it has during execution and does not by itself make the invocation
                          opaque. Validation does not implement a partial JSON Schema solver to infer
                          additional failures from a mixture of static and dynamic prop values.

                          Outcome precedence is therefore:

                          1. invalid when any no-execution check proves a failure;
                          2. not-statically-checkable when no failure is proven but at least one
                            applicable check needs runtime information; and
                          3. valid only when all applicable checks are statically proven.

                          Repository TypeScript components whose catalog entry identifies only their
                          origin have no invented props, forms, captures, returns, or documentation
                          contract. Their invocation is not statically checkable unless a separate
                          engine-owned rule already proves it invalid.

                          No-execution boundary

                          Validation does not invoke a component, evaluate a document expression, render
                          or project content, start an agent, prompt or elicit, create or read a journal,
                          execute a command, call an identity factory, install an operational provider, or
                          perform a filesystem effect expressed by the document. It may read the supplied
                          root and the component-definition files normal selection identifies, just as
                          inspection does.

                          Component resolution, declaration admission, schemas, authored forms, body
                          rules, target selection, and source positions come from the same definitions as
                          normal execution and the structured syntax catalog from #632. The operation
                          must not introduce a second component registry, schema dialect, parser, or
                          handwritten catalog.

                          Acceptance criteria

                          • A supplied document containing <DefinitelyMissing /> returns an unresolved
                            component diagnostic without starting execution.
                          • A supplied document containing <File /> without its required path returns
                            a declaration/schema diagnostic without starting execution.
                          • A valid document using built-in, registered, and included Markdown components
                            passes validation.
                          • A defect inside a recursively selected Markdown component is reported at that
                            component source's authored position, including when the invocation is beneath
                            authored control flow that validation does not evaluate.
                          • Existing root-document parse, target, and declaration failures remain
                            represented in the returned diagnostics.
                          • A dynamic prop makes a schema-dependent invocation not statically checkable
                            when no independent failure is certain; a definite form or body-shape failure
                            on the same invocation still makes it invalid.
                          • An origin-only TypeScript component is reported as not statically checkable
                            where its invocation contract is unknown, rather than accepted under an
                            invented schema or rejected merely for being opaque.
                          • Repeated validation returns diagnostics and invocation records in the same
                            documented order.
                          • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
                            person without parsing rendered CLI prose.
                          • Focused evidence proves that validation creates no execution, agent, journal,
                            elicitation, command, identity-factory, provider, or document-authored
                            filesystem effects.

                          Specification

                          Update architecture.md and specs/executable-mdx-spec.md to define this
                          non-executing validation boundary, its traversal and ordering, its version-1
                          diagnostics, and the distinction between invalid and not-statically-checkable
                          invocations. Spec, tests, and mechanics move together in the implementation PR.

                          Sequencing

                          Complete this core capability before implementing #260's verification and
                          approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
                          result rather than defining another validator.

                          Out of scope

                          • restricting generated programs to a safe component subset;
                          • interpreting control-flow reachability;
                          • partially solving JSON Schema across dynamic and static values;
                          • proving dynamic JavaScript expressions or runtime-dependent prop values;
                          • defining a stricter MDX grammar than normal execution uses;
                          • executing a program to discover whether it succeeds; and
                          • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

                          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

                              Validate supplied document structure without executing it #653

                              Description

                              @taras

                              Motivation

                              xmd prompt (#260) must reject a generated program with a missing component or
                              an invalid component invocation before asking a person to approve it. Core's
                              current document inspection reads the root source and validates root metadata,
                              but it does not resolve components in the document body or validate their
                              declared props. Those failures are currently discovered only when execution
                              begins.

                              Provide one reusable core boundary that validates a supplied document without
                              executing it. The CLI can then use the same result for generated source, and
                              other hosts do not need to reproduce expansion rules.

                              Contract

                              The validation operation accepts the same declarative document context needed
                              to interpret a supplied root source: source text and identity, contextual cwd,
                              ordered includes, root props, the contextual component registry, and the plain
                              identity-component declarations the host supplies. It does not run an
                              ExecutionInstallation, call an identity factory, or install an operational
                              provider. This is the same declaration-only environment inspectSyntax() uses,
                              not a second registry or a reconstruction of the execution host.

                              Validation starts with the selected root projection, using the existing root
                              target selection and definition-validation order. It then follows normal
                              component selection through the recursive closure of resolved Markdown
                              component definitions. Each definition is parsed once by source identity, so a
                              cycle does not recurse forever, and every authored invocation site in those
                              sources is reported in source order. Validation does not interpret control-flow
                              reachability: an invocation inside a branch is still authored program structure.
                              Children authored beneath an origin-only TypeScript invocation remain part of
                              the containing source and are inspected even though validation cannot know
                              whether that component will project them.

                              The operation returns one versioned result:

                              interfaceDocumentValidation{readonlyversion: 1;readonlyoutcome: "valid"|"invalid";readonlydiagnostics: readonlyDocumentValidationDiagnostic[];readonlyinvocations: readonlyInvocationValidation[];}interfaceInvocationSite{readonlyname: string;readonlyposition?: Readonly<SourcePosition>;}typeInvocationValidation=InvocationSite&(|{readonlyoutcome: "valid";readonlyorigin: Readonly<ComponentOrigin>;}|{readonlyoutcome: "invalid";readonlyorigin?: Readonly<ComponentOrigin>;readonlydiagnosticIndexes: readonlynumber[];}|{readonlyoutcome: "not-statically-checkable";readonlyorigin: Readonly<ComponentOrigin>;readonlyreasons: readonly(|"dynamic-props"|"origin-only-contract")[];});typeDocumentValidationCode=|"source-unreadable"|"source-invalid"|"target-invalid"|"frontmatter-invalid"|"props-declaration-invalid"|"returns-declaration-invalid"|"component-unresolved"|"component-ambiguous"|"invocation-form-invalid"|"body-shape-invalid"|"props-invalid"|"binding-invalid"|"capture-invalid"|"return-usage-invalid"|"structural-usage-invalid";interfaceDocumentValidationDiagnostic{readonlycode: DocumentValidationCode;readonlymessage: string;readonlyposition?: Readonly<SourcePosition>;readonlycomponent?: string;readonlyissues?: readonlyNormalizedIssue[];}

                              code is a closed set for version 1 rather than rendered CLI prose. A schema
                              diagnostic carries the same normalized AJV issues normal validation already
                              produces; consumers do not parse message to recover a property or keyword.
                              Sources are ordered by putting the root first, then processing a FIFO queue of
                              Markdown definitions in the order their first invocation is encountered. Within
                              one source, diagnostics and invocation records are ordered by source position;
                              multiple diagnostics at one position use the DocumentValidationCode order
                              shown above. An invocation's indexes point into that one ordered diagnostic
                              array. Root parse, target, frontmatter, props-declaration and return-declaration
                              failures have no invocation record when no invocation exists.
                              The document outcome is invalid exactly when the result contains a diagnostic
                              that represents a definite validation failure. An opaque invocation by itself
                              does not make the document invalid.

                              The version-1 diagnostic codes cover every condition core can establish before
                              execution:

                              • source failures emitted by the parser normal execution shares;
                              • invalid root or Markdown-component frontmatter, props declarations, and
                                return declarations;
                              • target-selection failures for a targeted supplied root;
                              • unresolved or ambiguous component selection;
                              • invocation-form and engine-owned body-shape violations;
                              • missing required props when their absence is statically established;
                              • schema violations when every schema-visible prop value is static; and
                              • invalid as, capture, return, or structural usage that the shared expansion
                                rules can decide without evaluating document code.

                              Validation uses the existing parser exactly as normal execution does. It does
                              not add a strict MDX grammar beside that parser. Text the shared scanner does not
                              recognize as an invocation remains text, and spread attributes retain their
                              current execution semantics. A future change that makes either one an error
                              changes parsing for validation and execution together.

                              Invocation outcomes

                              Validation applies checks whose answers do not depend on runtime values even
                              when another part of the invocation is opaque. A definite resolution, authored
                              form, engine-owned body-shape, or independently established structural failure
                              makes the invocation invalid.

                              Full props-schema validation runs only when every schema-visible prop value is
                              static. A dynamic schema-visible expression or origin-only TypeScript contract
                              that prevents the complete check makes an otherwise non-invalid invocation
                              not-statically-checkable. A declared capture keeps the same deliberate schema
                              bypass it has during execution and does not by itself make the invocation
                              opaque. Validation does not implement a partial JSON Schema solver to infer
                              additional failures from a mixture of static and dynamic prop values.

                              Outcome precedence is therefore:

                              1. invalid when any no-execution check proves a failure;
                              2. not-statically-checkable when no failure is proven but at least one
                                applicable check needs runtime information; and
                              3. valid only when all applicable checks are statically proven.

                              Repository TypeScript components whose catalog entry identifies only their
                              origin have no invented props, forms, captures, returns, or documentation
                              contract. Their invocation is not statically checkable unless a separate
                              engine-owned rule already proves it invalid.

                              No-execution boundary

                              Validation does not invoke a component, evaluate a document expression, render
                              or project content, start an agent, prompt or elicit, create or read a journal,
                              execute a command, call an identity factory, install an operational provider, or
                              perform a filesystem effect expressed by the document. It may read the supplied
                              root and the component-definition files normal selection identifies, just as
                              inspection does.

                              Component resolution, declaration admission, schemas, authored forms, body
                              rules, target selection, and source positions come from the same definitions as
                              normal execution and the structured syntax catalog from #632. The operation
                              must not introduce a second component registry, schema dialect, parser, or
                              handwritten catalog.

                              Acceptance criteria

                              • A supplied document containing <DefinitelyMissing /> returns an unresolved
                                component diagnostic without starting execution.
                              • A supplied document containing <File /> without its required path returns
                                a declaration/schema diagnostic without starting execution.
                              • A valid document using built-in, registered, and included Markdown components
                                passes validation.
                              • A defect inside a recursively selected Markdown component is reported at that
                                component source's authored position, including when the invocation is beneath
                                authored control flow that validation does not evaluate.
                              • Existing root-document parse, target, and declaration failures remain
                                represented in the returned diagnostics.
                              • A dynamic prop makes a schema-dependent invocation not statically checkable
                                when no independent failure is certain; a definite form or body-shape failure
                                on the same invocation still makes it invalid.
                              • An origin-only TypeScript component is reported as not statically checkable
                                where its invocation contract is unknown, rather than accepted under an
                                invented schema or rejected merely for being opaque.
                              • Repeated validation returns diagnostics and invocation records in the same
                                documented order.
                              • Add xmd prompt: turn a request into an approved executable Plan #260 can send the versioned diagnostics to an ACP generator and show them to a
                                person without parsing rendered CLI prose.
                              • Focused evidence proves that validation creates no execution, agent, journal,
                                elicitation, command, identity-factory, provider, or document-authored
                                filesystem effects.

                              Specification

                              Update architecture.md and specs/executable-mdx-spec.md to define this
                              non-executing validation boundary, its traversal and ordering, its version-1
                              diagnostics, and the distinction between invalid and not-statically-checkable
                              invocations. Spec, tests, and mechanics move together in the implementation PR.

                              Sequencing

                              Complete this core capability before implementing #260's verification and
                              approval loop. #632's syntax-catalog dependency is complete; #260 consumes this
                              result rather than defining another validator.

                              Out of scope

                              • restricting generated programs to a safe component subset;
                              • interpreting control-flow reachability;
                              • partially solving JSON Schema across dynamic and static values;
                              • proving dynamic JavaScript expressions or runtime-dependent prop values;
                              • defining a stricter MDX grammar than normal execution uses;
                              • executing a program to discover whether it succeeds; and
                              • generation, repair, approval, saving, or execution behavior owned by Add xmd prompt: turn a request into an approved executable Plan #260.

                              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