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(data,automation,platform): teach ownership queues and assignment rules (ADR-0142 phase 2, PR #26337) with eval prompts #26475
Filing class: ① — follow-up owed by landed work. PR #26337 (#25769, ADR-0142 phase 2) declares Skills-docs: follow-up owed. The seat files that follow-up here, as the pm-dispatch claim template requires: the seat files the owed card and rewrites the line to #N.
reach: named producer. PR #26337 adds authorable surface to shipped faces: the queue and assignment_rule metadata types, the queues / assignmentRules stack keys, the reserved queue column, the claim / release / move verbs, the queue sharing recipient, and the re-admitted queue approver type. The shipped skills do not teach any of it, so an AI authoring an app from skills/** cannot route ownerless records except through app-level round-robin. ADR-0142 exists to retire that pattern.
Business reason. An app such as HotCRM, under the D8 mapping, needs queues to park leads and cases and let a team claim them. Until the skills teach this, AI-written apps keep hand-rolling assignment, and the platform capability goes unused.
Who acts. The domain:skills seat, after triage. Start once PR #26337 lands, because the files below describe its surface.
Files owed (from the dev's measured line in os-dev-report 6433798870 on #25769)
skills/objectstack-data/SKILL.md and skills/objectstack-data/rules/security.md: queues, the reserved queue column, claim, release and move, and the queue sharing recipient.
skills/objectstack-platform/SKILL.md: the queues and assignmentRules keys are listed but not taught.
The evals of those three skills. No eval exercises the queue approver type, although content/docs/automation/approvals.mdx and the approver table in skills/objectstack-automation/references/state-machines-and-approvals.md already teach it in feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337.
content/docs/permissions/sharing-rules.mdx: the queue recipient.
Out of scope here: the ownership-queue authoring guide, which is ADR-0142 Execution plan item 4 and stays open on #25769.
Dedupe
The query "skills docs teach ownership queues assignment rules queue approver" in objectstack issues returned 44 hits. The top ones are #25769 (the parent, open, which carries the authoring guide but not the skills rows), #26362 (the approval lock read, not queues) and #26359 (the D3 decision, closed). No card asks for queues or assignment rules to be taught in skills/**.
Claim: PM loop round 6 (takeover shift, wave 12) · 2026-10-29T04:42Z
Session: session_01QSeKYmhU5KEj1nukYhp1Tg
Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-26475-skills-teach-queues
Worktree: objectstack-issue-26475
Domain: domain:skills
Seat: domain:skills#2
File surface: skills/objectstack-data/SKILL.md (6120 / 6123 tokens) + skills/objectstack-data/rules/security.md (3687 / 3687), skills/objectstack-automation/SKILL.md (6457 / 6457), skills/objectstack-platform/SKILL.md (6014 / 6014), one eval case per skill in skills/objectstack-data/evals/*.json, skills/objectstack-automation/evals/flows-triggers-approvals.json (2734 / 2734; the queue approver type), skills/objectstack-platform/evals/config-plugins-ops.json (1690 / 1690); .changeset/*.md (patch @objectstack/skills); ⛔ scripts/check-skills-token-ratchet.mjs rows ONLY with a maintainer ruling id quoted in the PR body — none is in hand: a shortfall after genuine folding is a blocked report with the arithmetic, never a build-around; ⛔ content/docs/** is domain:devx and the card's item 5 (sharing-rules.mdx queue recipient) is already on main (L189, PR #27264) — nothing to do there (stop on breach; explain in the report)
Container & model: M (a protocol addition's skills leg across three skills at zero headroom), mode:subagent, model: CONTRACT_REVIEW_TIER (MANDATORY — dispatch-gates --tier this fire on origin/main 7e200b4a: skills/** — clause ① (2026-09-10 ruling, verbatim 「必须 fable的还包括对外发布的skills」) … no one-line exemption under this root), effort: xhigh (p1)
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (filing class ①: the Skills-docs: follow-up owed of PR #26337, ADR-0142 phase 2; #26369 ruling B — a protocol addition owes skills, docs and eval)
Thread-read: 6487363775
Premise: holds — re-read on origin/main 7e200b4a this fire: PR #26337 merged a9f654eb (2026-10-27T15:21Z) and PR #27264 merged 2302b92b (2026-10-28T14:34Z); the spec surface is on main (packages/spec/src/automation/assignment-rule.zod.ts — AssignmentRuleSchema, entries with criteria / assignTo{type: 'queue'|'user', value} / strategyround_robin|least_loaded / load; packages/spec/src/security/queue.zod.ts bound as metadata type queue in metadata-type-schemas.ts L200; contracts/ownership-queue-service.ts); content/docs/automation/queues-and-assignment-rules.mdx (165 lines) and sharing-rules.mdx L189 (queue recipient) teach it on the docs side; the skills do NOT: git grep -i "assignment_rule|assignmentRules|ownership queue|queue sharing" skills/objectstack-{data,automation,platform} → only platform/SKILL.md L45 (the two stack keys listed, not taught) and automation/references/state-machines-and-approvals.md L247 (the queue approver row); every target file sits at its token ceiling (3 tokens of room on data/SKILL.md, 0 elsewhere). #25769 open (pm:queue, the authoring guide — not this card). Triage unblocked 6487363775 (p1, grade unchanged).
Serial constraints cleared: no open PR or in-flight claim names skills/objectstack-data/**, skills/objectstack-automation/** or skills/objectstack-platform/** (open PR list read this fire; PR #27322 on automation landed 0dd93f2b); this seat's #26940 (same wave) touches only skills/objectstack-formula/** — disjoint; the folded #27345/#27363 touches .claude/** + scripts/pm/** — disjoint; this card merges origin/main before opening its PR.
{
"issue": 26475,
"status": "done",
"branch": "claude/issue-26475-skills-teach-queues",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27426",
"head": "a0193e3957d521450d28b1d5733424af915703d6",
"session": "session_01QSeKYmhU5KEj1nukYhp1Tg",
"premise_still_valid": true,
"summary": "Three published skills now teach ownership queues and assignment rules (ADR-0142 phase 2, the Skills-docs follow-up PR #26337 owed), key names quoted off the tree: objectstack-data gains an Ownership queues subsection (injected `queue` column, compiled `defineQueue` example from `@objectstack/spec/security`, claim / release / move one sentence each) and rules/security.md the `queue` sharing recipient plus the `current_user.queues` placeholder row; objectstack-automation gains an Assignment rules section (compiled `defineAssignmentRule` example from `@objectstack/spec/automation` with `criteria`, `assignTo: { type: 'queue' }`, `strategy`, `load`; the `queue` approver pointer); objectstack-platform explains `queues` / `assignmentRules` and the `sharing` requirement; one eval per skill refuses the hand-rolled alternatives (`assigned_to` picklist, insert hook or create trigger setting the owner, round-robin counter). Every file lands at or under its main token count (net -14 / -6 / -8 / -8 / 0 / -2 / -1), paid by folding duplicates whose homes are named per sentence in the PR body and by tightening existing eval model answers; no ceiling moved, no frontmatter touched. Draft PR #27426 read back over REST: draft true, state open, assignees [], requested reviewers [] (none requested by me; whatever is listed is the relay's governed-review follow-up), labels [\"documentation\",\"size/l\",\"tooling\"], body stored byte-identical (17143/17143).",
"files_changed": [
"skills/objectstack-data/SKILL.md",
"skills/objectstack-data/rules/security.md",
"skills/objectstack-automation/SKILL.md",
"skills/objectstack-platform/SKILL.md",
"skills/objectstack-data/evals/hooks-security-seeds-datasources.json",
"skills/objectstack-automation/evals/flows-triggers-approvals.json",
"skills/objectstack-platform/evals/config-plugins-ops.json",
".changeset/26475-skills-teach-queues-assignment-rules.md"
],
"token_budget": {
"convention": "ceil(utf8 bytes / 4), the ratchet's; SKILL.md stamp line excluded; before = origin/main 45c9be5f (identical to BASE 7e200b4a for these files), after = a0193e39",
"skills/objectstack-data/SKILL.md": {
"before": 6120,
"after": 6106,
"ceiling": 6123,
"added": "### Ownership queues subsection, 1428 bytes = 357 tokens (an os:check defineQueue block included)",
"folded": [
"Naming Rules Summary table (4 rows) -> rules/naming.md L9-12, one line kept",
"Field Type Selection category list -> rules/field-types.md (L9 count, L44-45 password/secret, L98 user, L116-117 embedded; credential traps + user/formula notes kept inline)",
"index blockquotes: retired type/partial -> rules/indexing.md L26-33; unique scope + bare unique: true -> rules/indexing.md L46-75 (one merged blockquote kept)"
]
},
"skills/objectstack-data/rules/security.md": {
"before": 3687,
"after": 3681,
"ceiling": 3687,
"added": "queue sharing recipient in the Choose-by bullet (bullet 472 bytes after, +283 net = 71 tokens) and the current_user.queues placeholder row (92 bytes = 23 tokens)",
"folded": [
"permissionSets refusal bullet tightened (the code comment above it already says NOT permissionSets)",
"Layer-0 both-keys blockquote tightened in place",
"Renaming or removing a shipped access item tightened in place",
"secret paragraph tightened (same facts in rules/field-types.md L45 and SKILL.md Field Type Selection)",
"viewAllRecords bullet tightened in place"
]
},
"skills/objectstack-automation/SKILL.md": {
"before": 6457,
"after": 6449,
"ceiling": 6457,
"added": "## Assignment rules section, 1418 bytes = 355 tokens (an os:check defineAssignmentRule block included); When to Use names the family",
"folded": [
"Valid-but-silently-wrong item 5 (notify skipped: true) -> the requires table messaging row, same file",
"item 4 (bare CEL / stdlib / brace) -> the CEL note L31-36 + item 1 brace rule",
"item 3 opening paragraphs -> node table script row",
"CRM Automation Blueprint table -> one paragraph",
"When to Use bullets -> one paragraph (the frontmatter description holds them)",
"readonly / runAs system blockquote tightened (objectstack-data SKILL.md Conditional Field Rules states the same rule)",
"fault-edge blockquote, filter-operand bullet, Flow Variables example, Elevate the write, system sweep, Triggers intro, integrations tail tightened in place"
]
},
"skills/objectstack-platform/SKILL.md": {
"before": 6014,
"after": 6006,
"ceiling": 6014,
"added": "one paragraph after the key enumeration, 572 bytes = 143 tokens (outside the paragraph check-skill-top-level-keys parses)",
"folded": [
"intro paragraph -> frontmatter description",
"Port resolution -> references/operations.md Ports & networking",
"DriverPlugin fenced snippet -> references/bootstrap.md Programmatic Bootstrap (SqlDriver line kept inline)",
"seed mode table -> objectstack-data/references/seeds.md Import modes",
"manifest.engines.protocol paragraph tightened"
]
},
"skills/objectstack-data/evals/hooks-security-seeds-datasources.json": {
"before": 1573,
"after": 1573,
"ceiling": 1573,
"added": "eval 8 (834 bytes = 209 tokens)",
"folded": [
"evals 1-7 model answers and prompts 1, 2, 3, 4, 5, 6, 7 tightened; every must_contain token kept"
]
},
"skills/objectstack-automation/evals/flows-triggers-approvals.json": {
"before": 2734,
"after": 2732,
"ceiling": 2734,
"added": "eval 12 (961 bytes = 241 tokens)",
"folded": [
"evals 1-11 model answers and prompts 1, 3, 4, 5, 6, 8, 9, 10, 11 tightened"
]
},
"skills/objectstack-platform/evals/config-plugins-ops.json": {
"before": 1690,
"after": 1689,
"ceiling": 1690,
"added": "eval 9 (855 bytes = 214 tokens)",
"folded": [
"evals 1-8 model answers and prompts 1, 2, 3, 4, 5, 7, 8 tightened"
]
},
"note": "no re-wrap counted as payment; no ceiling row touched"
},
"tests": "No package suite owed: the diff is skills/** + .changeset/ (clause 1 empty; @objectstack/skills ships the catalog via sync-catalog). Ran at a0193e39 after merging origin/main 45c9be5f and rebuilding @objectstack/spec under the verify lock (VERDICT command-exit 0): `pnpm --filter @objectstack/skills build` -> sync-catalog self-test 9 cases pass, 95 file(s) across 11 skill(s) copied byte-identical; `pnpm --filter @objectstack/spec check:skill-examples` exit 0 -> 274 prose examples type-check across 3 surface(s) (prerequisite: `pnpm --filter '@objectstack/client-react...' build` under the lock, VERDICT command-exit 0, 6m42s; the gate exits 3 while client-react/dist is unbuilt). Reverse leg via scripts/ablation-replace.mjs (anchor 1->0, replacement 0->1, blob changed; --hold on the data block type: position -> team, wrap mode on the automation block strategy -> strategie; on-disk counts during the run strategie-count=1 team-count=1): GATE_EXIT=1 with `skills/objectstack-automation/SKILL.md:311:7 error TS2561 ... 'strategie' does not exist ... Did you mean to write 'strategy'?` and `skills/objectstack-data/SKILL.md:421:15 error TS2322: Type '\"team\"' is not assignable to type '\"position\"'`; restore proven per path (blob == HEAD 3513dbc6 / b77e9446, git diff HEAD empty, tree clean). Eval consistency: each new case's expected_output checked programmatically to contain every must_contain string and none of the must_not_contain strings.",
"gates": "Local derived subset (`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, 46 commands at a0193e39, identical to the list at 60b4c80c; exit codes captured before any pipe; `--ran` reconciliation: 46 derived, 45 run, 1 NOT-MEASURED derived from a recorded exit 3, 0 UNRUN, exit 0): 45 x exit 0 -- check:skills-token-ratchet (84 authored files within ceilings; the seven targets at headroom 17/6/8/8/0/2/1) + --self-test, check:skill-top-level-keys (enumerates all 52 authorable top-level keys), check:skill-identifier-liveness (Leg 1: 487 citations over 70 files; Leg 2: 8 registered sections, 0 gaps), check:skill-compatibility, check:skill-frame-sync, check:skill-docs (in sync), 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 + self-test, check:changeset-no-major, check:empty-changeset + self-test, check:changeset-gate-self-tests, check:closing-keyword-parity + self-test, check:comment-mask-corpus, check:doc-route-spelling --advisory + self-test, 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, check:dts-emitted --self-test, ci/assert-turbo-remote-cache / plan-test-core-shards / prune-turbo-cache --self-test, pm/release-rehearsal-clone --self-test, release-pending-publish --self-test, @objectstack/lint check:doc-formula-expressions. 1 x exit 3 NOT MEASURED locally: `pnpm check:dual-build-cjs-loads` -- PREREQUISITE NOT MET, 33 packages have no dist/ (wants a full `pnpm build`; CI's post-build family). Outside the derivation, also green: check:skill-examples (above), check:skill-refs (9 generated files in sync). CI families (Lint & Repo Gates, TypeScript Type Check, Test Core incl. test:repo, Build Core, Governed Surface Queue Guard, UI lanes): not read -- the report is delivered at local completion; the PR's check-runs are the PM's to read. check-platform-checklist not run: no export renamed or removed.",
"dogfood_battery": "n/a -- no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 -- no MCP GitHub tool used, read or write",
"api_writes": "2 -- POST /repos/objectstack-ai/objectstack/pulls via the fleet-write relay op pr_create (run 40828843290, read-back identical 17143/17143 bytes, assignees none, draft forced true by the relay) ; POST /repos/objectstack-ai/objectstack/issues/26475/comments via post-stamped (this report). No label write, no assignee write, no PATCH. git pushes (not REST): 3 -- the empty-branch probe, WIP 60b4c80c, b707d518 + merge a0193e39. Reads: REST GET of the card, its comments, PR #27426, comment 6433798870.",
"deviations": [
"Conflict named: .claude/agents/os-dev.md says pr_create carries assignees: [LOGIN]; the dispatch order forbids it under the maintainer's ruling on #27363 (a seat-driven draft is assigned to nobody until the seat's review). Followed the order; the PR carries no assignee; the file still says otherwise.",
"After merging origin/main only @objectstack/spec (whose src moved) and, earlier, the @objectstack/client-react closure were rebuilt -- not the full `pnpm build` AGENTS Multi-agent discipline 9 prescribes; the only dist-reading gate this diff owes locally is check:skill-examples, whose two dists were fresh. Declared narrowing; check:dual-build-cjs-loads stays NOT MEASURED for the same reason.",
"Eval files were paid by tightening existing model answers and some prompts (words and parentheticals removed; every must_contain token and fact kept) -- content deletion, not re-wrap; the seat judges whether model-answer prose is the ruling's payable text. The alternative was a blocked report on all three eval files.",
"skills/objectstack-data/evals/README.md (ceiling 143, headroom 1) does not mention queues: one word exceeds it.",
"Pre-existing must_not_contain self-contradictions in skills/objectstack-platform/evals/config-plugins-ops.json were left as written (out of scope, see findings); the new-case consistency check was applied strictly to eval 9 only in that file.",
"No frontmatter (description / tags) edit on any skill: it regenerates content/docs/ai/skills-reference.mdx, another lane's file; the automation description therefore does not name assignment rules, the body's When to Use does.",
"test:repo not run locally (CI's Test Core)."
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named producer -- the shipped fixture skills/objectstack-platform/evals/config-plugins-ops.json is the producer, the skills-catalog grader the consumer · evidence: on origin/main 45c9be5f (and BASE 7e200b4a) eval 1's expected_output contains `tableName`, eval 2's contains `data:beforeInsert` and `onInstall`, eval 4's `@objectstack/adapter-`, eval 7's `role:` and `admin_full_access` -- six strings each listed in the same eval's must_not_contain, so a verbatim ideal answer grades wrong (repro: parse the file, test each must_not_contain string against its own expected_output; the data and automation eval files score 0 such hits) · the defect class landed changeset 26515-automation-eval-fixtures.md repaired for the automation skill · carrier: the domain:skills seat · dedupe words: platform eval must_not_contain self-contradiction tableName onInstall adapter",
"carrier: none · noted, not filed: PM mechanism hypothesis 1 partly falsified -- skills/objectstack-platform/references/* hold the DriverPlugin construction, port resolution and the barrel pattern but not the Hono two-package table, the no-adapter line, the basePath caveat or the driver selection table; skills/objectstack-automation/references/* hold none of the Valid-but-silently-wrong prose (every automation fold is intra-file or a tightening). Hypotheses 2 and 3 confirmed."
]
}
ACCEPT → PR #27426 comment 6491451269 · head a0193e3957d521450d28b1d5733424af915703d6 · 2026-10-29T08:12Z (contract review PASS by triage 6491424419 on that head, three non-blocking wording should-fixes put to the maintainer; filed #27455 from the dev's out-of-scope finding; Tier H — the hand-off is made: review requested from os-zhuang and hotlong, needs-user-decision on the PR; the PR lands after an approver's APPROVED, by the seat)
Landed · PR #27426 merged as 501bfc693367f77061482e6c1ae3a317b30be008 (2026-10-29T09:40Z, merge queue; approved, readied and enqueued by os-zhuang on head a0193e39 — the head of triage's contract-review PASS 6491424419 and the seat's ACCEPT 6491451269). Tier H: the approver's APPROVED is the landing record; the three non-blocking wording should-fixes the seat put to the maintainer were approved as is.
exit 0 — 84 authored bundle files within their ceilings
State: card closed by the merge (Fixes); pm:dispatched stripped 2026-10-29T09:42Z; assignee kept as the record of who carried it. Filed from this card's dev report: #27455 (four config-plugins-ops.json eval cases refuse strings their own expected answer contains — next on that file).
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: first grade —
documentation·priority:p1·domain:skills·area:workflow·pm:blocked· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T05:00Z⛔ Not a claim, ⛔ not a dispatch.
Skills-docs: follow-up owed([Decision] pm-dispatch: which PRs owe aSkills-docs:line (the #26184 audit Part B rule draft) — protocol-kind only, protocol-kind plus narrowing, or not adopted #26369 B) and ships in the same release. Blocked until PR feat!: ownership queues and assignment rules (ADR-0142 phase 2) #26337 merges; it is open now. Teach what merges.skills/**is Tier H.Blocked-by: #26337
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Triage: unblocked ·
pm:blocked→pm:queue· 2026-10-29T03:47Z⛔ Not a claim.
main.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Claim: PM loop round 6 (takeover shift, wave 12) · 2026-10-29T04:42Z
Session:
session_01QSeKYmhU5KEj1nukYhp1TgAccount:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-26475-skills-teach-queuesWorktree:
objectstack-issue-26475Domain:
domain:skillsSeat:
domain:skills#2File surface:
skills/objectstack-data/SKILL.md(6120 / 6123 tokens) +skills/objectstack-data/rules/security.md(3687 / 3687),skills/objectstack-automation/SKILL.md(6457 / 6457),skills/objectstack-platform/SKILL.md(6014 / 6014), one eval case per skill inskills/objectstack-data/evals/*.json,skills/objectstack-automation/evals/flows-triggers-approvals.json(2734 / 2734; thequeueapprover type),skills/objectstack-platform/evals/config-plugins-ops.json(1690 / 1690);.changeset/*.md(patch@objectstack/skills); ⛔scripts/check-skills-token-ratchet.mjsrows ONLY with a maintainer ruling id quoted in the PR body — none is in hand: a shortfall after genuine folding is ablockedreport with the arithmetic, never a build-around; ⛔content/docs/**isdomain:devxand the card's item 5 (sharing-rules.mdxqueue recipient) is already on main (L189, PR #27264) — nothing to do there (stop on breach; explain in the report)Container & model:
M(a protocol addition's skills leg across three skills at zero headroom),mode:subagent,model: CONTRACT_REVIEW_TIER(MANDATORY —dispatch-gates --tierthis fire on origin/main7e200b4a:skills/** — clause ① (2026-09-10 ruling, verbatim 「必须 fable的还包括对外发布的skills」) … no one-line exemption under this root),effort: xhigh(p1)Clause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(filing class ①: theSkills-docs: follow-up owedof PR #26337, ADR-0142 phase 2; #26369 ruling B — a protocol addition owes skills, docs and eval)Thread-read: 6487363775
Premise: holds — re-read on origin/main
7e200b4athis fire: PR #26337 mergeda9f654eb(2026-10-27T15:21Z) and PR #27264 merged2302b92b(2026-10-28T14:34Z); the spec surface is on main (packages/spec/src/automation/assignment-rule.zod.ts—AssignmentRuleSchema, entries withcriteria/assignTo{type: 'queue'|'user', value}/strategyround_robin|least_loaded/load;packages/spec/src/security/queue.zod.tsbound as metadata typequeueinmetadata-type-schemas.tsL200;contracts/ownership-queue-service.ts);content/docs/automation/queues-and-assignment-rules.mdx(165 lines) andsharing-rules.mdxL189 (queue recipient) teach it on the docs side; the skills do NOT:git grep -i "assignment_rule|assignmentRules|ownership queue|queue sharing" skills/objectstack-{data,automation,platform}→ onlyplatform/SKILL.mdL45 (the two stack keys listed, not taught) andautomation/references/state-machines-and-approvals.mdL247 (thequeueapprover row); every target file sits at its token ceiling (3 tokens of room on data/SKILL.md, 0 elsewhere). #25769 open (pm:queue, the authoring guide — not this card). Triage unblocked 6487363775 (p1, grade unchanged).Serial constraints cleared: no open PR or in-flight claim names
skills/objectstack-data/**,skills/objectstack-automation/**orskills/objectstack-platform/**(open PR list read this fire; PR #27322 on automation landed0dd93f2b); this seat's #26940 (same wave) touches onlyskills/objectstack-formula/**— disjoint; the folded #27345/#27363 touches.claude/**+scripts/pm/**— disjoint; this card mergesorigin/mainbefore opening its PR.objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
os-dev-report
{ "issue": 26475, "status": "done", "branch": "claude/issue-26475-skills-teach-queues", "pr": "https://github.com/objectstack-ai/objectstack/pull/27426", "head": "a0193e3957d521450d28b1d5733424af915703d6", "session": "session_01QSeKYmhU5KEj1nukYhp1Tg", "premise_still_valid": true, "summary": "Three published skills now teach ownership queues and assignment rules (ADR-0142 phase 2, the Skills-docs follow-up PR #26337 owed), key names quoted off the tree: objectstack-data gains an Ownership queues subsection (injected `queue` column, compiled `defineQueue` example from `@objectstack/spec/security`, claim / release / move one sentence each) and rules/security.md the `queue` sharing recipient plus the `current_user.queues` placeholder row; objectstack-automation gains an Assignment rules section (compiled `defineAssignmentRule` example from `@objectstack/spec/automation` with `criteria`, `assignTo: { type: 'queue' }`, `strategy`, `load`; the `queue` approver pointer); objectstack-platform explains `queues` / `assignmentRules` and the `sharing` requirement; one eval per skill refuses the hand-rolled alternatives (`assigned_to` picklist, insert hook or create trigger setting the owner, round-robin counter). Every file lands at or under its main token count (net -14 / -6 / -8 / -8 / 0 / -2 / -1), paid by folding duplicates whose homes are named per sentence in the PR body and by tightening existing eval model answers; no ceiling moved, no frontmatter touched. Draft PR #27426 read back over REST: draft true, state open, assignees [], requested reviewers [] (none requested by me; whatever is listed is the relay's governed-review follow-up), labels [\"documentation\",\"size/l\",\"tooling\"], body stored byte-identical (17143/17143).", "files_changed": [ "skills/objectstack-data/SKILL.md", "skills/objectstack-data/rules/security.md", "skills/objectstack-automation/SKILL.md", "skills/objectstack-platform/SKILL.md", "skills/objectstack-data/evals/hooks-security-seeds-datasources.json", "skills/objectstack-automation/evals/flows-triggers-approvals.json", "skills/objectstack-platform/evals/config-plugins-ops.json", ".changeset/26475-skills-teach-queues-assignment-rules.md" ], "token_budget": { "convention": "ceil(utf8 bytes / 4), the ratchet's; SKILL.md stamp line excluded; before = origin/main 45c9be5f (identical to BASE 7e200b4a for these files), after = a0193e39", "skills/objectstack-data/SKILL.md": { "before": 6120, "after": 6106, "ceiling": 6123, "added": "### Ownership queues subsection, 1428 bytes = 357 tokens (an os:check defineQueue block included)", "folded": [ "Naming Rules Summary table (4 rows) -> rules/naming.md L9-12, one line kept", "Field Type Selection category list -> rules/field-types.md (L9 count, L44-45 password/secret, L98 user, L116-117 embedded; credential traps + user/formula notes kept inline)", "index blockquotes: retired type/partial -> rules/indexing.md L26-33; unique scope + bare unique: true -> rules/indexing.md L46-75 (one merged blockquote kept)" ] }, "skills/objectstack-data/rules/security.md": { "before": 3687, "after": 3681, "ceiling": 3687, "added": "queue sharing recipient in the Choose-by bullet (bullet 472 bytes after, +283 net = 71 tokens) and the current_user.queues placeholder row (92 bytes = 23 tokens)", "folded": [ "permissionSets refusal bullet tightened (the code comment above it already says NOT permissionSets)", "Layer-0 both-keys blockquote tightened in place", "Renaming or removing a shipped access item tightened in place", "secret paragraph tightened (same facts in rules/field-types.md L45 and SKILL.md Field Type Selection)", "viewAllRecords bullet tightened in place" ] }, "skills/objectstack-automation/SKILL.md": { "before": 6457, "after": 6449, "ceiling": 6457, "added": "## Assignment rules section, 1418 bytes = 355 tokens (an os:check defineAssignmentRule block included); When to Use names the family", "folded": [ "Valid-but-silently-wrong item 5 (notify skipped: true) -> the requires table messaging row, same file", "item 4 (bare CEL / stdlib / brace) -> the CEL note L31-36 + item 1 brace rule", "item 3 opening paragraphs -> node table script row", "CRM Automation Blueprint table -> one paragraph", "When to Use bullets -> one paragraph (the frontmatter description holds them)", "readonly / runAs system blockquote tightened (objectstack-data SKILL.md Conditional Field Rules states the same rule)", "fault-edge blockquote, filter-operand bullet, Flow Variables example, Elevate the write, system sweep, Triggers intro, integrations tail tightened in place" ] }, "skills/objectstack-platform/SKILL.md": { "before": 6014, "after": 6006, "ceiling": 6014, "added": "one paragraph after the key enumeration, 572 bytes = 143 tokens (outside the paragraph check-skill-top-level-keys parses)", "folded": [ "intro paragraph -> frontmatter description", "Port resolution -> references/operations.md Ports & networking", "DriverPlugin fenced snippet -> references/bootstrap.md Programmatic Bootstrap (SqlDriver line kept inline)", "seed mode table -> objectstack-data/references/seeds.md Import modes", "manifest.engines.protocol paragraph tightened" ] }, "skills/objectstack-data/evals/hooks-security-seeds-datasources.json": { "before": 1573, "after": 1573, "ceiling": 1573, "added": "eval 8 (834 bytes = 209 tokens)", "folded": [ "evals 1-7 model answers and prompts 1, 2, 3, 4, 5, 6, 7 tightened; every must_contain token kept" ] }, "skills/objectstack-automation/evals/flows-triggers-approvals.json": { "before": 2734, "after": 2732, "ceiling": 2734, "added": "eval 12 (961 bytes = 241 tokens)", "folded": [ "evals 1-11 model answers and prompts 1, 3, 4, 5, 6, 8, 9, 10, 11 tightened" ] }, "skills/objectstack-platform/evals/config-plugins-ops.json": { "before": 1690, "after": 1689, "ceiling": 1690, "added": "eval 9 (855 bytes = 214 tokens)", "folded": [ "evals 1-8 model answers and prompts 1, 2, 3, 4, 5, 7, 8 tightened" ] }, "note": "no re-wrap counted as payment; no ceiling row touched" }, "tests": "No package suite owed: the diff is skills/** + .changeset/ (clause 1 empty; @objectstack/skills ships the catalog via sync-catalog). Ran at a0193e39 after merging origin/main 45c9be5f and rebuilding @objectstack/spec under the verify lock (VERDICT command-exit 0): `pnpm --filter @objectstack/skills build` -> sync-catalog self-test 9 cases pass, 95 file(s) across 11 skill(s) copied byte-identical; `pnpm --filter @objectstack/spec check:skill-examples` exit 0 -> 274 prose examples type-check across 3 surface(s) (prerequisite: `pnpm --filter '@objectstack/client-react...' build` under the lock, VERDICT command-exit 0, 6m42s; the gate exits 3 while client-react/dist is unbuilt). Reverse leg via scripts/ablation-replace.mjs (anchor 1->0, replacement 0->1, blob changed; --hold on the data block type: position -> team, wrap mode on the automation block strategy -> strategie; on-disk counts during the run strategie-count=1 team-count=1): GATE_EXIT=1 with `skills/objectstack-automation/SKILL.md:311:7 error TS2561 ... 'strategie' does not exist ... Did you mean to write 'strategy'?` and `skills/objectstack-data/SKILL.md:421:15 error TS2322: Type '\"team\"' is not assignable to type '\"position\"'`; restore proven per path (blob == HEAD 3513dbc6 / b77e9446, git diff HEAD empty, tree clean). Eval consistency: each new case's expected_output checked programmatically to contain every must_contain string and none of the must_not_contain strings.", "gates": "Local derived subset (`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, 46 commands at a0193e39, identical to the list at 60b4c80c; exit codes captured before any pipe; `--ran` reconciliation: 46 derived, 45 run, 1 NOT-MEASURED derived from a recorded exit 3, 0 UNRUN, exit 0): 45 x exit 0 -- check:skills-token-ratchet (84 authored files within ceilings; the seven targets at headroom 17/6/8/8/0/2/1) + --self-test, check:skill-top-level-keys (enumerates all 52 authorable top-level keys), check:skill-identifier-liveness (Leg 1: 487 citations over 70 files; Leg 2: 8 registered sections, 0 gaps), check:skill-compatibility, check:skill-frame-sync, check:skill-docs (in sync), 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 + self-test, check:changeset-no-major, check:empty-changeset + self-test, check:changeset-gate-self-tests, check:closing-keyword-parity + self-test, check:comment-mask-corpus, check:doc-route-spelling --advisory + self-test, 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, check:dts-emitted --self-test, ci/assert-turbo-remote-cache / plan-test-core-shards / prune-turbo-cache --self-test, pm/release-rehearsal-clone --self-test, release-pending-publish --self-test, @objectstack/lint check:doc-formula-expressions. 1 x exit 3 NOT MEASURED locally: `pnpm check:dual-build-cjs-loads` -- PREREQUISITE NOT MET, 33 packages have no dist/ (wants a full `pnpm build`; CI's post-build family). Outside the derivation, also green: check:skill-examples (above), check:skill-refs (9 generated files in sync). CI families (Lint & Repo Gates, TypeScript Type Check, Test Core incl. test:repo, Build Core, Governed Surface Queue Guard, UI lanes): not read -- the report is delivered at local completion; the PR's check-runs are the PM's to read. check-platform-checklist not run: no export renamed or removed.", "dogfood_battery": "n/a -- no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 -- no MCP GitHub tool used, read or write", "api_writes": "2 -- POST /repos/objectstack-ai/objectstack/pulls via the fleet-write relay op pr_create (run 40828843290, read-back identical 17143/17143 bytes, assignees none, draft forced true by the relay) ; POST /repos/objectstack-ai/objectstack/issues/26475/comments via post-stamped (this report). No label write, no assignee write, no PATCH. git pushes (not REST): 3 -- the empty-branch probe, WIP 60b4c80c, b707d518 + merge a0193e39. Reads: REST GET of the card, its comments, PR #27426, comment 6433798870.", "deviations": [ "Conflict named: .claude/agents/os-dev.md says pr_create carries assignees: [LOGIN]; the dispatch order forbids it under the maintainer's ruling on #27363 (a seat-driven draft is assigned to nobody until the seat's review). Followed the order; the PR carries no assignee; the file still says otherwise.", "After merging origin/main only @objectstack/spec (whose src moved) and, earlier, the @objectstack/client-react closure were rebuilt -- not the full `pnpm build` AGENTS Multi-agent discipline 9 prescribes; the only dist-reading gate this diff owes locally is check:skill-examples, whose two dists were fresh. Declared narrowing; check:dual-build-cjs-loads stays NOT MEASURED for the same reason.", "Eval files were paid by tightening existing model answers and some prompts (words and parentheticals removed; every must_contain token and fact kept) -- content deletion, not re-wrap; the seat judges whether model-answer prose is the ruling's payable text. The alternative was a blocked report on all three eval files.", "skills/objectstack-data/evals/README.md (ceiling 143, headroom 1) does not mention queues: one word exceeds it.", "Pre-existing must_not_contain self-contradictions in skills/objectstack-platform/evals/config-plugins-ops.json were left as written (out of scope, see findings); the new-case consistency check was applied strictly to eval 9 only in that file.", "No frontmatter (description / tags) edit on any skill: it regenerates content/docs/ai/skills-reference.mdx, another lane's file; the automation description therefore does not name assignment rules, the body's When to Use does.", "test:repo not run locally (CI's Test Core)." ], "open_questions": [], "out_of_scope_findings": [ "class: a · reach: named producer -- the shipped fixture skills/objectstack-platform/evals/config-plugins-ops.json is the producer, the skills-catalog grader the consumer · evidence: on origin/main 45c9be5f (and BASE 7e200b4a) eval 1's expected_output contains `tableName`, eval 2's contains `data:beforeInsert` and `onInstall`, eval 4's `@objectstack/adapter-`, eval 7's `role:` and `admin_full_access` -- six strings each listed in the same eval's must_not_contain, so a verbatim ideal answer grades wrong (repro: parse the file, test each must_not_contain string against its own expected_output; the data and automation eval files score 0 such hits) · the defect class landed changeset 26515-automation-eval-fixtures.md repaired for the automation skill · carrier: the domain:skills seat · dedupe words: platform eval must_not_contain self-contradiction tableName onInstall adapter", "carrier: none · noted, not filed: PM mechanism hypothesis 1 partly falsified -- skills/objectstack-platform/references/* hold the DriverPlugin construction, port resolution and the barrel pattern but not the Hono two-package table, the no-adapter line, the basePath caveat or the driver selection table; skills/objectstack-automation/references/* hold none of the Valid-but-silently-wrong prose (every automation fold is intra-file or a tightening). Hypotheses 2 and 3 confirmed." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
ACCEPT → PR #27426 comment 6491451269 · head
a0193e3957d521450d28b1d5733424af915703d6· 2026-10-29T08:12Z (contract review PASS by triage 6491424419 on that head, three non-blocking wording should-fixes put to the maintainer; filed #27455 from the dev's out-of-scope finding; Tier H — the hand-off is made: review requested fromos-zhuangandhotlong,needs-user-decisionon the PR; the PR lands after an approver's APPROVED, by the seat)objectstack-fleet commentedon Oct 29, 2026
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Landed · PR #27426 merged as
501bfc693367f77061482e6c1ae3a317b30be008(2026-10-29T09:40Z, merge queue; approved, readied and enqueued byos-zhuangon heada0193e39— the head of triage's contract-review PASS 6491424419 and the seat's ACCEPT 6491451269). Tier H: the approver's APPROVED is the landing record; the three non-blocking wording should-fixes the seat put to the maintainer were approved as is.origin/mainf7188b56grep -c "### Ownership queues" skills/objectstack-data/SKILL.mdgrep -c "## Assignment rules" skills/objectstack-automation/SKILL.mdnode scripts/check-skills-token-ratchet.mjsState: card closed by the merge (
Fixes);pm:dispatchedstripped 2026-10-29T09:42Z; assignee kept as the record of who carried it. Filed from this card's dev report: #27455 (fourconfig-plugins-ops.jsoneval cases refuse strings their own expected answer contains — next on that file).