Repository navigation
docs(skills): objectstack-data, -automation and -platform teach ownership queues and assignment rules (ADR-0142 phase 2) with one eval each - #27426
Conversation
…d assignment rules (WIP) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg
…rules, paid by tightening existing model answers Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg
…ills-teach-queues
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429 rate_limit: the account's ceiling-tier quota is exhausted, 2026-10-29T07:03Z) · head a0193e3 The dispatching seat holds no claim and no record on this head and will not review it below tier (contract-review.md 〈复核归属与资格〉: 「派发席达档调用被配额拒(HTTP 429)⇒ ⛔ 不降档审;PR 落交接行、留等复核标记,交分诊席」). The maintainer's words this session: 「没有fable了,用 opus 完成开发,然后等分诊契约复审」. For the reviewer (inputs, not conclusions): the card is #26475 (Tier H |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Triage seat, taking the hand-off and Generated by Claude Code |
Contract reviewServed-tier: ① Derived judgmentsInputs read in full: card #26475 body + 4 comments (triage grade 6434161625, unblock 6487363775, claim 6488140412, os-dev-report 6489653060), PR #27426 body, file list (8 files), both PR comments (hand-off 07:04Z, triage claim 07:54Z), the 46 check-runs on the head, and the net diff vs
② Semver level
③ Boundary flags
Out-of-scope finding 2 (PM fold-home hypothesis partly falsified) is reporting, not a defect; no action. ④ Design judgmentEach
Nothing in the seven Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg 维护者速读
席位核对
ACCEPT · head |
Fixes #26475
Clause-②: no
Metadata-protocol: none
维护者速读
objectstack-data新增小节 Ownership queues(保留列queue、可编译的defineQueue示例、claim / release / move 各一句)与rules/security.md的queue共享收件人和current_user.queues占位符;objectstack-automation新增小节 Assignment rules(可编译的defineAssignmentRule示例:criteria/assignTo: { type: 'queue' }/strategy/load,外加queue审批人指针);objectstack-platform给queues/assignmentRules两个键各一句并点明需sharing能力;三个 skill 各加一条 eval。assigned_to下拉、轮询计数字段、钩子挑 owner;平台已经付出的 ADR-0142 用不上。本 PR 是 PR feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337 欠下的Skills-docs后续。skills/**与一条@objectstack/skillspatch changeset;不动 spec、运行时、content/docs/**、ratchet 脚本。每个文件 token 数不升(新文字靠折叠同 skillrules/**/references/**已有的重复句付账,eval 靠精简既有示范答案的措辞)。风险在折叠处:若某句被我误判为重复,读者要多开一个 rules 文件。回滚 = revert 本 PR。skills/objectstack-automation/SKILL.md—— 新节 Assignment rules 与 Valid-but-silently-wrong 条目 3/4/5 的折叠;②skills/objectstack-data/SKILL.md—— 新节 Ownership queues 与 Common Patterns 三处折叠(Naming / Field Type Selection / 索引引言);③ 三个evals/*.json—— 新 case 的断言,以及既有示范答案精简后是否失真。node scripts/check-skills-token-ratchet.mjs—— 预期末行「84 authored bundle file(s) within their ceilings」,七个目标文件 headroom 0–17;pnpm --filter @objectstack/spec check:skill-examples(先pnpm --filter '@objectstack/client-react...' build)—— 预期「274 prose examples type-check」,含两个新os:check块。skills/**)—— 授权账号 APPROVE 一次,席位落地;无其它动作。What changes
Teach what PR #26337 (ADR-0142 phase 2) merged, quoting key names off the tree:
packages/spec/src/security/queue.zod.ts(QueueSchema:name,label,members[].type: 'position',members[].value),packages/spec/src/automation/assignment-rule.zod.ts(AssignmentRuleSchema:name,object,entries[]withcriteria,assignTo: { type: 'queue' | 'user', value },strategy: 'round_robin' | 'least_loaded',load), the stack keysqueues/assignmentRules(stack.zod.tsL839/L848), the injectedqueuecolumn (injected-system-columns.tsQUEUE_COLUMN), thequeuesharing recipient (sharing.zod.tsShareRecipientType) and thequeueapprover type (approval.zod.tsApproverType).defineQueueanddefineAssignmentRuleare subpath exports (@objectstack/spec/security,@objectstack/spec/automation), not root exports — the examples import them that way.skills/objectstack-data/SKILL.md### Ownership queues — park a record for a team to claimunder Security & Access Control: the injectedqueuecolumn, a compileddefineQueueexample, claim / release / move one sentence each, the hand-rolled alternatives refusedrules/naming.mdL9–12 (one line kept); Field Type Selection category list →rules/field-types.md(L9 count, L44–45password/secret, L98user, L116–117 embedded; the two credential traps and theuser/formulanotes kept inline); the two index blockquotes (retiredtype/partial; unique scope and bareunique: true) →rules/indexing.mdL26–33, L46–75 (one blockquote kept)skills/objectstack-data/rules/security.mdqueuesharing recipient (sharedWith: { type: 'queue', value }shares the rule's rows, parks none) in the Choose by what the rows are keyed on bullet; thecurrent_user.queuesplaceholder row (rls.zod.tsL57–58)permissionSets:refusal bullet, the Layer-0 "both keys are load-bearing" blockquote, Renaming or removing a shipped access item, thesecretparagraph (facts also inrules/field-types.mdL45) and theviewAllRecordsbullet — each tightened in place, every fact keptskills/objectstack-automation/SKILL.md## Assignment rules — route a new record to a queue or a personbefore Triggers: when a rule runs, a compileddefineAssignmentRuleexample (parked entry;least_loaded+load;round_robinnoted),strategyonly on a queue target, thequeueapprover pointer toreferences/state-machines-and-approvals.md§ Approver Types, the hand-rolled alternatives refused; When to Use names the familyskipped: true) → therequirestable'smessagingrow (same file); item 4 → the CEL note at the top and item 1's brace rule; item 3's two opening paragraphs → thescriptnode-table row; CRM Automation Blueprint table → one paragraph; When to Use bullets → one paragraph (the frontmatterdescriptionholds them); thereadonly/runAs: 'system'blockquote tightened (objectstack-data SKILL.md Conditional Field Rules states the same rule); the fault-edge blockquote, the filter-operand bullet, the Flow Variables example, Elevate the write, the system-sweep note, the Triggers intro and the integrations tail tightened in placeskills/objectstack-platform/SKILL.mdqueuesandassignmentRulesdeclare, theirdefine*factories and subpaths, and that both need the ownership-queue service@objectstack/plugin-sharingregisters (sharinginrequires) or the boot is refused (describeMissingOwnershipQueueService)description; Port resolution →references/operations.md§ Ports & networking; theDriverPluginfenced snippet →references/bootstrap.md§ Programmatic Bootstrap (theSqlDriverline kept inline); the seedmodetable →objectstack-data/references/seeds.md§ Import modes;manifest.engines.protocoltightenedskills/objectstack-data/evals/hooks-security-seeds-datasources.jsonmust_containdefineQueue/type: 'position'/type: 'queue'/CONCURRENT_UPDATE,must_not_containassigned_to/beforeInsertmust_containtoken and fact kept)skills/objectstack-automation/evals/flows-triggers-approvals.jsonqueueapprover;must_containdefineAssignmentRule/strategy: 'round_robin'/type: 'queue'/type: 'approval',must_not_containassigned_to/record-after-createskills/objectstack-platform/evals/config-plugins-ops.jsonqueues:andassignmentRules:with'sharing'inrequires;must_not_containassigned_to/beforeInsert.changeset/26475-skills-teach-queues-assignment-rules.md'@objectstack/skills': patch, both declaration linesToken table (
ceil(utf8 bytes / 4), the ratchet's convention; stamp line excluded on SKILL.md;main= origin/main45c9be5f,now=a0193e39):skills/objectstack-data/SKILL.mdskills/objectstack-data/rules/security.mdskills/objectstack-automation/SKILL.mdskills/objectstack-platform/SKILL.mdskills/objectstack-data/evals/hooks-security-seeds-datasources.jsonskills/objectstack-automation/evals/flows-triggers-approvals.jsonskills/objectstack-platform/evals/config-plugins-ops.jsonNo ceiling moves. No re-wrap counted as payment: every freed token is a deleted word, a removed duplicate or a dropped fence. Frontmatter is untouched on all three skills (a
description/tagsedit regeneratescontent/docs/ai/skills-reference.mdx, another lane's file);check:skill-docsandcheck:skill-refsreport in sync.Tests
Final head
a0193e39(origin/main45c9be5fmerged in before the PR; it movedpackages/spec/src/ui/component.zod.ts, so@objectstack/specwas rebuilt under the verify lock, VERDICT command-exit 0, before the readings below).`pnpm --filter @objectstack/spec check:skill-examples` — green, then the reverse leg (exit 0 / exit 1)
Green on
a0193e39:✅ 274 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them(240 skills+docs, 11 spec TSDoc, 23 client SDK). Prerequisite:pnpm --filter '@objectstack/client-react...' buildunder the lock (VERDICT command-exit 0, 6m42s) — the gate refuses with exit 3 whilepackages/client-react/distis unbuilt.Reverse leg, both new blocks mutated through
scripts/ablation-replace.mjs(anchor count 1 → 0, replacement 0 → 1, blob changed;--holdon the data file, wrap mode on the automation file), on-disk counts during the runstrategie-count=1 team-count=1:Restore proven per path:
blob after restore == blob at HEAD(data3513dbc6…, automationb77e9446…),git diff HEADempty on both, tree clean.`node scripts/check-skills-token-ratchet.mjs` — exit 0
Derived families — `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `a0193e39`, 46 commands, exit codes captured before any pipe
45 × exit 0:
check:skills-token-ratchet(+ self-test),check:skill-top-level-keys(enumerates all 52 authorable top-level keys),check:skill-identifier-liveness(Leg 1: 487 citation(s) over 70 published file(s)),check:skill-compatibility,check:skill-frame-sync,check:skill-docs,check:doc-authoring,check:corpus-claim-drift,check:closed-ceremony-text,check:role-word,check:nul-bytes,check:pm-skill-id-lint,check:pm-governed-merges,check:published-files,check:adr-0087-registration --base origin/main,check:changeset-no-major,check:empty-changeset,check:changeset-gate-self-tests,check:closing-keyword-parity,check:comment-mask-corpus,check:doc-route-spelling --advisory,check:cross-package-test-inputs,check:driver-memory-census,check:dts-closure,check:lean-entry-closure,check:sourcemap-no-sources-content,check:watch-hint-literal,check:gitlink-declared,check:merge-driver,check:refd-timer-probe,check:ci-filter-parity,check:agent-test-spelling,check:pm-changeset-deadline-census,@objectstack/lint check:doc-formula-expressions, and the derived--self-tests.1 × exit 3, NOT MEASURED locally:
pnpm check:dual-build-cjs-loads—PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/(33 packages; wants a fullpnpm build, a farm-wide run that belongs to CI; this diff touches no package source).Also run:
pnpm --filter @objectstack/skills build—✓ sync-catalog self-test: 9 cases pass·95 file(s) across 11 skill(s) copied from skills/** into dist/skills and read back byte-identical;check:skill-refs—9 generated files in sync.No package test suite is owed: the diff touches
skills/**and.changeset/only (@objectstack/skillsships the catalog bysync-catalog.mjs, run above); clause ① is empty.test:repoand the full farm are CI's.Acceptance notes
.claude/agents/os-dev.mdsayspr_createcarriesassignees: [LOGIN]; the dispatch order says omit it under the maintainer's 2026-10-29 ruling on skills(os-dev, pm-dispatch): a seat-driven PR is not assigned to the seat's account at the draft open; it reaches a human only after ACCEPT + contract PASS, as a review request to os-zhuang/hotlong when Tier H #27363 (a seat-driven draft is assigned to nobody until the seat's review). This PR follows the order and carries no assignee; the file still says otherwise.skills/objectstack-platform/references/*hold theDriverPluginconstruction, port resolution and the barrel pattern, but NOT the Hono two-package table, the "no@objectstack/adapter-*" line, thebasePathcaveat or the driver selection table — those stayed.skills/objectstack-automation/references/*hold none of the Valid-but-silently-wrong prose, so every automation fold is intra-file (duplicates of the node table, the CEL note and therequirestable) or a tightening. The data folds are as hypothesised:rules/naming.md,rules/field-types.md(all 49 types present, checked by name) andrules/indexing.mdhold the folded text.expected_outputwas checked programmatically to contain everymust_containtoken and none of themust_not_containones.skills/objectstack-platform/evals/config-plugins-ops.jsonon origin/main: the model answer of eval 1 containstableName, eval 2 containsdata:beforeInsertandonInstall, eval 4 contains@objectstack/adapter-, eval 7 containsrole:andadmin_full_access— each a string the same eval'smust_not_containforbids, so a verbatim ideal answer grades wrong (the defect class the landed changeset26515-automation-eval-fixtures.mdfixed for the automation skill). Repro: parse the file and test eachmust_not_containstring against its ownexpected_output. reach: named producer — the shipped eval fixture is the producer, the skills catalog grader the consumer. Left as written here (my tightening of those answers kept the wording); carrier: thedomain:skillsseat. Dedupe words: platform eval must_not_contain self-contradiction tableName onInstall.rules/security.mdalso gains thecurrent_user.queuesplaceholder row (the RLS placeholder table listed six reserved keys and the kernel-name list already namedqueues). Nothing from the minimum teaching was cut.skills/objectstack-data/evals/README.md(ceiling 143, headroom 1) was not updated to mention queues: one word exceeds it, and the ruling allows no raise.Skills-docs:line: kindnone, no(narrowing)arm.Verification
Reading the teaching:
skills/objectstack-data/SKILL.md§ Ownership queues;skills/objectstack-automation/SKILL.md§ Assignment rules;skills/objectstack-platform/SKILL.mdthe paragraph after the key enumeration; the three new eval cases (ids 8 / 12 / 9).Generated by Claude Code