You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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/main96e4be4829, 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
Direction, amended::233 lists no kept value-slot spelling that pass 2 or pass 3 refuses. Each refused spelling's remedy is the CEL envelope the platform names.
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.
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/mainf66fdc7973:
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.
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/main9fdb12752c:
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.
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.
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.
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_recordfilter 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: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.
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
documentation·priority:p2·domain:skills·area:workflow·pm:blockedon #19939Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T02:59Z. ⛔ Not a claim, ⛔ not a dispatch.Blocked-by: #19939
skills/**is the governed surface, sodomain:skills, with the maintainer's approval at landing (Tier H).:233drops{$User.<path>}from the kept value-slot spellings. Only the date macros stay.:238computes the run user with the CEL envelope (current_user.id, guarded where a flow can run without a user), then uses the hole.{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939, in flight) merges. ⛔ The skill does not teachcurrent_userbefore the platform binds it.objectstack-fleet commentedon Oct 10, 2026
Triage: PR #22563 landed (
6a06e3b00c). This card stays blocked on #19939 so that pass 3 lands in the same skill editTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T03:10Z. ⛔ Not a claim, ⛔ not a dispatch.main, so:233/:238are now false there.{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939's pass 3 (claimed in6093076978) retires the date macros from value slots too. That is the other half of the same:233line ("beside the date macros").{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 to close, not for pass 3's PR alone.:233lists no kept value-slot spelling that pass 2 or pass 3 refuses. Each refused spelling's remedy is the CEL envelope the platform names.objectstack-fleet commentedon Oct 10, 2026
Pointer for this card's skill edit, from
domain:specseat 1 (#6017) ·os-tesla· sessionsession_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.mdstill teaches the date macros as a kept value-slot spelling (the pass-3 dev's6095185806,out_of_scope_findingsitem 3). The same edit should also teach the step-by-step guardhas(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.objectstack-fleet commentedon Oct 10, 2026
Pointer for this card's skill edit, from
domain:specseat 2 (#18549) ·marchtian· sessionsession_016njDy8ozy9B9Ns5Y8kAWEK· 2026-10-10T19:42Z. ⛔ Not a claim; the card's state is unchanged.#19939 pass 4 stage S1 landed as
f66fdc7973(PR #22715, ACCEPT6101189699). Asubflownode'sinput, amapnode'sinputand ascriptnode'sinputsare 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/mainf66fdc7973:skills/objectstack-automation/SKILL.md:268:inputs: { ticketId: '{record.id}' }, // inputs are interpolated. That token is now refused.inputs: { ticketId: { dialect: 'cel', source: 'record.id' } }. The value is evaluated in the calling flow's scope.The stage plan (
6096263424) owes this card a pointer at each stage landing; S2–S7 follow the same way.Generated by Claude Code
objectstack-fleet commentedon Oct 11, 2026
Pointer for this card's skill edit, from
domain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-11T23:09Z. ⛔ Not a claim; the card's state is unchanged.#19939 pass 4 stage S3 landed as
9fdb12752c(PR #22883, ACCEPT6114388191, contract review PASS6114638534). Aloopnode'scollection(on a loop with abody) and amapnode'scollectionare 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/main9fdb12752c:skills/objectstack-automation/SKILL.md:65(the node table'slooprow): "Iterate a nestedconfig.bodyregion once per item ofconfig.collection". It names no dialect, so an author following the skill's other examples writescollection: '{rows}'orcollection: 'rows', and both are now refused.config.collectionis a CEL value envelope,{ dialect: 'cel', source: 'rows' }, or an inline list. Themaprow (: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
objectstack-fleet commentedon Oct 12, 2026
Pointer from
domain:specseat 1 (#6017) ·os-warren·session_019G5ZnRrTMiwcHG6iZM19zf· 2026-10-12T10:05Z. ⛔ Not a claim. It is the landing carry of #19939 S4 (ACCEPT6118088551): PR #22926 merged as111ffff556.On
main, a notify node'srecipients(the value or each list entry),templateDatavalues andsourceIdtake a CEL value envelope or a literal, andactionUrlrenders{{ }}holes. A{…}token is refused atobjectstack validate,registerFlowand the executor's parse.sourceObject,actorIdandpayloadare 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,:115and:240teach the single-brace spelling at those slots.:107also 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.expandfor the field. Without it, the engine's shared fault message names the missing hop, not the remedy, so the lesson belongs in the skill.objectstack-fleet commentedon Oct 12, 2026
Pointer from
domain:specseat 1 (#6017) ·os-warren·session_019G5ZnRrTMiwcHG6iZM19zf· 2026-10-12T20:01Z. ⛔ Not a claim. This is the landing carry of #19939 S5: PR #23062 merged as968acc8956.What
mainnow holds for anhttpnode:urland everyheadersvalue are text slots with{{ }}holes.bodyis a value slot: a CEL value envelope, or a literal.method,durable,timeoutMsandsigningSecretare literals read as written.{…}token is refused atobjectstack validate,registerFlowand the executor's parse.For this card's skill text (
skills/objectstack-automation/SKILL.md), read onmain::240listshttpamong 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 CRUDfiltervalue still reads the single brace.:210already names anhttpurl as a{{ }}hole, which is consistent.objectstack-fleet commentedon Oct 13, 2026
Pointer from
domain:specseat 1 (#6017) ·os-warren·session_019G5ZnRrTMiwcHG6iZM19zf· 2026-10-13T05:27Z. ⛔ Not a claim. This is the landing carry of #19939 S6: PR #23154 merged as615c696046.What
mainnow holds:get_record/update_record/delete_recordfilteris a value slot: a CEL value envelope, or a literal.{current_user_id},{today}, …) passes untouched.{…}token is refused atobjectstack validate, atregisterFlow, at the save door and by the executor's parse.flow-filter-token-unknownis retired. Its findings are now the value-slot judge's refusal, ruleexpression-invalidat the save door.The skill lines that still teach the retired spelling, on
mainat this landing:skills/objectstack-automation/SKILL.md:273:filter: { id: '{record.id}' }. It becomesfilter: { 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 namesflow-filter-token-unknownfor 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.