Skip to content

docs(skills): the automation skill teaches the mail option formatter for a notice's select label and the active-member rule for a user target; the docs page gains organization-authored assignment rules - #30866

Merged
os-zhuang merged 6 commits into
mainfrom
claude/project-thread-esfn9k
Nov 6, 2026

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #30731
Fixes #30826

Clause-②: no
Metadata-protocol: none

domain:skills#2 card thread (dev session session_01L9qibxujehvWJcGRXMYv7f, seat session session_01L9qibz5RLVEYDFco93jZ7u) · branch claude/project-thread-esfn9k (the fold thread's designated branch, named in the Claims 6678887018 on #30731 and 6678901809 on #30826) · base origin/main 677d542a.

维护者速读

  • 改了什么:自动化技能(skills/objectstack-automation/SKILL.md)新增两句:① notify 节——通知里要印选项标签,写在邮件模板里用 {{ stage | option:opportunity.stage }}(按每个收件人的语言印),option 只有邮件模板认(行内 title / message 拒收),⛔ 不用 templateData 里的 label()(每次运行只算一次、在收件人扇出之前);② 「Assignment rules」节——assignTo: { type: 'user' } 指定的人只在仍是该组织的在职成员时才拥有记录,否则记录无主落地。eval 15 新增通知用例。文档页 automation/queues-and-assignment-rules 的「Declare an assignment rule」节新增组织自建规则(sys_assignment_rule):先于应用声明的规则求值、按 sort_order 再按名字、首个命中生效、组织规则读不到就不路由、user 目标的在职成员规则、保存时校验哪些字段。
  • 为什么改:两个上游半边都已合入(feat(spec,formula,lint): a mail template's option formatter prints a select value as its option label in the recipient's language #30727 + fix(plugin-email): an option hole prints the option label in each recipient's language #30781 的邮件 option 格式化器;feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760 的组织自建分派规则),技能和文档还没教,照技能写通知的 agent 会去 templateData 里写 label(),要么保存被拒,要么所有收件人同一种语言;读文档的作者仍以为分派规则只有声明式、user 目标永远拥有记录。
  • 风险与回滚:只改技能文本、eval 夹具、文档页与棘轮上限行(6449 → 6448,按实测锁定),不碰运行时;回滚 = revert 本 PR。为付账删掉的三处(见下文 Deletions)各有别处承载。
  • 先看:① skills/objectstack-automation/SKILL.md 的 notify 节新段与「Assignment rules」改行(措辞是否与 main 上的渲染行为一致);② content/docs/automation/queues-and-assignment-rules.mdx 新增三段(与 packages/objectql/src/assignment-rules.ts 头注释逐条对照);③ 删掉的「CRM Automation Blueprint」节。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs | grep objectstack-automation/SKILL.md 预期 6448 tokens (ceiling 6448; headroom 0);pnpm check:skill-identifier-liveness 预期退出 0。
  • 需要你做的:Tier H(skills/**)——席位契约复审通过后,由 os-zhuang 批准/入队。

What changes

#30731 — skills/objectstack-automation/SKILL.md, notify section. One paragraph after the notify config block: an option label in a notice is {{ stage | option:opportunity.stage }} in the mail template, printed in each recipient's language; option is mail-only and refused in an inline title / message; never label() in templateData, which is evaluated once per run, before fan-out. Read from main: packages/formula/src/template-engine.ts (MAIL_ONLY_FORMATTERS = ['option'], optionFieldReference: bare object.field), packages/plugins/plugin-email/src/email-service.ts (the label table is built per send in the recipient's locale), packages/services/service-automation/src/builtin/notify-node.ts (templateData is a value-slot map resolved once per run; the template locale is resolved per recipient after fan-out), packages/formula/src/stdlib.ts (label() is the formula-field macro).

#30731 — skills/objectstack-automation/evals/flows-triggers-approvals.json. Eval 15: a stalled-opportunity e-mail whose subject shows the stage label in each recipient's language. must_contain: option:opportunity.stage, template, once per run; must_not_contain: source: 'label( and | label (the two wrong spellings a right answer never writes). Appended by splicing before the closing bracket, so no other case is reformatted.

#30826 — skills/objectstack-automation/SKILL.md, "Assignment rules". The assignTo: { type: 'user', value: 'ID' } sentence now reads "names one owner, who holds the row only while an active member of its organization (else ownerless)". Read from packages/objectql/src/assignment-rules.ts (organizationMemberStanding: a sys_member row and no ban in force; the engine asks it of every user target at insert, declared rules included) and packages/plugins/plugin-sharing/src/assignment-rule-hooks.ts (the save guard asks the same predicate).

#30826 — content/docs/automation/queues-and-assignment-rules.mdx, "2. Declare an assignment rule". Three paragraphs after "The rule writes owner_id …": the active-member rule for a user target; the organization's own sys_assignment_rule records (Setup → Assignment Rules, manage_platform_settings; one rule with one entry; active), one namespace by name with the declared rules (mirroring the page's sys_queue paragraph), evaluated first by sort_order then name with the declared assignmentRules as the fallback (the activation ledger has no organization column), first match wins, a failed read of the organization's rules routes nothing; and what the save guard refuses. One checklist bullet. Pages checked for existing coverage before writing (maintainer rule, no duplicate sections): content/docs/automation/queues-and-assignment-rules.mdx (declared rules and sys_queue only), content/docs/automation/index.mdx (one summary line, declared rules), content/docs/automation/approvals.mdx (the queue approver), content/docs/permissions/sharing-rules.mdx and content/docs/permissions/rls.mdx (queue recipients and current_user.queues), content/docs/releases/v18/18-3.mdx (release-owned); content/docs/references/api/metadata.mdx and references/kernel/metadata-plugin.mdx list the assignment_rule metadata type only. No page mentions sys_assignment_rule; the generated references carry no page for the object.

Changeset .changeset/30731-automation-skill-notify-label-and-org-assignment-rules.md: '@objectstack/skills': patch, naming both cards.

Ratchet scripts/check-skills-token-ratchet.mjs: the SKILL.md row moves DOWN 6449 → 6448, re-locked at the measurement (headroom 0).

Readings (skills/** diff)

Reading before (origin/main 677d542) after (this head)
skills/objectstack-automation/SKILL.md lines 452 448
skills/objectstack-automation/SKILL.md tokens (ceil((bytes − 20) / 4)) 6447 6448
whole package, all 11 skills/*/SKILL.md, lines 4523 4519
whole package, all 11 skills/*/SKILL.md, tokens 56716 56717
evals/flows-triggers-approvals.json tokens (measured, not ratcheted) 3587 3883

Deletions that pay for the two additions (same file)

  1. The ## CRM Automation Blueprint section (three lines + rule): the src/flows/*.flow.ts → src/flows/index.ts → defineStack({ flows }) layout is carried by skills/objectstack-platform/references/bootstrap.md ("Use barrel exports", import * as flows from './src/flows' into defineStack({ flows: Object.values(flows) })), and the skill's frontmatter already names *.flow.ts as the trigger to load it.
  2. "When to Use This Skill": the clause "that route a new record to a queue or a person" restated the section heading ## Assignment rules — route a new record to a queue or a person; "scheduled automation" restated "Flows (… scheduled)" three words earlier.
  3. "Verify your work": the line "In a scaffolded project: npm run validate." is carried by objectstack-formula's Verify section ("npm run validate in a scaffolded project"), which this skill names for CEL validation at its top.

Each surviving sentence of the trimmed paragraphs was re-read against main; nothing deleted has no other home. No line was re-wrapped to win room.

Neighbour overlap

Seat 1's draft PR #30831 (#30805) edits skills/objectstack-automation/SKILL.md at lines 295 and 306–320 (the assignment-rule example's names and the approvers line) and eval cases 3, 7, 9, 11, 12 of flows-triggers-approvals.json. This PR's "Assignment rules" hunk changes the two lines directly above its approvers line, so whichever lands second resolves one adjacent-line conflict there; the notify paragraph, the two deletions and eval 15 (appended at the file's end) are outside its hunks. origin/main was merged and the ratchet re-measured before each push.

Tests

No package code changes. Local checks at this head:

  • node scripts/check-skills-token-ratchet.mjs → skills/objectstack-automation/SKILL.md is 6448 tokens (ceiling 6448; headroom 0); --self-test exit 0.
  • Eval fixture parses (json.load, 15 cases, ids 1–15).
  • The derived gate list (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 69 lines) — see Verification.

Acceptance notes

  • The skill line keeps the option argument spelling to the bare object.field form main accepts; the quoted, marked-path and one-sided forms are refused by optionFieldReference and not taught.
  • label() stays taught where it belongs (objectstack-formula, a formula field's display in the reader's locale); the automation skill now only says where it is wrong.
  • Out of scope, noted and not filed (class: none of a/b/c — read-only observation): the docs page's ## See also points at the generated assignment-rule schema reference; no generated page exists for the sys_assignment_rule object, so the new prose names its columns inline.
  • First commit's author is spelled as the fleet bot (a local -c user.name override); later commits use the container's default Claude identity. The squash on landing rewrites it either way.

Verification

Derived gates at head 61f2a99 (base 677d542a): 87/87 families exit 0 — 69 derived first; the ratchet-row edit added 18 more; three (check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure) first exited 3 on an unbuilt tree and exit 0 after pnpm build --filter='./packages/**' (80/80 tasks, 7m58s under the verify lock). origin/main (five commits, none touching this PR's files) was then merged as 18600c3 and the skill-text families re-run there: check-skills-token-ratchet (6448 / 6448, headroom 0), check:skill-identifier-liveness, check:pm-skill-id-lint, check:doc-authoring, check:role-word, spec check:skill-docs, check-empty-changeset, check:docs-single-h1 — all exit 0. The per-command exit lists are /mnt/project-files/skills-seat-2/r2026-11-06/out/30731-gates-ran-61f2a99e.list and …-18600c34-merged.list, reconciled with dispatch-gates.mjs --repo objectstack-ai/objectstack --ran.

Relay writes: pr_create (this PR); post-stamped.mjs for the os-dev-report on #30731. MCP GitHub calls: reads only (issue_read ×6, pull_request_read ×1 for #30831's file list); 0 MCP writes. The harness's assignee/reviewer step is skipped (no MCP writes; the seat sets the assignee at hand-over).


Generated by Claude Code

objectstack-fleet Bot and others added 2 commits November 6, 2026 06:47
…abel and the active-member rule for a user target

The automation skill's notify section says an option label in a notice is
written in the mail template as the option formatter, which prints each
recipient's language, never label() in templateData (evaluated once per run,
before fan-out); its assignment-rules section says a user target holds the
row only while an active member of its organization. Eval 15 grades the
notice case. The queues-and-assignment-rules docs page gains the
organization-authored sys_assignment_rule rules beside the declared ones:
evaluated first, by sort_order then name, first match wins, a failed read
routes nothing, and the active-member rule. Paid inside SKILL.md by deleting
the CRM Automation Blueprint section and two restatements; the token ceiling
re-locked at the measurement.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibxujehvWJcGRXMYv7f
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 18600c34ebd25df7ed453be35d12311254783246
Local-runs: none
Scope: skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json + packages/formula/src/template-engine.ts, packages/formula/src/stdlib.ts, packages/lint/src/validate-email-template-hole-grammar.ts, packages/lint/src/authoring-rules.ts, packages/plugins/plugin-email/src/email-service.ts, packages/services/service-automation/src/builtin/notify-node.ts, packages/services/service-automation/src/builtin/template.ts, packages/objectql/src/assignment-rules.ts, packages/plugins/plugin-sharing/src/assignment-rule-hooks.ts, packages/plugins/plugin-sharing/src/objects/sys-assignment-rule.object.ts, packages/plugins/plugin-sharing/src/sharing-plugin.ts, packages/spec/src/automation/assignment-rule.zod.ts, skills/objectstack-platform/references/bootstrap.md, skills/objectstack-formula/SKILL.md, scripts/check-skills-token-ratchet.mjs, ui/scripts/check-skill-eval-tokens.mjs, content/docs/automation/email-templates.mdx

① Derived judgments

  • Accept-set of the hits files: skills/objectstack-automation/SKILL.md gains one paragraph in the notify section (the mail option formatter for a notice's select label, skills(objectstack-automation): a notice prints a select field's label with the mail option formatter, not label() in templateData (ruling F parameter 6, #30172) #30731) and one clause on the assignTo: { type: 'user' } sentence in "Assignment rules" (the active-member rule, docs+skills: teach organization-authored assignment rules (sys_assignment_rule) and the active-member rule for a user target (PR #30760) #30826); it deletes the ## CRM Automation Blueprint section, the When-to-Use restatement and the scaffolded-project npm run validate line. evals/flows-triggers-approvals.json appends case 15. No package code, no schema, no public export, no spec sentence changes — right, and Clause-②: no / Metadata-protocol: none follow from it.
  • Public surface: none. TEMPLATE_FORMATTERS / MAIL_TEMPLATE_FORMATTERS (template-engine.ts:191, 194) and every objectql / plugin-sharing export are untouched; the diff teaches what main already serves.
  • Token ratchet row: 6449 to 6448. Read off the git objects (wc -c, no script run): the PR's SKILL.md is 25811 bytes, less the 20-byte version: stamp line, ceil(25791 / 4) = 6448; on main 25806 bytes gives 6447 under the old ceiling 6449 (headroom 2). The file grew by one token inside its headroom and the ceiling moved DOWN to the measurement, headroom 0 — the only direction the ratchet allows. Right. The row's comment names the three deletions that paid; each matches the diff.
  • Remainder of the diff (the lane seat's ACCEPT at TIER_DEFAULT): content/docs/automation/queues-and-assignment-rules.mdx (+7 lines) and the changeset. Read, not reviewed; see ③.
  • Check-runs on 18600c34: success — Build Core, Build Docs, Check Changeset, Check Documentation Links, Check PR Size, PR-body guards, Governed Surface Queue Guard, Dogfood Regression Gate, Spec property liveness, Type Check (workspace, source gates, consumer gates, debt ledger, TypeScript), Lint (ESLint, repo & tooling gates, docs & code guards, PM dispatch-gates, CI/release & engine gates, scoped x3), Test UI, Live E2E UI, Test Core 1/8, 2/8, 3/8, 4/8 (the other shards and the rest skipped by path filter); only the Test Core umbrella job was still closing at render time. No failure, no cancellation. The ratchet, skill-identifier-liveness, pm-skill-id-lint, skill-docs and docs-single-h1 families live in the green Lint runs.

② Semver level

③ Boundary flags

  • open_questions: [] in the dev report (6679461131). Nothing to answer.
  • Dev out-of-scope note 1 (no generated reference page for sys_assignment_rule, so the docs prose names its columns inline): read against packages/plugins/plugin-sharing/src/objects/sys-assignment-rule.object.ts — the columns the page names (object_name, criteria, recipient_type, recipient_id, strategy, load, active, sort_order) are the object's. Correct as a read-only observation; a reference page is a separate card if anyone wants one. Not a blocker.
  • Dev out-of-scope note 2 (first commit's git author spelled as the fleet bot): the squash on landing rewrites it; not a review matter.
  • Docs page content/docs/automation/queues-and-assignment-rules.mdx (READ, not reviewed). Every claim was checked against the code: order (authored first, sort_order then name, localeCompare, assignment-rules.ts:413-415; declared rules in registry order as the fallback, :369), first match wins (:449-455), the activation ledger has no organization column (:25-30, 660-678), one namespace by name with the declared rule answering and a warnOnce (:417-424; boot report at error, assignment-rule-hooks.ts:277-304), a failed read of the organization's rules routes nothing, not even by the fallback (:365-369, 402-412), active: false (:425), the user target honoured only for a sys_member row with no ban in force (:260-274), a lapsed target written ownerless with queue unset and warnOnce (:529-571), Setup → Assignment Rules under manage_platform_settings (sharing-plugin.ts:683), the save-guard list (assignment-rule-hooks.ts:14-21, 131-247; strategy on a user target and least_loaded without load refused by assignment-rule.zod.ts:82-110). It contradicts neither the skill (the skill's "(else ownerless)" is the page's "leaves it ownerless (queue unset)") nor the code, with ONE wording note for the lane seat: "can still be switched off or renamed" — name IS in JUDGED_COLUMNS (assignment-rule-hooks.ts:54-56), so a patch of name is re-judged and refused while the target is lapsed; only label, description, sort_order and active escape. The sentence inherits the source comment's own "rename" (hooks.ts:30-31); "relabelled" would be exact. Not in hits, so not a ④ finding.
  • Ratchet row (READ): moves down only, 6449 to 6448, re-locked at the measurement; its comment agrees with the skill diff and with the code the deletions point to. No contradiction.
  • Neighbour overlap with draft PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 (seat 1, Bare-name phase 2: the published authoring skills teach one rule, every metadata name carries the namespace (ruling C on #30798) #30805): its SKILL.md hunk changes main line 319 (the approvers queue name becomes crm_support_intake) with lines 317-318 as unchanged context; this PR rewrites line 318 into two lines. Adjacent-line conflict, textual only — one edit renames a queue in an example, the other adds a clause about a user target; neither changes the other's meaning. docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831's eval edits (cases 3, 7, 9, 11, 12) do not touch case 14's closing brace where case 15 is spliced in. Whichever lands second must re-measure the ratchet: this PR leaves headroom 0, and docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 also changes the file's byte count (it drops "The third automation family: " and adds crm_ prefixes).
  • Tier H approval and the queue guard are whole-PR and outside this record.

④ Design judgment

skills/objectstack-automation/SKILL.md, the notify paragraph (lines 130-133), word by word against main:

skills/objectstack-automation/SKILL.md, the assignTo: { type: 'user' } clause (lines 322-324): "names one owner, who holds the row only while an active member of its organization (else ownerless)". routeToUser (assignment-rules.ts:529-571) asks organizationMemberStanding (:260-274: a sys_member row in that organization and no ban in force) of every user target at insert, declared rules included (:369, 478-480); member writes owner_id, anything else leaves the row ownerless, warnOnce, never a refused insert. The one line the card allowed grew into two and was paid for in the same file. Holds. Tried to break it: "its organization" could be read as the user's organization; the row's organization is meant and is what the docs page spells out — the skill's budget does not carry the longer form, and the two agree. Not a finding.

skills/objectstack-automation/evals/flows-triggers-approvals.json, case 15, against the card's scenario and the evals' convention:

  • The card asked for "a notice that prints a select field's label"; the prompt is that (a stalled-opportunity e-mail whose subject shows stage as its label in each recipient's language), the expected output names the right form and both wrong forms with the reason the code gives (once per run, mail-only). Matches the code read above.
  • Shape: id, prompt, expected_output, files: [], assertions.must_contain / must_not_contain — the shape of cases 1-14; ids 1-15 contiguous; the file parses (15 cases). Spliced before the closing bracket, no other case reformatted.
  • must_contain tokens are each a whole token in the bundle's own markdown as ui/scripts/check-skill-eval-tokens.mjs scores them (SCAN_ROOTS = ['skills'], bundle-wide oracle, wholeTokenPattern): option:opportunity.stage and once per run only in the new paragraph, template throughout. must_not_contain: source: 'label( and | label are the two spellings a right answer never writes; neither appears in the bundle's own guidance for a notice.
  • Observations, not findings: template is a weak positive (an answer that wrongly puts label() in templateData carries it too) — the two negatives do the grading, the pattern of cases 2 and 14; | label would also red a markdown table cell starting with label, an accepted cost of the convention (case 9's ]().

Deletions that paid for the growth, each checked for a surviving home:

  1. ## CRM Automation Blueprint (main 424-430): the src/flows/*.flow.ts → src/flows/index.ts → defineStack({ flows }) layout is skills/objectstack-platform/references/bootstrap.md:53-74 ("Barrel Import Pattern", import * as flows from './src/flows', flows: Object.values(flows)); explicit variables and nodes + edges are the skill's own "Flow Variables" section and the examples reference; the frontmatter still names *.flow.ts as the load trigger. No other file on main or in the PR tree references the heading or its anchor (only the new changeset names it). "Lifecycle first" was an ordering preference, not a rule.
  2. "When to Use" (main 25-27): "that route a new record to a queue or a person" survives as the section heading (PR line 298); "scheduled automation" survives as "Flows (auto-launched, screen, scheduled)" three words earlier and the schedule row of the Flow Types table.
  3. "In a scaffolded project: npm run validate." (main 443): skills/objectstack-formula/SKILL.md:476 carries it in its Verify section, which this skill names for CEL validation at its top; five other skills carry it too.

No rule is left without a home. No must-fix, no should-fix.

Implemented-by: claude/project-thread-esfn9k
Reviewed-by: session_01L9qibz5RLVEYDFco93jZ7u

VERDICT: PASS

…, re-ordered or relabelled, not renamed

The save guard re-judges a patch that touches name (one of the judged
columns), so only the label, description, order and active flag escape
the re-judgement.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibxujehvWJcGRXMYv7f
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

维护者速读

  • 改了什么:objectstack-automation 技能补两处。① notify 一节加一段:通知里要显示下拉字段的标签,用邮件模板的 option 格式化(按每位收件人的语言输出),不要在 templateData 里用 label()(它在分发给收件人之前只算一次)。② "Assignment rules" 里 assignTo: { type: 'user' } 一句补上:只有当该用户仍是记录所在组织的有效成员时才归他,否则记录无人负责。文档 queues-and-assignment-rules.mdx 加一节讲组织自建的分配规则(sys_assignment_rule):先于栈内声明的规则执行,按 sort_order 再按名字排序,首个匹配胜出;读不到组织规则时不路由;用户目标须为有效成员。测试题加第 15 题。
  • 为什么改:PR feat(spec,formula,lint): a mail template's option formatter prints a select value as its option label in the recipient's language #30727/fix(plugin-email): an option hole prints the option label in each recipient's language #30781 已上线邮件 option 格式化,PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760 已上线组织自建分配规则,但技能和文档都没写,AI 会继续用 label() 或以为分配规则只能声明。
  • 风险与回滚:只改技能文本、一道测试题、一页文档和 changeset,不碰运行时。篇幅靠同文件删除换来(CRM Automation Blueprint 一节,内容在 platform 的 bootstrap.md;When-to-Use 的重复句;npm run validate 一行),token 上限 6449 下调到实测 6448,没有上调。回滚即 revert。
  • 先看:skills/objectstack-automation/SKILL.md 的 notify 段与 assignTo 一句。
  • 两分钟验证:git grep -n "option:" skills/objectstack-automation/SKILL.md。
  • 需要你做的:改的是 skills/**,属于 Tier H,需要 os-zhuang(或 hotlong)批准后才能合并。契约复审 PASS 记录 6679652026。

席位意见:契约复审 PASS,无必改、无建议修改。席位在文档里查出一处错("可以改名",实际改名会被重新校验),已改。可以批准。

席位核对

ACCEPT · seat domain:skills#2 · head c864cad6 · 2026-11-06T07:49Z

  1. Shape: Fixes #30731, Fixes #30826 (fold, both edit skills/objectstack-automation/SKILL.md), draft, base main, 5 files (skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json case 15, content/docs/automation/queues-and-assignment-rules.mdx, scripts/check-skills-token-ratchet.mjs one row 6449 → 6448, .changeset/30731-automation-skill-notify-label-and-org-assignment-rules.md '@objectstack/skills': patch), +51/−14, three commits.
  2. Ruling: skills(objectstack-automation): a notice prints a select field's label with the mail option formatter, not label() in templateData (ruling F parameter 6, #30172) #30731: ruling F parameter 6 on A flow notice cannot name a select field's option by its label in the recipient's language: the mail renderer has no label formatter and the flow passes no option labels to CEL label() #30172 (maintainer 「同意」, recorded 6670405874); triage 6673659456. docs+skills: teach organization-authored assignment rules (sys_assignment_rule) and the active-member rule for a user target (PR #30760) #30826: the Skills-docs: follow-up of PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760; triage 6678081998. Claims 6678887018, 6678901809. Ceiling moved down only.
  3. Contract review: PASS 6679652026 at 18600c34 (Fable, no must-fix, no should-fix). The head moved to c864cad6 by one prose-only commit on content/docs/automation/queues-and-assignment-rules.mdx (one line, outside the review's hits), so the record carries on under the prose-face exception. Regen-provenance: 18600c34 → c864cad6, prose face only (git diff 18600c34 c864cad6 --stat: 1 file, +1/−1). Clause-②: no, Metadata-protocol: none.
  4. Docs (seat's prose face, checked line by line against main): the organization-rule paragraph matches packages/objectql/src/assignment-rules.ts and plugin-sharing (sort_order then name, first match across both sources, a failed read routes nothing, user target only while an active member). The seat's one finding: "can still be switched off or renamed" was wrong (name is in JUDGED_COLUMNS, plugin-sharing assignment-rule-hooks.ts, so a rename is judged again); it now reads "switched off, re-ordered or relabelled; a rename … is judged again".
  5. Gates / check-runs: dev reports 87/87 derived families exit 0 at 61f2a99e, the skill-text families green on the merged head, docs gates green at c864cad6 (lists in skills-seat-2/out/30731-gates-ran-*.list); report 6679461131. On head c864cad6: 45 check-runs, 33 success, 12 skipped, 0 failed; mergeable_state clean.
  6. Accepted deviations: none. Overlap: seat 1's draft PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 edits the adjacent line in SKILL.md ("Assignment rules"); textual only, and the later lander re-measures the ratchet at headroom 0.
  7. Landing: check-governed-merges --pr 30866: GOVERNED, Tier H (skills/**). The seat readies the PR and the relay's governed-review leg requests the approvers; no auto-merge is armed by the seat.

…-esfn9k

# Conflicts:
#	skills/objectstack-automation/SKILL.md
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 24cc90349f637db7a3b5e626a909cd9a600e13d2
Local-runs: none
Scope: skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json + scripts/check-skills-token-ratchet.mjs, content/docs/automation/queues-and-assignment-rules.mdx

This is a DELTA record. It builds on the record at 18600c34ebd25df7ed453be35d12311254783246 (comment 6679652026, PASS), carried to c864cad6 by a prose-only docs commit, and judges only what moved since: the merge of origin/main c50e0dfa (which carries PR #30831, 0e73de82) into the branch, its one resolved hunk in SKILL.md, the auto-merged eval file, the docs carry commit and the ratchet row. Every code reading of the earlier record stands unchanged; the code it cited did not move between main 677d542a and c50e0dfa on this PR's claims.

① Derived judgments

② Semver level

③ Boundary flags

④ Design judgment

Only the two moved surfaces are re-judged; the earlier ④ holds for everything else.

  • skills/objectstack-automation/SKILL.md, resolved hunk 322-326: the clause this PR teaches still reads against routeToUser / organizationMemberStanding (assignment-rules.ts:529-571, 260-274) exactly as before; the approvers example now names crm_support_intake, the same queue the example rule above it declares (value: 'crm_support_intake', line 318) — the two lines stayed in agreement through the rename, which is the one way the merge could have broken the example. The notify paragraph, the deletions and their homes are untouched by docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 (its hunks are 295-320 only). No finding.
  • skills/objectstack-automation/evals/flows-triggers-approvals.json: case 15 unchanged and still graded by tokens the bundle teaches (option:opportunity.stage, once per run at SKILL.md 130-133; template); docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831's renames in cases 3, 7, 9, 11, 12 reference the renamed example (crm_case_intake, crm_support_team, crm_support_leads) and do not touch case 15's tokens or its must_not_contain. No finding.

No must-fix, no should-fix.

Implemented-by: claude/project-thread-esfn9k
Reviewed-by: session_01L9qibz5RLVEYDFco93jZ7u

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

维护者速读

  • 改了什么:objectstack-automation 技能补两处。① notify 一节加一段:通知里要显示下拉字段的标签,用邮件模板的 option 格式化(按每位收件人的语言输出),不要在 templateData 里用 label()(它在分发给收件人之前只算一次)。② "Assignment rules" 里 assignTo: { type: 'user' } 一句补上:只有当该用户仍是记录所在组织的有效成员时才归他,否则记录无人负责。文档 queues-and-assignment-rules.mdx 加一节讲组织自建的分配规则(sys_assignment_rule):先于栈内声明的规则执行,按 sort_order 再按名字排序,首个匹配胜出;读不到组织规则时不路由;用户目标须为有效成员。测试题加第 15 题。
  • 为什么改:PR feat(spec,formula,lint): a mail template's option formatter prints a select value as its option label in the recipient's language #30727/fix(plugin-email): an option hole prints the option label in each recipient's language #30781 已上线邮件 option 格式化,PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760 已上线组织自建分配规则,但技能和文档都没写,AI 会继续用 label() 或以为分配规则只能声明。
  • 风险与回滚:只改技能文本、一道测试题、一页文档和 changeset,不碰运行时。篇幅靠同文件删除换来(CRM Automation Blueprint 一节,内容在 platform 的 bootstrap.md;When-to-Use 的重复句;npm run validate 一行),token 上限 6449 下调到实测 6444(合入 main 后重测),没有上调。回滚即 revert。
  • 先看:skills/objectstack-automation/SKILL.md 的 notify 段与 assignTo 一句。
  • 两分钟验证:git grep -n "option:" skills/objectstack-automation/SKILL.md。
  • 需要你做的:改的是 skills/**,属于 Tier H,需要 os-zhuang(或 hotlong)批准后才能合并。契约复审 PASS 记录 6679652026,合入 main 后的增量复审 PASS 6681066235。

席位意见:契约复审 PASS,无必改、无建议修改。席位在文档里查出一处错("可以改名",实际改名会被重新校验),已改。与 #30831 的冲突已解决,两边内容都保留,增量复审通过。可以批准。

席位核对

ACCEPT · seat domain:skills#2 · head 24cc9034 · 2026-11-06T08:55Z

  1. Shape: Fixes #30731, Fixes #30826 (fold, both edit skills/objectstack-automation/SKILL.md), draft, base main, 5 files (skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json case 15, content/docs/automation/queues-and-assignment-rules.mdx, scripts/check-skills-token-ratchet.mjs one row 6449 → 6444, .changeset/30731-automation-skill-notify-label-and-org-assignment-rules.md '@objectstack/skills': patch), +51/−14, three commits plus a merge of main.
  2. Ruling: skills(objectstack-automation): a notice prints a select field's label with the mail option formatter, not label() in templateData (ruling F parameter 6, #30172) #30731: ruling F parameter 6 on A flow notice cannot name a select field's option by its label in the recipient's language: the mail renderer has no label formatter and the flow passes no option labels to CEL label() #30172 (maintainer 「同意」, recorded 6670405874); triage 6673659456. docs+skills: teach organization-authored assignment rules (sys_assignment_rule) and the active-member rule for a user target (PR #30760) #30826: the Skills-docs: follow-up of PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760; triage 6678081998. Claims 6678887018, 6678901809. Ceiling moved down only.
  3. Contract review: PASS 6679652026 at 18600c34 (Fable, no must-fix, no should-fix), carried to c864cad6 by one prose-only docs line outside hits. Delta PASS 6681066235 at 24cc9034 (same reviewer, no findings): the head is a merge of origin/main c50e0dfa that resolved one conflicted hunk in SKILL.md (L322–326) against PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831; both sides kept, git diff 18600c34 24cc9034 on SKILL.md and the eval file shows only docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831's edits, case 15 byte-identical. Clause-②: no, Metadata-protocol: none.
  4. Docs (seat's prose face, checked line by line against main): the organization-rule paragraph matches packages/objectql/src/assignment-rules.ts and plugin-sharing (sort_order then name, first match across both sources, a failed read routes nothing, user target only while an active member). The seat's one finding: "can still be switched off or renamed" was wrong (name is in JUDGED_COLUMNS, plugin-sharing assignment-rule-hooks.ts, so a rename is judged again); it now reads "switched off, re-ordered or relabelled; a rename … is judged again".
  5. Gates / check-runs: dev reports 87/87 derived families exit 0 at 61f2a99e, docs gates green at c864cad6, and at 24cc9034 the skill-text, eval, ratchet (+ --self-test) and docs families all exit 0 (list skills-seat-2/out/30731-gates-ran-24cc9034-merged.list); ratchet row re-locked at the measurement 6444 (25794 bytes), headroom 0. On head 24cc9034: 45 check-runs, 33 success, 12 skipped, 0 failed; mergeable_state clean.
  6. Accepted deviations: none. The overlap with PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 is resolved on this head (see 3).
  7. Landing: check-governed-merges --pr 30866: GOVERNED, Tier H (skills/**). The seat readies the PR and the relay's governed-review leg requests the approvers; no auto-merge is armed by the seat.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 14:11
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 6, 2026
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as draft November 6, 2026 15:03
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

Hold · 2026-11-06T15:03Z · the seat moved this PR back to draft to take it out of the merge queue. On this head the queue's check-skills-token-ratchet fails deterministically: skills/objectstack-automation/SKILL.md measures 6447 tokens against this PR's ceiling 6444, because main 3479c33d (12:56Z) added text to the same file after this branch's last merge. Each re-queue on this head also reds the batch siblings behind it. The dev is merging main and paying the remainder by same-file deletion, with the row re-locked at the measurement. The seat re-readies the PR after a delta contract review on the new head; the approval on record is unchanged.

… the flow-graph opener; re-lock the automation ceiling at 6426

main's notify click-through default (3479c33) put skills/objectstack-automation/SKILL.md at 6447 tokens against a 6444 ceiling in the merge group. Paid by deleting the "A Flow is a directed graph of nodes" opener under Flows, which the node-type tables and the Trigger Configuration line (a flow owns label, type, nodes and edges) already say. Measurement 6426; ceiling row re-locked there, headroom 0, down only. No taught line and no line of 3479c33 changed.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibxujehvWJcGRXMYv7f
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 6772a2e837c32c69395e4a058d9b08466f183127
Local-runs: none
Scope: skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json + scripts/check-skills-token-ratchet.mjs

This is the second DELTA record. It builds on the record at 18600c34ebd25df7ed453be35d12311254783246 (comment 6679652026, PASS) and the delta at 24cc90349f637db7a3b5e626a909cd9a600e13d2 (PASS), and judges only what moved since 24cc9034: the merge commit 92b37029 (origin/main 1aeeafd9 into the branch) and the relock commit 6772a2e8 on top of it. git diff --name-only 24cc9034 6772a2e8 over the PR's five files names two: skills/objectstack-automation/SKILL.md and scripts/check-skills-token-ratchet.mjs. The eval file, the docs page and the changeset are byte-identical to 24cc9034; every earlier reading of them stands.

① Derived judgments

  • What the merge brought into the PR's five files: ONE change, from main 3479c33d (docs(automation): the notify click-through default says a before-create run links to its record only when the caller wrote the id #30926) — the sourceId comment in the notify config block, "trigger record (not on delete), if any" to "trigger record (not on delete/before-create), if any" (SKILL.md line 123 on this head). git diff 24cc9034 92b37029 over the five files shows that line alone; main did not touch the ratchet row (still 6449 there), the eval file, the docs page or this PR's changeset. The dev's account ("a sentence") is a 14-byte clause in a code comment, worth the three tokens claimed; its content is intact on this head. Nothing else arrived. Right.
  • What the relock commit changed: git diff 92b37029 6772a2e8 is two files — SKILL.md loses the line "A Flow is a directed graph of nodes — the primary automation building block." and its following blank line under "## Flows — Visual Logic Orchestration" (84 bytes measured on the git object, the dev said 85; the difference does not reach the token count), and the ratchet row moves 6444 to 6426 with its comment extended. Nothing else. Right.
  • This PR's taught lines on this head, against the reviewed ones: the notify paragraph (now lines 128-131), the assignTo: { type: 'user' } clause (320-322), the three original deletions and eval case 15 are unchanged; the net diff against main 000a4c0d is the reviewed diff plus the opener deletion, with docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831's crm_support_intake still in the approvers context line. Right.
  • Token ratchet, read off the git objects (wc -c, no script run), each less the 20-byte version: stamp: 92b37029 (post-merge, pre-relock) 25808 bytes gives ceil(25788 / 4) = 6447 against the ceiling 6444 — the red the dev reports, right; this head 25724 bytes gives ceil(25704 / 4) = 6426 — the row's new value, headroom 0, right; main 000a4c0d 25803 bytes gives 6446 under its own ceiling 6449. The row moves down only (6449 on main, 6444 on the previous head, 6426 now). The 84 deleted bytes are exactly 21 tokens, 6447 to 6426. Right.
  • Remainder of the diff (lane seat's ACCEPT at TIER_DEFAULT): unchanged since 24cc9034.
  • Check-runs on 6772a2e8: at render time success — filter, Auto Label, Test UI, PR-body guards, Governed Surface Queue Guard, Dogfood Regression Gate, Check PR Size, Check Documentation Links; the Lint, Type Check, Build, Spec property liveness, Live E2E, Check Changeset and Test Core families were still in progress; none failed or was cancelled. The ratchet family answers on this head inside the Lint runs (6426 / 6426).

② Semver level

  • Unchanged: '@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none. The relock deletes one framing sentence from a skill and moves a ceiling; neither publishes anything new. Right.

③ Boundary flags

④ Design judgment

Only the deleted opener and the ratchet row are new; the earlier ④ holds for everything else.

  • The deleted line's two claims and their homes on this head: (a) "a Flow is a directed graph of nodes" — "Flow Node Types" (line 61-63, "Flows are built from built-in node types") with the Control Flow table whose start / end / decision ("routed by edge condition predicates") rows presuppose the graph, the "Trigger Configuration — on the start node" note (381-382: "a flow also owns label, type, nodes and the edges FlowSchema requires"), the Valid-but-silently-wrong item 3 ("Keep data effects on the flow graph", 261), and references/examples-flows.md:5-12 ("Nodes connect via edges, not a next property … the graph must reach an end node"); (b) "the primary automation building block" — a framing claim, carried by the frontmatter description ("Flows (visual logic), Triggers, Approvals …") and by "When to Use" listing Flows first. No rule is lost: the opener defined no key, refused nothing and was referenced by no eval token (directed graph and building block appear in no eval must_contain; the bundle now spells "directed graph" nowhere, and no gate reads for it). The ratchet row's comment names the first home set ("the node tables and the nodes + edges FlowSchema line"). Holds.
  • Tried to break it: a reader who never saw "graph" before the Node Types tables meets "edges" first at the decision row (line 71) and "nodes" at "Flows are built from built-in node types" (63) — the section still introduces nodes before edges, and the end row ("Exit point — can have multiple") plus examples-flows.md:12 carry the reachability rule. Not a finding.
  • skills/objectstack-automation/evals/flows-triggers-approvals.json: unchanged since 24cc9034; case 15's tokens are still whole tokens in the bundle (option:opportunity.stage, once per run at SKILL.md 128-131; template). No finding.

No must-fix, no should-fix.

Implemented-by: claude/project-thread-esfn9k
Reviewed-by: session_01L9qibz5RLVEYDFco93jZ7u

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

维护者速读

  • 改了什么:objectstack-automation 技能补两处。① notify 一节加一段:通知里要显示下拉字段的标签,用邮件模板的 option 格式化(按每位收件人的语言输出),不要在 templateData 里用 label()(它在分发给收件人之前只算一次)。② "Assignment rules" 里 assignTo: { type: 'user' } 一句补上:只有当该用户仍是记录所在组织的有效成员时才归他,否则记录无人负责。文档 queues-and-assignment-rules.mdx 加一节讲组织自建的分配规则(sys_assignment_rule):先于栈内声明的规则执行,按 sort_order 再按名字排序,首个匹配胜出;读不到组织规则时不路由;用户目标须为有效成员。测试题加第 15 题。
  • 为什么改:PR feat(spec,formula,lint): a mail template's option formatter prints a select value as its option label in the recipient's language #30727/fix(plugin-email): an option hole prints the option label in each recipient's language #30781 已上线邮件 option 格式化,PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760 已上线组织自建分配规则,但技能和文档都没写,AI 会继续用 label() 或以为分配规则只能声明。
  • 风险与回滚:只改技能文本、一道测试题、一页文档和 changeset,不碰运行时。篇幅靠同文件删除换来(CRM Automation Blueprint 一节,内容在 platform 的 bootstrap.md;When-to-Use 的重复句;npm run validate 一行),token 上限 6449 下调到实测 6426,没有上调:main 的 docs(automation): the notify click-through default says a before-create run links to its record only when the caller wrote the id #30926(3479c33d)往同一文件加了 3 个 token,让本 PR 在合并队列里超限(6447 > 6444)被退回;本次在同文件删去 Flows 一节开头的一句定义(“A Flow is a directed graph of nodes …”,内容由下方节点表和 nodes + edges 一行承载)付账并按实测重锁。回滚即 revert。
  • 先看:skills/objectstack-automation/SKILL.md 的 notify 段与 assignTo 一句。
  • 两分钟验证:git grep -n "option:" skills/objectstack-automation/SKILL.md。
  • 需要你做的:改的是 skills/**,属于 Tier H,需要 os-zhuang(或 hotlong)批准后才能合并。契约复审 PASS 记录 6679652026,两次增量复审 PASS 6681066235、6688974146。PR 之前已入过合并队列,被 main 引起的超限退回;修好后需要 os-zhuang 重新入队。

席位意见:契约复审 PASS,无必改、无建议修改。席位在文档里查出一处错("可以改名",实际改名会被重新校验),已改。与 #30831 的冲突已解决,两边内容都保留。合并队列退回的原因是 main 的 #30926 给同一文件加了 3 个 token,已在同文件删一句付账(无规则丢失),第二次增量复审通过。可以重新入队。

席位核对

ACCEPT · seat domain:skills#2 · head 6772a2e8 · 2026-11-06T16:02Z

  1. Shape: Fixes #30731, Fixes #30826 (fold, both edit skills/objectstack-automation/SKILL.md), draft, base main, 5 files (skills/objectstack-automation/SKILL.md, skills/objectstack-automation/evals/flows-triggers-approvals.json case 15, content/docs/automation/queues-and-assignment-rules.mdx, scripts/check-skills-token-ratchet.mjs one row 6449 → 6426, .changeset/30731-automation-skill-notify-label-and-org-assignment-rules.md '@objectstack/skills': patch), +55/−16, six commits (four authored, two merges of main).
  2. Ruling: skills(objectstack-automation): a notice prints a select field's label with the mail option formatter, not label() in templateData (ruling F parameter 6, #30172) #30731: ruling F parameter 6 on A flow notice cannot name a select field's option by its label in the recipient's language: the mail renderer has no label formatter and the flow passes no option labels to CEL label() #30172 (maintainer 「同意」, recorded 6670405874); triage 6673659456. docs+skills: teach organization-authored assignment rules (sys_assignment_rule) and the active-member rule for a user target (PR #30760) #30826: the Skills-docs: follow-up of PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760; triage 6678081998. Claims 6678887018, 6678901809. Ceiling moved down only (6449 on main → 6444 → 6426).
  3. Contract review: PASS 6679652026 at 18600c34 (Fable, no must-fix, no should-fix), carried to c864cad6 by one prose-only docs line outside hits. Delta PASS 6681066235 at 24cc9034 (same reviewer, no findings): the head is a merge of origin/main c50e0dfa that resolved one conflicted hunk in SKILL.md (L322–326) against PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831; both sides kept, git diff 18600c34 24cc9034 on SKILL.md and the eval file shows only docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831's edits, case 15 byte-identical. Second delta PASS 6688974146 at 6772a2e8 (same reviewer, no findings): merge 92b37029 brought one 3-token clause from main 3479c33d (docs(automation): the notify click-through default says a before-create run links to its record only when the caller wrote the id #30926, sourceId comment) that breached the 6444 row in the merge queue (6447); relock commit 6772a2e8 deletes the Flows opener sentence (84 bytes, 21 tokens; its two claims carried by the node tables, the nodes + edges FlowSchema line and references/examples-flows.md) and re-locks the row at 6426, headroom 0. Clause-②: no, Metadata-protocol: none.
  4. Docs (seat's prose face, checked line by line against main): the organization-rule paragraph matches packages/objectql/src/assignment-rules.ts and plugin-sharing (sort_order then name, first match across both sources, a failed read routes nothing, user target only while an active member). The seat's one finding: "can still be switched off or renamed" was wrong (name is in JUDGED_COLUMNS, plugin-sharing assignment-rule-hooks.ts, so a rename is judged again); it now reads "switched off, re-ordered or relabelled; a rename … is judged again".
  5. Gates / check-runs: dev reports 87/87 derived families exit 0 at 61f2a99e, docs gates green at c864cad6, and at 24cc9034 the skill-text, eval, ratchet (+ --self-test) and docs families all exit 0 (list skills-seat-2/out/30731-gates-ran-24cc9034-merged.list); at 6772a2e8 the ratchet row is re-locked at the measurement 6426 (25724 bytes), headroom 0, and CI's Lint runs answer 6426 / 6426. On head 6772a2e8: 45 check-runs, 33 success, 12 skipped, 0 failed; mergeable_state clean. The earlier merge-queue red on 92b37029 (6447 > 6444) is the one this head pays.
  6. Accepted deviations: none. The overlap with PR docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace #30831 is resolved on this head (see 3).
  7. Landing: check-governed-merges --pr 30866: GOVERNED, Tier H (skills/**). The seat readies the PR and the relay's governed-review leg requests the approvers; no auto-merge is armed by the seat.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 6, 2026 16:03
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit dfa179a Nov 6, 2026
46 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

2 participants