os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

Description

@os-litant

Found while working on #14139 (the same literal on the filter surface); out of scope
there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
comment already anticipated this one: "packages/cli/src/commands/explain.ts's
$currentUser is a default-value sample on a different surface and is out of this card's
scope; if it is also wrong it is a domain:cli card."

The sample

packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
the text os explain flow prints to an author:

example: `{
name: 'assign_on_create',
type: 'autolaunched',
label: 'Auto-Assign on Create',
trigger: { object: 'project_task', event: 'afterInsert' },
steps: [
{ type: 'assignment', field: 'assigned_to', value: '$currentUser' },
],
}`,

Note this is a flow step of type: 'assignment' (Set Variable,
packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
query filter. The surface is its own; that is exactly why #14139 left it alone.

What was measured

On origin/main:

  • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
    repository — this sample.
    (git grep -n -F '$currentUser' returns 4 hits: this line,
    two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
    docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
  • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
    written {record.field} and validated by flow-template-unknown-field
    (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
    unresolvable path "resolves to an empty string at runtime (silently)".
  • The $-prefixed sentinels that do exist are enumerated and different: $root
    (approval organization), $trigger, $record, $source. There is no $currentUser
    among them, and no alias table maps it.
  • The acting-user token on the value-producing surface next door is spelled bare:
    DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
    (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
    isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
    authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
    carries currentuser only as a near-miss suggestion, and
    default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
  • Nothing in packages/services/service-automation strips or resolves a leading $ in an
    assignment value.

What was NOT measured — please settle this in triage

I did not execute an assignment node with this value against a running engine. So the
claim I am confident in is "no declared vocabulary contains this spelling and nothing was
found that resolves it"; the claim I have not proved is "an assignment step therefore
stores the literal string $currentUser into assigned_to". If it does, that is the
lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
incident catalogued in the default-value-tokens.ts module note.

Why it matters

os explain is an authoring aid whose whole audience is authors — increasingly AI authors
— writing their first flow. It is the one place a reader is told what an assignment value
looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
validation or is silently stored as text, and the reader has no other reference to correct
it against.

Likely fix

Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
the sample use it. If no such token exists on this surface, the sample should assign
something that does resolve rather than inventing a sentinel — and the gap itself is worth a
separate decision, since "assign to the current user on create" is the textbook
auto-assignment flow.

Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

    Description

    @os-litant

    Found while working on #14139 (the same literal on the filter surface); out of scope
    there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
    comment already anticipated this one: "packages/cli/src/commands/explain.ts's
    $currentUser is a default-value sample on a different surface and is out of this card's
    scope; if it is also wrong it is a domain:cli card."

    The sample

    packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
    the text os explain flow prints to an author:

    example: `{
    name: 'assign_on_create',
    type: 'autolaunched',
    label: 'Auto-Assign on Create',
    trigger: { object: 'project_task', event: 'afterInsert' },
    steps: [
    { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
    ],
    }`,
    

    Note this is a flow step of type: 'assignment' (Set Variable,
    packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
    query filter. The surface is its own; that is exactly why #14139 left it alone.

    What was measured

    On origin/main:

    • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
      repository — this sample.
      (git grep -n -F '$currentUser' returns 4 hits: this line,
      two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
      docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
    • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
      written {record.field} and validated by flow-template-unknown-field
      (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
      unresolvable path "resolves to an empty string at runtime (silently)".
    • The $-prefixed sentinels that do exist are enumerated and different: $root
      (approval organization), $trigger, $record, $source. There is no $currentUser
      among them, and no alias table maps it.
    • The acting-user token on the value-producing surface next door is spelled bare:
      DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
      (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
      isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
      authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
      carries currentuser only as a near-miss suggestion, and
      default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
    • Nothing in packages/services/service-automation strips or resolves a leading $ in an
      assignment value.

    What was NOT measured — please settle this in triage

    I did not execute an assignment node with this value against a running engine. So the
    claim I am confident in is "no declared vocabulary contains this spelling and nothing was
    found that resolves it"; the claim I have not proved is "an assignment step therefore
    stores the literal string $currentUser into assigned_to". If it does, that is the
    lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
    incident catalogued in the default-value-tokens.ts module note.

    Why it matters

    os explain is an authoring aid whose whole audience is authors — increasingly AI authors
    — writing their first flow. It is the one place a reader is told what an assignment value
    looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
    validation or is silently stored as text, and the reader has no other reference to correct
    it against.

    Likely fix

    Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
    the sample use it. If no such token exists on this surface, the sample should assign
    something that does resolve rather than inventing a sentinel — and the gap itself is worth a
    separate decision, since "assign to the current user on create" is the textbook
    auto-assignment flow.

    Generated by Claude Code

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

      Description

      @os-litant

      Found while working on #14139 (the same literal on the filter surface); out of scope
      there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
      comment already anticipated this one: "packages/cli/src/commands/explain.ts's
      $currentUser is a default-value sample on a different surface and is out of this card's
      scope; if it is also wrong it is a domain:cli card."

      The sample

      packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
      the text os explain flow prints to an author:

      example: `{
      name: 'assign_on_create',
      type: 'autolaunched',
      label: 'Auto-Assign on Create',
      trigger: { object: 'project_task', event: 'afterInsert' },
      steps: [
      { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
      ],
      }`,
      

      Note this is a flow step of type: 'assignment' (Set Variable,
      packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
      query filter. The surface is its own; that is exactly why #14139 left it alone.

      What was measured

      On origin/main:

      • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
        repository — this sample.
        (git grep -n -F '$currentUser' returns 4 hits: this line,
        two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
        docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
      • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
        written {record.field} and validated by flow-template-unknown-field
        (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
        unresolvable path "resolves to an empty string at runtime (silently)".
      • The $-prefixed sentinels that do exist are enumerated and different: $root
        (approval organization), $trigger, $record, $source. There is no $currentUser
        among them, and no alias table maps it.
      • The acting-user token on the value-producing surface next door is spelled bare:
        DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
        (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
        isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
        authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
        carries currentuser only as a near-miss suggestion, and
        default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
      • Nothing in packages/services/service-automation strips or resolves a leading $ in an
        assignment value.

      What was NOT measured — please settle this in triage

      I did not execute an assignment node with this value against a running engine. So the
      claim I am confident in is "no declared vocabulary contains this spelling and nothing was
      found that resolves it"; the claim I have not proved is "an assignment step therefore
      stores the literal string $currentUser into assigned_to". If it does, that is the
      lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
      incident catalogued in the default-value-tokens.ts module note.

      Why it matters

      os explain is an authoring aid whose whole audience is authors — increasingly AI authors
      — writing their first flow. It is the one place a reader is told what an assignment value
      looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
      validation or is silently stored as text, and the reader has no other reference to correct
      it against.

      Likely fix

      Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
      the sample use it. If no such token exists on this surface, the sample should assign
      something that does resolve rather than inventing a sentinel — and the gap itself is worth a
      separate decision, since "assign to the current user on create" is the textbook
      auto-assignment flow.

      Generated by Claude Code

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

        Description

        @os-litant

        Found while working on #14139 (the same literal on the filter surface); out of scope
        there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
        comment already anticipated this one: "packages/cli/src/commands/explain.ts's
        $currentUser is a default-value sample on a different surface and is out of this card's
        scope; if it is also wrong it is a domain:cli card."

        The sample

        packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
        the text os explain flow prints to an author:

        example: `{
        name: 'assign_on_create',
        type: 'autolaunched',
        label: 'Auto-Assign on Create',
        trigger: { object: 'project_task', event: 'afterInsert' },
        steps: [
        { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
        ],
        }`,
        

        Note this is a flow step of type: 'assignment' (Set Variable,
        packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
        query filter. The surface is its own; that is exactly why #14139 left it alone.

        What was measured

        On origin/main:

        • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
          repository — this sample.
          (git grep -n -F '$currentUser' returns 4 hits: this line,
          two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
          docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
        • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
          written {record.field} and validated by flow-template-unknown-field
          (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
          unresolvable path "resolves to an empty string at runtime (silently)".
        • The $-prefixed sentinels that do exist are enumerated and different: $root
          (approval organization), $trigger, $record, $source. There is no $currentUser
          among them, and no alias table maps it.
        • The acting-user token on the value-producing surface next door is spelled bare:
          DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
          (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
          isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
          authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
          carries currentuser only as a near-miss suggestion, and
          default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
        • Nothing in packages/services/service-automation strips or resolves a leading $ in an
          assignment value.

        What was NOT measured — please settle this in triage

        I did not execute an assignment node with this value against a running engine. So the
        claim I am confident in is "no declared vocabulary contains this spelling and nothing was
        found that resolves it"; the claim I have not proved is "an assignment step therefore
        stores the literal string $currentUser into assigned_to". If it does, that is the
        lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
        incident catalogued in the default-value-tokens.ts module note.

        Why it matters

        os explain is an authoring aid whose whole audience is authors — increasingly AI authors
        — writing their first flow. It is the one place a reader is told what an assignment value
        looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
        validation or is silently stored as text, and the reader has no other reference to correct
        it against.

        Likely fix

        Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
        the sample use it. If no such token exists on this surface, the sample should assign
        something that does resolve rather than inventing a sentinel — and the gap itself is worth a
        separate decision, since "assign to the current user on create" is the textbook
        auto-assignment flow.

        Generated by Claude Code

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

          Description

          @os-litant

          Found while working on #14139 (the same literal on the filter surface); out of scope
          there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
          comment already anticipated this one: "packages/cli/src/commands/explain.ts's
          $currentUser is a default-value sample on a different surface and is out of this card's
          scope; if it is also wrong it is a domain:cli card."

          The sample

          packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
          the text os explain flow prints to an author:

          example: `{
          name: 'assign_on_create',
          type: 'autolaunched',
          label: 'Auto-Assign on Create',
          trigger: { object: 'project_task', event: 'afterInsert' },
          steps: [
          { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
          ],
          }`,
          

          Note this is a flow step of type: 'assignment' (Set Variable,
          packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
          query filter. The surface is its own; that is exactly why #14139 left it alone.

          What was measured

          On origin/main:

          • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
            repository — this sample.
            (git grep -n -F '$currentUser' returns 4 hits: this line,
            two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
            docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
          • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
            written {record.field} and validated by flow-template-unknown-field
            (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
            unresolvable path "resolves to an empty string at runtime (silently)".
          • The $-prefixed sentinels that do exist are enumerated and different: $root
            (approval organization), $trigger, $record, $source. There is no $currentUser
            among them, and no alias table maps it.
          • The acting-user token on the value-producing surface next door is spelled bare:
            DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
            (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
            isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
            authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
            carries currentuser only as a near-miss suggestion, and
            default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
          • Nothing in packages/services/service-automation strips or resolves a leading $ in an
            assignment value.

          What was NOT measured — please settle this in triage

          I did not execute an assignment node with this value against a running engine. So the
          claim I am confident in is "no declared vocabulary contains this spelling and nothing was
          found that resolves it"; the claim I have not proved is "an assignment step therefore
          stores the literal string $currentUser into assigned_to". If it does, that is the
          lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
          incident catalogued in the default-value-tokens.ts module note.

          Why it matters

          os explain is an authoring aid whose whole audience is authors — increasingly AI authors
          — writing their first flow. It is the one place a reader is told what an assignment value
          looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
          validation or is silently stored as text, and the reader has no other reference to correct
          it against.

          Likely fix

          Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
          the sample use it. If no such token exists on this surface, the sample should assign
          something that does resolve rather than inventing a sentinel — and the gap itself is worth a
          separate decision, since "assign to the current user on create" is the textbook
          auto-assignment flow.

          Generated by Claude Code

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

            Description

            @os-litant

            Found while working on #14139 (the same literal on the filter surface); out of scope
            there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
            comment already anticipated this one: "packages/cli/src/commands/explain.ts's
            $currentUser is a default-value sample on a different surface and is out of this card's
            scope; if it is also wrong it is a domain:cli card."

            The sample

            packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
            the text os explain flow prints to an author:

            example: `{
            name: 'assign_on_create',
            type: 'autolaunched',
            label: 'Auto-Assign on Create',
            trigger: { object: 'project_task', event: 'afterInsert' },
            steps: [
            { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
            ],
            }`,
            

            Note this is a flow step of type: 'assignment' (Set Variable,
            packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
            query filter. The surface is its own; that is exactly why #14139 left it alone.

            What was measured

            On origin/main:

            • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
              repository — this sample.
              (git grep -n -F '$currentUser' returns 4 hits: this line,
              two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
              docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
            • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
              written {record.field} and validated by flow-template-unknown-field
              (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
              unresolvable path "resolves to an empty string at runtime (silently)".
            • The $-prefixed sentinels that do exist are enumerated and different: $root
              (approval organization), $trigger, $record, $source. There is no $currentUser
              among them, and no alias table maps it.
            • The acting-user token on the value-producing surface next door is spelled bare:
              DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
              (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
              isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
              authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
              carries currentuser only as a near-miss suggestion, and
              default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
            • Nothing in packages/services/service-automation strips or resolves a leading $ in an
              assignment value.

            What was NOT measured — please settle this in triage

            I did not execute an assignment node with this value against a running engine. So the
            claim I am confident in is "no declared vocabulary contains this spelling and nothing was
            found that resolves it"; the claim I have not proved is "an assignment step therefore
            stores the literal string $currentUser into assigned_to". If it does, that is the
            lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
            incident catalogued in the default-value-tokens.ts module note.

            Why it matters

            os explain is an authoring aid whose whole audience is authors — increasingly AI authors
            — writing their first flow. It is the one place a reader is told what an assignment value
            looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
            validation or is silently stored as text, and the reader has no other reference to correct
            it against.

            Likely fix

            Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
            the sample use it. If no such token exists on this surface, the sample should assign
            something that does resolve rather than inventing a sentinel — and the gap itself is worth a
            separate decision, since "assign to the current user on create" is the textbook
            auto-assignment flow.

            Generated by Claude Code

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

              Description

              @os-litant

              Found while working on #14139 (the same literal on the filter surface); out of scope
              there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
              comment already anticipated this one: "packages/cli/src/commands/explain.ts's
              $currentUser is a default-value sample on a different surface and is out of this card's
              scope; if it is also wrong it is a domain:cli card."

              The sample

              packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
              the text os explain flow prints to an author:

              example: `{
              name: 'assign_on_create',
              type: 'autolaunched',
              label: 'Auto-Assign on Create',
              trigger: { object: 'project_task', event: 'afterInsert' },
              steps: [
              { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
              ],
              }`,
              

              Note this is a flow step of type: 'assignment' (Set Variable,
              packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
              query filter. The surface is its own; that is exactly why #14139 left it alone.

              What was measured

              On origin/main:

              • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
                repository — this sample.
                (git grep -n -F '$currentUser' returns 4 hits: this line,
                two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
                docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
              • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
                written {record.field} and validated by flow-template-unknown-field
                (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
                unresolvable path "resolves to an empty string at runtime (silently)".
              • The $-prefixed sentinels that do exist are enumerated and different: $root
                (approval organization), $trigger, $record, $source. There is no $currentUser
                among them, and no alias table maps it.
              • The acting-user token on the value-producing surface next door is spelled bare:
                DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
                (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
                isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
                authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
                carries currentuser only as a near-miss suggestion, and
                default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
              • Nothing in packages/services/service-automation strips or resolves a leading $ in an
                assignment value.

              What was NOT measured — please settle this in triage

              I did not execute an assignment node with this value against a running engine. So the
              claim I am confident in is "no declared vocabulary contains this spelling and nothing was
              found that resolves it"; the claim I have not proved is "an assignment step therefore
              stores the literal string $currentUser into assigned_to". If it does, that is the
              lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
              incident catalogued in the default-value-tokens.ts module note.

              Why it matters

              os explain is an authoring aid whose whole audience is authors — increasingly AI authors
              — writing their first flow. It is the one place a reader is told what an assignment value
              looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
              validation or is silently stored as text, and the reader has no other reference to correct
              it against.

              Likely fix

              Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
              the sample use it. If no such token exists on this surface, the sample should assign
              something that does resolve rather than inventing a sentinel — and the gap itself is worth a
              separate decision, since "assign to the current user on create" is the textbook
              auto-assignment flow.

              Generated by Claude Code

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                os explain flow's example teaches $currentUser as an assignment value, a spelling nothing resolves #14782

                Description

                @os-litant

                Found while working on #14139 (the same literal on the filter surface); out of scope
                there, filed unassigned for triage. Suggested domain: domain:cli. That card's triage
                comment already anticipated this one: "packages/cli/src/commands/explain.ts's
                $currentUser is a default-value sample on a different surface and is out of this card's
                scope; if it is also wrong it is a domain:cli card."

                The sample

                packages/cli/src/commands/explain.ts:128, inside the flow entry's example string —
                the text os explain flow prints to an author:

                example: `{
                name: 'assign_on_create',
                type: 'autolaunched',
                label: 'Auto-Assign on Create',
                trigger: { object: 'project_task', event: 'afterInsert' },
                steps: [
                { type: 'assignment', field: 'assigned_to', value: '$currentUser' },
                ],
                }`,
                

                Note this is a flow step of type: 'assignment' (Set Variable,
                packages/spec/src/automation/flow.zod.ts:30) — not a field defaultValue, and not a
                query filter. The surface is its own; that is exactly why #14139 left it alone.

                What was measured

                On origin/main:

                • The literal appears exactly once in non-test, non-CHANGELOG source in the whole
                  repository — this sample.
                  (git grep -n -F '$currentUser' returns 4 hits: this line,
                  two in skills/objectstack-ui/rules/list-views.md which skills/objectstack-ui teaches $currentUser as a filter value, contradicting its own "only two tokens resolve in a filter" contract #14139 is fixing, and
                  docs/adr/0017-object-has-many-view.md:216 which is SQL-shaped prose.)
                • The flow template vocabulary is brace-based, not $-prefixed. Flow templates are
                  written {record.field} and validated by flow-template-unknown-field
                  (packages/lint/src/validate-flow-template-paths.ts:92), whose diagnostics say an
                  unresolvable path "resolves to an empty string at runtime (silently)".
                • The $-prefixed sentinels that do exist are enumerated and different: $root
                  (approval organization), $trigger, $record, $source. There is no $currentUser
                  among them, and no alias table maps it.
                • The acting-user token on the value-producing surface next door is spelled bare:
                  DEFAULT_VALUE_TOKEN_CURRENT_USER = 'current_user'
                  (packages/spec/src/data/default-value-tokens.ts:67), matched EXACTLY by
                  isCurrentUserDefaultToken (:114-116), whose own comment names currentUser as an
                  authoring error rather than an accepted spelling. packages/spec/src/data/default-value-shape.ts:225
                  carries currentuser only as a near-miss suggestion, and
                  default-value-shape.test.ts:54 pins currentUser (camelCase) is a literal.
                • Nothing in packages/services/service-automation strips or resolves a leading $ in an
                  assignment value.

                What was NOT measured — please settle this in triage

                I did not execute an assignment node with this value against a running engine. So the
                claim I am confident in is "no declared vocabulary contains this spelling and nothing was
                found that resolves it"; the claim I have not proved is "an assignment step therefore
                stores the literal string $currentUser into assigned_to". If it does, that is the
                lookup('sys_user') column taking a bogus literal — the same failure class as the DDL
                incident catalogued in the default-value-tokens.ts module note.

                Why it matters

                os explain is an authoring aid whose whole audience is authors — increasingly AI authors
                — writing their first flow. It is the one place a reader is told what an assignment value
                looks like. If the spelling resolves nowhere, the sample teaches a value that either fails
                validation or is silently stored as text, and the reader has no other reference to correct
                it against.

                Likely fix

                Decide the correct spelling for "the acting user" on the flow-assignment surface, then make
                the sample use it. If no such token exists on this surface, the sample should assign
                something that does resolve rather than inventing a sentinel — and the gap itself is worth a
                separate decision, since "assign to the current user on create" is the textbook
                auto-assignment flow.

                Generated by Claude Code

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions