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
Filing-gate category: ④ in-scope child of #30289 (the scenario-library card schema). It is split out because the ruled scope measured over the 3000-line human-merge threshold: dev report comment 6658595859, seat decision on #30289. Maintainer rulings it carries are on objectstack-ai/cloud#3600: Q1 = v3 (comment 6658194654, 「同意这9个场景」), plus the execution parameter and declarative floor (comment 6658499884).
Scope: one mid-tier scenario card, 请假与假期余额 leave & balances (HR)
Write docs/qa/scenarios/leave-balances.json against the schema #30340 lands, plus its own truth-pin test file under packages/qa/scenarios/test/. A test file per card keeps the six card PRs from conflicting.
Domain: employee, department, leave type, balance, leave request; the approval route depends on the number of days; the balance is decremented on approval.
Mid-tier floor:
5–8 related objects;
≥1 approval or automation flow;
2–3 roles with row scope;
≥1 report or dashboard;
seed spanning ≥3 months, ≥100 rows on the main object;
declarative preferred (flows, formulas, validation rules over code hooks), so a graduated app can install unmanaged.
Run half:
8–10 read-only 问数 questions: count/sum, group-by, top-N, a time window, ≥2 cross-object, ≥2 permission-boundary (the truth differs per persona), "who owns / latest progress", ≥1 unanswerable-from-seed;
4–6 write operations, each with its expected outcome declared: entry from free text incl. lines, a modify, a workflow step + progress query, a confirm-gated irreversible action, a refused overstep, a refused validation violation, one multi-step chain;
≥3 agent-callable actions declared, ≥1 of them confirm-gated.
Iterate: one sentence, with its expected delta.
Reference:objectstack-ai/templates/packages/hr (domain design only; ⛔ never its v15 code).
⛔ No customer-derived content; ⛔ do not read or paraphrase objectstack-ai/cloud#3567.
Acceptance
The card loads with zero refusals. Every computed truth is asserted in the card's own test file against hand-worked values.
A deliberately wrong truth in a fixture copy goes red.
The PR stays under 3000 changed lines.
Reader: the epic PM of objectstack-ai/cloud#3600 dispatches it once PR #30340 merges. The six siblings are dispatched in parallel.
Re-graded p2 → p1 and handed to the domain:devx lane on a maintainer ruling (Claude Code session 2026-11-05, recorded on objectstack-ai/cloud#3600), verbatim: 「都可以标记高优先级」, then on the seat's follow-up question the option 「p1 + 只交 6 张卡 (推荐)」. pm:epic removed in this stroke; pm:blocked stays on Blocked-by: #30340. When PR #30340 merges, the devx lane seat dispatches this card from pm:queue, overriding this body's "Reader" line. The card's body, and the rulings it cites, are the spec. Note for triage: this is a direct maintainer re-grade; NORTH-STAR's road-table rule yields to the ruling.
Unblocked: Blocked-by: #30340 has merged (58085ffd), so pm:blocked → pm:queue in one transition. This card is the domain:devx lane's to claim and dispatch (p1). The schema it writes against is on main: packages/qa/scenarios/src/schema.ts; worked examples are the three control cards in docs/qa/scenarios/.
Claim: PM loop round 1 · 2026-11-05T21:26Z
Session: session_016WV4cz3RTQjLh7hZBLzgtZ (devx seat 3) · dev: session_016WV4cw5kGUbtDLQqKwTH7E (card thread)
Account: os-elon-musk
Branch: claude/project-thread-oih0ft (amended: the card thread's branch)
Worktree: card thread container
Domain: domain:devx
Seat: domain:devx#3
File surface: docs/qa/scenarios/leave_balances.json · packages/qa/scenarios/test/leave-balances.test.ts (narrowed by the dev: #30600 left library.test.ts and the README card-agnostic) (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate, per-card call), effort: xhigh (p1)
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6662261980
Premise: holds (Blocked-by #30340 merged as 58085ff; sibling #30476 landed as PR #30600b6ae87c, the worked example)
Serial constraints cleared: the five sibling cards #30477–#30481 each write their own card file and test file; the shared line is packages/qa/scenarios/test/library.test.ts (one registration line per card), so each PR merges main after a sibling lands. No other in-flight claim touches packages/qa/scenarios/ or docs/qa/scenarios/.
{
"issue": 30479,
"status": "done",
"branch": "claude/project-thread-oih0ft",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30690",
"session": "session_016WV4cw5kGUbtDLQqKwTH7E",
"premise_still_valid": true,
"summary": "Added docs/qa/scenarios/leave_balances.json, the leave-and-balances mid-tier card: 7 objects (department, employee, leave_type, leave_balance, leave_request, leave_day, approval_step); a request of up to 3 days goes to the department manager, over 3 days to the manager then HR (e13), a manager's own request to e14; approval rolls used_days up into the balance and remaining_days = entitled + carry-over - used. Seed: 120 requests starting 2026-07..10 (307 day lines, 141 approval steps, 28 balances), generated by the rule stated in the card's $comment. 3 personas (employee and dept_manager row-scoped, medical_note hidden from both and from hr_officer), 1 report, 10 questions (one unanswerable), 6 operations, 5 guardrails, 4 agent actions (delete_leave_request confirm-gated), iterate adds time off in lieu. Its own test file packages/qa/scenarios/test/leave-balances.test.ts pins all 10 truths and the 9 per-persona truths against hand-worked values, checks the seed against the card's stated rules (days = weekday lines, balance = approved requests + tenure rule, steps match days and status, both validation rules), checks that every applied where matches no seeded row, and shows a wrong seed cell and a wrong truth spec in fixture copies go red.",
"tests": "head 9bd3d3c99f (after merging main, 9 commits, none under docs/qa/scenarios/ or packages/qa/scenarios/): pnpm --filter @objectstack/scenarios test -> Test Files 5 passed (5), Tests 73 passed (73); pnpm --filter @objectstack/scenarios typecheck -> tsc --noEmit exit 0 (os-verify-lock VERDICT command-exit 0). Same on 42b3e57a before the merge. eslint --no-inline-config on the new test file exit 0. Truths were worked by hand from the seed rule and agreed with the loader. One-time real-card check: scripts/ablation-replace.mjs set LR-0098 days 5 -> 6 in the real card; 4 of 9 tests in leave-balances.test.ts failed; file restored (blob equal to HEAD, git diff HEAD empty). scripts/check-commit-card-trailers.mjs --range origin/main..HEAD ok; scripts/check-nul-bytes.mjs OK.",
"gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 50 commands. Run 1 on 42b3e57a: 50/50 exit 0 after clearing 4 exit-3 prerequisites (check-plugin-teardown-shape --self-test needed git fetch --unshallow origin main; check:doc-formula-expressions, check:lean-entry-closure, check:dual-build-cjs-loads needed a full turbo build, 119/119). Run 2 on the final head 9bd3d3c99f after a full build (exit 0): 50/50 exit 0; --ran reconciliation: 50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN. CI on PR 30690 at head 9bd3d3c99f: 53 check runs, all completed, 35 success, 18 skipped (UI/docs/opt-in path filters), 0 failure; incl. Build Core, Test Core (7 shards + aggregate), TypeScript Type Check, Lint & Repo Gates, Lint · ESLint, Lint · PM dispatch-gates, Check Changeset, Check PR Size, Governed Surface Queue Guard, PR-body guards, Check Documentation Links, Dogfood Regression Gate, Live E2E UI: success.",
"line_budget": "1342 changed lines (+1342 / -0, 2 files) vs threshold 3000: under",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "8 — GitHub MCP reads only: issue_read get (30479), issue_read get_comments (30479) x2, pull_request_read get_files (30594), pull_request_read get (30600), pull_request_read get (30690), pull_request_read get_check_runs (30690) x2; plus claude-code-remote subscribe_pr_activity (30690, platform watch, not a GitHub write). No MCP write tool.",
"api_writes": "2 relay strokes as objectstack-fleet[bot]: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/30690/labels skip-changeset; read-back identical, 9128 bytes, assignees []) and this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30479/comments). git push x2 (branch creation at 42b3e57a, then the main merge 9bd3d3c99f; not REST).",
"files_changed": [
"docs/qa/scenarios/leave_balances.json",
"packages/qa/scenarios/test/leave-balances.test.ts"
],
"deviations": "Card basename leave_balances.json instead of the issue spelling leave-balances.json (schema requires snake_case id = basename), as PR 30600 did. File surface as amended in claim 6669988647 (no library.test.ts or README edit). No changeset: @objectstack/scenarios is private, so skip-changeset, following PR 30600. The routed step-1 row of file_and_submit_from_text is not asserted in its post-state (a where cannot name the new request id, and approver e05 + pending also matches seeded rows). PR footer uses the AGENTS.md session-URL form. The project-context ask to assign and request review was not done (dispatch forbids MCP writes; os-dev forbids assignees).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
Note for this card's author (domain:devx#1), from the epic PM's review of objectstack#30291 / PR #30594 (ruling D). The capability-tag table is closed: a tag with no check is reported unscored, never a pass. It now has 9 rows, listed in packages/qa/scenarios/README.md once PR #30594 merges:
The merged travel-expense card (#30476) declares 12 tags, and 7 of them score unscored: records-forms.formula-field, records-forms.validation-rule, approvals.multi-step-approval, access-security.row-level-security, dashboards.report, ai.ask-data, ai.agent-actions.
Where a tag means the same as a row, use the row's name (e.g. access-security.row-scope, not access-security.row-level-security). Where it genuinely doesn't, keep it: an unscored tag is honest. The epic collects the demand and files one card to add checks for the most-used unscored tags once the six cards land.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:devx· epic child · 2026-11-05T14:10Z⛔ Not a claim.
Blocked-by: #30340holds.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Re-graded p2 → p1 and handed to the
domain:devxlane on a maintainer ruling (Claude Code session 2026-11-05, recorded on objectstack-ai/cloud#3600), verbatim: 「都可以标记高优先级」, then on the seat's follow-up question the option 「p1 + 只交 6 张卡 (推荐)」.pm:epicremoved in this stroke;pm:blockedstays onBlocked-by: #30340. When PR #30340 merges, the devx lane seat dispatches this card frompm:queue, overriding this body's "Reader" line. The card's body, and the rulings it cites, are the spec. Note for triage: this is a direct maintainer re-grade; NORTH-STAR's road-table rule yields to the ruling.objectstack-fleet commentedon Nov 5, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Unblocked:
Blocked-by: #30340has merged (58085ffd), sopm:blocked→pm:queuein one transition. This card is thedomain:devxlane's to claim and dispatch (p1). The schema it writes against is onmain:packages/qa/scenarios/src/schema.ts; worked examples are the three control cards indocs/qa/scenarios/.objectstack-fleet commentedon Nov 5, 2026
domain:devx#3 · os-elon-musk · session_016WV4cz3RTQjLh7hZBLzgtZ
Claim: PM loop round 1 · 2026-11-05T21:26Z
Session:
session_016WV4cz3RTQjLh7hZBLzgtZ(devx seat 3) · dev:session_016WV4cw5kGUbtDLQqKwTH7E(card thread)Account:
os-elon-muskBranch:
claude/project-thread-oih0ft(amended: the card thread's branch)Worktree: card thread container
Domain:
domain:devxSeat:
domain:devx#3File surface:
docs/qa/scenarios/leave_balances.json·packages/qa/scenarios/test/leave-balances.test.ts(narrowed by the dev: #30600 leftlibrary.test.tsand the README card-agnostic) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate, per-card call),effort: xhigh(p1)Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6662261980
Premise: holds (Blocked-by #30340 merged as 58085ff; sibling #30476 landed as PR #30600 b6ae87c, the worked example)
Serial constraints cleared: the five sibling cards #30477–#30481 each write their own card file and test file; the shared line is
packages/qa/scenarios/test/library.test.ts(one registration line per card), so each PR mergesmainafter a sibling lands. No other in-flight claim touchespackages/qa/scenarios/ordocs/qa/scenarios/.objectstack-fleet commentedon Nov 5, 2026
domain:devx#3 · os-elon-musk · session_016WV4cw5kGUbtDLQqKwTH7E
os-dev-report
{ "issue": 30479, "status": "done", "branch": "claude/project-thread-oih0ft", "pr": "https://github.com/objectstack-ai/objectstack/pull/30690", "session": "session_016WV4cw5kGUbtDLQqKwTH7E", "premise_still_valid": true, "summary": "Added docs/qa/scenarios/leave_balances.json, the leave-and-balances mid-tier card: 7 objects (department, employee, leave_type, leave_balance, leave_request, leave_day, approval_step); a request of up to 3 days goes to the department manager, over 3 days to the manager then HR (e13), a manager's own request to e14; approval rolls used_days up into the balance and remaining_days = entitled + carry-over - used. Seed: 120 requests starting 2026-07..10 (307 day lines, 141 approval steps, 28 balances), generated by the rule stated in the card's $comment. 3 personas (employee and dept_manager row-scoped, medical_note hidden from both and from hr_officer), 1 report, 10 questions (one unanswerable), 6 operations, 5 guardrails, 4 agent actions (delete_leave_request confirm-gated), iterate adds time off in lieu. Its own test file packages/qa/scenarios/test/leave-balances.test.ts pins all 10 truths and the 9 per-persona truths against hand-worked values, checks the seed against the card's stated rules (days = weekday lines, balance = approved requests + tenure rule, steps match days and status, both validation rules), checks that every applied where matches no seeded row, and shows a wrong seed cell and a wrong truth spec in fixture copies go red.", "tests": "head 9bd3d3c99f (after merging main, 9 commits, none under docs/qa/scenarios/ or packages/qa/scenarios/): pnpm --filter @objectstack/scenarios test -> Test Files 5 passed (5), Tests 73 passed (73); pnpm --filter @objectstack/scenarios typecheck -> tsc --noEmit exit 0 (os-verify-lock VERDICT command-exit 0). Same on 42b3e57a before the merge. eslint --no-inline-config on the new test file exit 0. Truths were worked by hand from the seed rule and agreed with the loader. One-time real-card check: scripts/ablation-replace.mjs set LR-0098 days 5 -> 6 in the real card; 4 of 9 tests in leave-balances.test.ts failed; file restored (blob equal to HEAD, git diff HEAD empty). scripts/check-commit-card-trailers.mjs --range origin/main..HEAD ok; scripts/check-nul-bytes.mjs OK.", "gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derives 50 commands. Run 1 on 42b3e57a: 50/50 exit 0 after clearing 4 exit-3 prerequisites (check-plugin-teardown-shape --self-test needed git fetch --unshallow origin main; check:doc-formula-expressions, check:lean-entry-closure, check:dual-build-cjs-loads needed a full turbo build, 119/119). Run 2 on the final head 9bd3d3c99f after a full build (exit 0): 50/50 exit 0; --ran reconciliation: 50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN. CI on PR 30690 at head 9bd3d3c99f: 53 check runs, all completed, 35 success, 18 skipped (UI/docs/opt-in path filters), 0 failure; incl. Build Core, Test Core (7 shards + aggregate), TypeScript Type Check, Lint & Repo Gates, Lint · ESLint, Lint · PM dispatch-gates, Check Changeset, Check PR Size, Governed Surface Queue Guard, PR-body guards, Check Documentation Links, Dogfood Regression Gate, Live E2E UI: success.", "line_budget": "1342 changed lines (+1342 / -0, 2 files) vs threshold 3000: under", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "8 — GitHub MCP reads only: issue_read get (30479), issue_read get_comments (30479) x2, pull_request_read get_files (30594), pull_request_read get (30600), pull_request_read get (30690), pull_request_read get_check_runs (30690) x2; plus claude-code-remote subscribe_pr_activity (30690, platform watch, not a GitHub write). No MCP write tool.", "api_writes": "2 relay strokes as objectstack-fleet[bot]: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/30690/labels skip-changeset; read-back identical, 9128 bytes, assignees []) and this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30479/comments). git push x2 (branch creation at 42b3e57a, then the main merge 9bd3d3c99f; not REST).", "files_changed": [ "docs/qa/scenarios/leave_balances.json", "packages/qa/scenarios/test/leave-balances.test.ts" ], "deviations": "Card basename leave_balances.json instead of the issue spelling leave-balances.json (schema requires snake_case id = basename), as PR 30600 did. File surface as amended in claim 6669988647 (no library.test.ts or README edit). No changeset: @objectstack/scenarios is private, so skip-changeset, following PR 30600. The routed step-1 row of file_and_submit_from_text is not asserted in its post-state (a where cannot name the new request id, and approver e05 + pending also matches seeded rows). PR footer uses the AGENTS.md session-URL form. The project-context ask to assign and request review was not done (dispatch forbids MCP writes; os-dev forbids assignees).", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:devx#3 · os-elon-musk · session_016WV4cz3RTQjLh7hZBLzgtZ
ACCEPT → PR #30690 comment 6671785717 (head
9bd3d3c9, 2026-11-05T23:01Z). Waiting on the landing word.objectstack-fleet commentedon Nov 5, 2026
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
Note for this card's author (
domain:devx#1), from the epic PM's review of objectstack#30291 / PR #30594 (ruling D). The capability-tag table is closed: a tag with no check is reportedunscored, never a pass. It now has 9 rows, listed inpackages/qa/scenarios/README.mdonce PR #30594 merges:records-forms.lookup,records-forms.master-detail-inline-edit,records-forms.roll-up-summary,records-forms.select-options,access-security.field-permissions,access-security.row-scope,approvals.approval-flow,automation.record-triggered-flow,dashboards.widget-measures.The merged travel-expense card (#30476) declares 12 tags, and 7 of them score
unscored:records-forms.formula-field,records-forms.validation-rule,approvals.multi-step-approval,access-security.row-level-security,dashboards.report,ai.ask-data,ai.agent-actions.Where a tag means the same as a row, use the row's name (e.g.
access-security.row-scope, notaccess-security.row-level-security). Where it genuinely doesn't, keep it: anunscoredtag is honest. The epic collects the demand and files one card to add checks for the most-used unscored tags once the six cards land.objectstack-fleet commentedon Nov 6, 2026
domain:devx#3 · os-elon-musk · session_016WV4cz3RTQjLh7hZBLzgtZ
Landed · 2026-11-06T05:06Z
aed9663bonmainFixes #30479State:
pm:dispatchedremoved in this stroke. Delivered: the mid-tier scenario card and its own truth-pin test file. Nothing left on this card.