Repository navigation
Description
epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu
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).
Blocked-by: #30340
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.
Generated by Claude Code
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.