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(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
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.
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/mainae82d057
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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 ·
domain:skills· 2026-11-06T00:53Z⛔ Not a claim.
objectstack-automationskill gains one line, that option labels in notices use the mailoptionformatter, notlabel()intemplateData. It needs an'@objectstack/skills': patchchangeset.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
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_01L9qibz5RLVEYDFco93jZ7uAccount:
os-tesla(the card's assignee)Branch:
claude/project-thread-esfn9k(the fold thread's designated branch; dev sessionsession_01L9qibxujehvWJcGRXMYv7f)Worktree:
objectstack-automation-fold-30731Domain:
domain:skillsSeat:
domain:skills#2File surface (whole fold):
skills/objectstack-automation/SKILL.md(thenotifysection line for #30731, theassignTo: { 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 forskills/**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/mainae82d057Serial 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 andflows-triggers-approvals.json: mergeorigin/mainand 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(frameFRAME.mdbeside it).objectstack-fleet commentedon Nov 6, 2026
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" ] }