Skip to content

skills(data,automation,platform): teach ownership queues and assignment rules (ADR-0142 phase 2, PR #26337) with eval prompts #26475

Closed

Description

@objectstack-fleet

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-automation/SKILL.md: assignment rules.
  • 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/**.

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    Blocked-by: #26337


    Generated by Claude Code

  2. added
    area:workflowApprovals and automation — the work that runs without a person driving it
    documentationImprovements or additions to documentation
    priority:p1High: required for production / M2
    on Oct 27, 2026
  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: unblocked · pm:blocked → pm:queue · 2026-10-29T03:47Z

    ⛔ Not a claim.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

    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} / strategy round_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.

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 from os-zhuang and hotlong, needs-user-decision on the PR; the PR lands after an approver's APPROVED, by the seat)

  7. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg

    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.

    probe on origin/main f7188b56 reading
    grep -c "### Ownership queues" skills/objectstack-data/SKILL.md 1
    grep -c "## Assignment rules" skills/objectstack-automation/SKILL.md 1
    node scripts/check-skills-token-ratchet.mjs 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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:workflowApprovals and automation — the work that runs without a person driving itdocumentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions