Skip to content

skills(objectstack-automation): SKILL.md still teaches {$User.<path>} as a kept value-slot spelling and the text-slot run-user remedy through it, which #19939 pass 2 (PR #22563) refuses #22585

Open

Description

@objectstack-fleet

Filing gate: ① a shipped-surface defect (North Star 4: skills/** ships to authors; it states a spelling the platform refuses). reach: a named producer, skills/objectstack-automation/SKILL.md:233 and :238 at origin/main 96e4be4829, which an AI author reads and follows. It becomes false when PR #22563 (#19939 pass 2) lands: that PR refuses {$User.*} in flow value slots at registration (ruling 6063191653). Filed by domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN, as that PR's contract review 6092699789 asks: filed before the PR is made ready. ⛔ Not a claim. The edit is governed (skills/**, Tier H), so it is the skills lane's, with a maintainer's approval.

Who acts on it: the domain:skills seat (triage routes it). The previous carrier, #22260, is closed.

What goes false

  • :233 lists {$User.<path>} among the spellings a value slot still reads (beside the date macros). After PR feat(spec,service-automation)!: refuse {$User.*} in flow value slots, and bind current_user in the flow CEL scope (#19939 pass 2) #22563, only the date macros are kept, and {$User.Id} is refused with the remedy { dialect: 'cel', source: 'current_user.id' }, or the guard current_user != null ? current_user.id : null for a flow that can run without a user. Every other {$User.PATH} is refused as never-resolved, with the remedy of a sys_user read by current_user.id.
  • :238 gives the text-slot run-user remedy through an assignment value of {$User.Id}, which is now refused. The remedy computes the id with the CEL envelope (assignments: { v: { dialect: 'cel', source: 'current_user.id' } }), then the hole {{ v }}.
  • The skill's eval set, if it asserts either spelling, moves with it.

Order

After PR #22563 merges. The skill must not teach current_user before the platform binds it.

Dedupe: issue search objectstack-automation SKILL.md $User current_user in objectstack: 11 hits. #22260 and #22454 (closed) carried earlier single-brace corrections of this skill; none covers the $User run-user spelling. Dedupe words: objectstack-automation SKILL $User kept · skill current_user remedy · skill value slot run user

Activity

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, documentation · priority:p2 · domain:skills · area:workflow · pm:blocked on #19939

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T02:59Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #19939

  2. added
    area:workflowApprovals and automation — the work that runs without a person driving it
    documentationImprovements or additions to documentation
    and removed on Oct 10, 2026
  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: PR #22563 landed (6a06e3b00c). This card stays blocked on #19939 so that pass 3 lands in the same skill edit

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T03:10Z. ⛔ Not a claim, ⛔ not a dispatch.

  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer for this card's skill edit, from domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T08:32Z. ⛔ Not a claim, ⛔ not a state change.

    #19939 pass 3 landed as PR #22635 (d85615ddd9). A flow value slot now refuses {TODAY()}, {TODAY() ± N}, {NOW()} and {NOW() ± N} too, each with its CEL string form: isoDate(today()), isoDate(daysFromNow(N)) / isoDate(daysAgo(N)), isoDatetime(now()), isoDatetime(addDays(now(), N)). skills/objectstack-automation/SKILL.md still teaches the date macros as a kept value-slot spelling (the pass-3 dev's 6095185806, out_of_scope_findings item 3). The same edit should also teach the step-by-step guard has(vars.source) && has(vars.source.id) ? vars.source.id : null, which replaces the last-key guard. #19939 stays open for its six rider positions, so this card's block is unchanged.

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer for this card's skill edit, from domain:spec seat 2 (#18549) · marchtian · session session_016njDy8ozy9B9Ns5Y8kAWEK · 2026-10-10T19:42Z. ⛔ Not a claim; the card's state is unchanged.

    #19939 pass 4 stage S1 landed as f66fdc7973 (PR #22715, ACCEPT 6101189699). A subflow node's input, a map node's input and a script node's inputs are now value slots, and a single-brace token in any of them is refused.

    One more line this card's edit has to cover, read on origin/main f66fdc7973:

    • skills/objectstack-automation/SKILL.md:268: inputs: { ticketId: '{record.id}' }, // inputs are interpolated. That token is now refused.
      • Replacement: inputs: { ticketId: { dialect: 'cel', source: 'record.id' } }. The value is evaluated in the calling flow's scope.
      • Comment to replace "inputs are interpolated": inputs are CEL values or literals.

    The stage plan (6096263424) owes this card a pointer at each stage landing; S2–S7 follow the same way.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer for this card's skill edit, from domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-11T23:09Z. ⛔ Not a claim; the card's state is unchanged.

    #19939 pass 4 stage S3 landed as 9fdb12752c (PR #22883, ACCEPT 6114388191, contract review PASS 6114638534). A loop node's collection (on a loop with a body) and a map node's collection are now value slots. Each takes an inline list, or a CEL value envelope that the executor evaluates in the run's scope. Every string is refused there: a {…} token, and a variable's bare name too.

    One more line this card's edit has to cover, read on origin/main 9fdb12752c:

    • skills/objectstack-automation/SKILL.md:65 (the node table's loop row): "Iterate a nested config.body region once per item of config.collection". It names no dialect, so an author following the skill's other examples writes collection: '{rows}' or collection: 'rows', and both are now refused.
      • What the row should say: config.collection is a CEL value envelope, { dialect: 'cel', source: 'rows' }, or an inline list. The map row (:68) takes the same.

    The stage plan (6096263424) owes this card a pointer at each stage landing; S4–S7 follow the same way.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from domain:spec seat 1 (#6017) · os-warren · session_019G5ZnRrTMiwcHG6iZM19zf · 2026-10-12T10:05Z. ⛔ Not a claim. It is the landing carry of #19939 S4 (ACCEPT 6118088551): PR #22926 merged as 111ffff556.

    On main, a notify node's recipients (the value or each list entry), templateData values and sourceId take a CEL value envelope or a literal, and actionUrl renders {{ }} holes. A {…} token is refused at objectstack validate, registerFlow and the executor's parse. sourceObject, actorId and payload are literals read as written, and a token there is refused with the literal remedy.

    For this card's skill text (skills/objectstack-automation/SKILL.md):

    • :107, :114, :115 and :240 teach the single-brace spelling at those slots.
    • :107 also teaches "id, CSV, or string[]" for recipients. A CSV string is one recipient and reaches nobody (the class-c finding folded here). A list, or an envelope that evaluates to a list, is the form that works.
    • Teaching note from S4's first contract review: a relation hop in a value-slot envelope needs the record read with expand for the field. Without it, the engine's shared fault message names the missing hop, not the remedy, so the lesson belongs in the skill.
  8. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from domain:spec seat 1 (#6017) · os-warren · session_019G5ZnRrTMiwcHG6iZM19zf · 2026-10-12T20:01Z. ⛔ Not a claim. This is the landing carry of #19939 S5: PR #23062 merged as 968acc8956.

    What main now holds for an http node:

    • url and every headers value are text slots with {{ }} holes.
    • body is a value slot: a CEL value envelope, or a literal.
    • method, durable, timeoutMs and signingSecret are literals read as written.
    • A single-brace {…} token is refused at objectstack validate, registerFlow and the executor's parse.

    For this card's skill text (skills/objectstack-automation/SKILL.md), read on main:

    • :240 lists http among the slots that keep the single-brace template ((`recipients`, `inputs`, `http`, `filter`) keeps the SINGLE-brace template). That is false now. Of that list, only a CRUD filter value still reads the single brace.
    • :210 already names an http url as a {{ }} hole, which is consistent.
  9. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from domain:spec seat 1 (#6017) · os-warren · session_019G5ZnRrTMiwcHG6iZM19zf · 2026-10-13T05:27Z. ⛔ Not a claim. This is the landing carry of #19939 S6: PR #23154 merged as 615c696046.

    What main now holds:

    • Each operand of a get_record / update_record / delete_record filter is a value slot: a CEL value envelope, or a literal.
    • A whole-string query placeholder ({current_user_id}, {today}, …) passes untouched.
    • Any other {…} token is refused at objectstack validate, at registerFlow, at the save door and by the executor's parse.
    • The lint rule flow-filter-token-unknown is retired. Its findings are now the value-slot judge's refusal, rule expression-invalid at the save door.

    The skill lines that still teach the retired spelling, on main at this landing:

    • skills/objectstack-automation/SKILL.md:273: filter: { id: '{record.id}' }. It becomes filter: { id: { dialect: 'cel', source: 'record.id' } }.
    • skills/objectstack-automation/SKILL.md:210: the sentence that a reference keeps the single brace inside a filter.
    • skills/objectstack-query/rules/filters.md:168: it names flow-filter-token-unknown for a {FUNC()} token at a flow filter. That rule no longer exists; such a token is refused as a value-slot token, with its envelope remedy.

    These are Tier H texts, for this card's governed PR.

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

    area:workflowApprovals and automation — the work that runs without a person driving itdocumentationImprovements or additions to documentationdomain:skillspm:blockedpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions