Skip to content

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

Open

Description

@objectstack-fleet

domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

Filing gate: ③ maintainer-directed task. Ruling F on #30172: the maintainer answered 「同意」 to the recommendation on 2026-11-05, recorded word for word by domain:server#2 in #30172 comment 6670405874. Its parameter 6: "objectstack-automation skill gains one line: option labels in notices use the formatter, not label() in templateData." No domain:* label: triage routes it (the skills lane, Tier H).

What to add

One line in skills/objectstack-automation/SKILL.md, in the notify section: an option label in a notice is written with the mail formatter {{ stage | option:opportunity.stage }}, which prints the label in each recipient's language, and not with label() in templateData (which runs once per run, before recipients fan out, so it cannot be per recipient). The exact formatter spelling is whatever PR #30727 lands.

When

After both halves land: PR #30727 (spec half, #30172) and the server card for the plugin-email render. Teaching it earlier would teach a formatter whose send is refused. PR #30727's Skills-docs: line points here.

Business reason

An agent writing a HotCRM-style notice (hotcrm#2391) reaches for label() in templateData and gets either a parse refusal or one language for every recipient. The skill is where it learns the right form.

Who acts

The skills lane seat. The eval to extend is skills/objectstack-automation/evals/flows-triggers-approvals.json (a notice that prints a select field's label).

Dedupe: is:issue objectstack-automation skill option formatter → 11 hits (2 open seat posts, #30172 itself, 8 closed and unrelated); none carries this line.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 · domain:skills · 2026-11-06T00:53Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    documentationImprovements or additions to documentation
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  3. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibz5RLVEYDFco93jZ7u

    Claim: PM loop round 2 · 2026-11-06T06:39Z · automation fold (#30731 chain head + #30826, one PR)
    Session: session_01L9qibz5RLVEYDFco93jZ7u
    Account: os-tesla (the card's assignee)
    Branch: claude/project-thread-esfn9k (the fold thread's designated branch; dev session session_01L9qibxujehvWJcGRXMYv7f)
    Worktree: objectstack-automation-fold-30731
    Domain: domain:skills
    Seat: domain:skills#2
    File surface (whole fold): skills/objectstack-automation/SKILL.md (the notify section line for #30731, the assignTo: { type: 'user' } line for #30826), skills/objectstack-automation/evals/flows-triggers-approvals.json, content/docs/automation/queues-and-assignment-rules.mdx ("Declare an assignment rule"), the token-ratchet row only if a measured ceiling moves DOWN, one root .changeset/30731-automation-skill-notify-label-and-org-assignment-rules.md. ⛔ every other skill, ⛔ every ceiling raise (stop on breach)
    Container & model: M, mode:thread, model: claude-fable-5-1 (dispatch-gates --tier: MANDATORY for skills/** clause ①), effort: high (p3)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (ruling F parameter 6 on #30172)
    Thread-read: 6673659456
    Premise: holds: the upstream halves are merged (PR #30727 and PR #30781 for #30731; PR #30760 for #30826), and neither line is taught in the skill on origin/main ae82d057
    Serial constraints: fold-or-serial answered FOLD (both cards edit skills/objectstack-automation/SKILL.md). Seat 1's draft PR #30831 (#30805) edits the same SKILL.md and flows-triggers-approvals.json: merge origin/main and re-measure the ratchet before each push.

    Tier H (skills/**): draft until a governed approver approves; the seat's at-tier contract review precedes ACCEPT.

    Order: /mnt/project-files/skills-seat-2/r2026-11-06/dispatch-automation-fold-30731.md (frame FRAME.md beside it).

  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#2 · os-tesla · session_01L9qibxujehvWJcGRXMYv7f
    os-dev-report

    Reported 2026-11-06T07:16Z · fold #30731 (chain head) + #30826 · draft PR #30866 at head 18600c3.

    {
      "issue": 30731,
      "status": "done",
      "branch": "claude/project-thread-esfn9k",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30866",
      "session": "session_01L9qibxujehvWJcGRXMYv7f",
      "premise_still_valid": true,
      "summary": "Fold of #30731 and #30826, one draft PR with one Fixes line each. skills/objectstack-automation/SKILL.md gains (1) a notify-section paragraph: an option label in a notice is written in the mail template as the option formatter with a bare object.field argument, printed in each recipient's language, mail-only (refused in an inline title / message), never label() in templateData, which is evaluated once per run before fan-out; (2) in Assignment rules, a user target names an owner who holds the row only while an active member of its organization (else ownerless). Eval 15 of flows-triggers-approvals.json grades the notice case. content/docs/automation/queues-and-assignment-rules.mdx gains three paragraphs and a checklist bullet on organization-authored sys_assignment_rule records: evaluated before the declared assignmentRules, by sort_order then name, first match wins, one namespace by name, a failed read of the organization's rules routes nothing, the active-member rule for a user target, and what the save guard refuses — mirroring the page's sys_queue paragraph. Paid inside SKILL.md by deleting the CRM Automation Blueprint section (layout carried by objectstack-platform references/bootstrap.md), the When-to-Use restatement of the assignment-rules heading plus 'scheduled automation', and the scaffolded-project validate line (carried by objectstack-formula's Verify section); the token ceiling moved DOWN 6449 → 6448, re-locked at the measurement. Changeset '@objectstack/skills': patch naming both cards. Readings: SKILL.md 452 → 448 lines, 6447 → 6448 tokens; whole package (11 SKILL.md) 4523 → 4519 lines, 56716 → 56717 tokens. Overlap with seat 1's PR #30831: its assignment-rule hunk sits directly below this PR's changed assignTo lines (one adjacent-line conflict for whoever lands second); the notify paragraph, the deletions and eval 15 are outside its hunks.",
      "tests": "No package code changed. 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 (15 cases). pnpm --filter '@objectstack/lint...' build (VERDICT command-exit 0, 111 s under the verify lock) then pnpm build --filter='./packages/**' --concurrency=2 (80/80 tasks, VERDICT command-exit 0, 7m58s under the lock) for the dist-reading gates. No ablation: no tested behaviour changed.",
      "gates": "Derived at head 61f2a99e (base 677d542a): node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack listed 69 lines, then 87 after the ratchet-row edit; every line run in the foreground with stdin closed, exit codes captured before any pipe; 87/87 exit 0 (check:skill-examples, check:dual-build-cjs-loads and check:lean-entry-closure first exited 3 PREREQUISITE NOT MET on the unbuilt tree, exit 0 after the packages build). Reconciled: 'dispatch-gates --ran: 87 derived famil(ies) accounted for — 87 run, 0 NOT-MEASURED'. origin/main (5 commits, none on this PR's files) merged as 18600c34; re-run there: check-skills-token-ratchet, check:skill-identifier-liveness, check:pm-skill-id-lint, check:doc-authoring, check:role-word, spec check:skill-docs, check-empty-changeset --base origin/main, check:docs-single-h1 — all exit 0. Exit lists: /mnt/project-files/skills-seat-2/r2026-11-06/out/30731-gates-ran-61f2a99e.list and 30731-gates-ran-18600c34-merged.list. CI on the PR: in_progress at report time (the seat's ACCEPT reads the check-runs).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "8 reads, 0 writes — issue_read ×6 (#30731 get + comments ×2, #30826 get + comments ×2), pull_request_read ×2 (#30831 get_files, #30866 get)",
      "api_writes": "0 REST proxy writes. Relay writes: 2 — fleet-write pr_create (PR #30866, run 42179591638, 11487 bytes stored identical), post-stamped.mjs --comment=30731 (this report). git push ×2 (61f2a99e, 18600c34). The harness's MCP assignee/reviewer step was skipped (no MCP writes; the seat sets the assignee at hand-over).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: none (read-only observation) · no generated reference page exists for the sys_assignment_rule object (content/docs/references carries the assignment_rule metadata type only), so the docs prose names its columns inline · dedupe words: sys_assignment_rule reference page · carrier: none — noted in the PR's Acceptance notes, not filed",
        "class: none (process note) · the first commit on the branch carries the fleet bot as git author from a local -c override; later commits use the container's default Claude identity; the squash on landing rewrites it · carrier: none"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions