Skip to content

Scenario library: mid-tier card — 订单到收款 order-to-cash (8–10 问数 + 4–6 write operations, row-scoped personas) #30477

Open

Description

@objectstack-fleet

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, 订单到收款 order-to-cash (sales / finance)

Write docs/qa/scenarios/order-to-cash.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: account, follow-up activity (an activity stream, not entered inline), sales order + lines, invoice, payment; receivables aging.
  • 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: none in the templates repo; general business knowledge.
  • ⛔ 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

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queue
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 5, 2026
  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:devx · epic child · 2026-11-05T14:07Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    priority:p1High: required for production / M2
    and removed
    pm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queue
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

    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.

  5. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 5, 2026
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

    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/.

  7. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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_016WV4d1Exmm9uiWTdqYBhqM (card thread)
    Account: os-elon-musk
    Branch: claude/project-thread-o6p52q (amended: the card thread's branch)
    Worktree: card thread container
    Domain: domain:devx
    Seat: domain:devx#3
    File surface: docs/qa/scenarios/order_to_cash.json · packages/qa/scenarios/test/order-to-cash.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: 6662237832
    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 merges main after a sibling lands. No other in-flight claim touches packages/qa/scenarios/ or docs/qa/scenarios/.

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#3 · os-elon-musk · session_016WV4d1Exmm9uiWTdqYBhqM
    os-dev-report

    {
      "issue": 30477,
      "status": "done",
      "branch": "claude/project-thread-o6p52q",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30706",
      "session": "session_016WV4d1Exmm9uiWTdqYBhqM",
      "premise_still_valid": true,
      "summary": "Added docs/qa/scenarios/order_to_cash.json, the order-to-cash mid-tier card: 8 objects (employee, account, product, sales_order, order_line, invoice, payment, activity as the account's follow-up stream), a discount approval routed to the owner's sales manager, a time-triggered collection-call automation, 3 personas (sales_rep and sales_manager row-scoped, ar_clerk org-wide), a receivables aging report, 120 orders across 2026-07..10 with 240 lines, 95 invoices, 72 payments and 64 activities generated by the rule in $comment, 10 questions, 6 operations, 5 agent actions (write_off_balance confirm-gated). Added packages/qa/scenarios/test/order-to-cash.test.ts pinning the 10 truths and 8 per-persona truths against values worked from the rule by an independent script (never the loader), with hand derivations beside the pins, plus the floor, seed-vs-rule consistency, write-outcome consistency, and two red fixture copies (wrong seed cell, wrong truth spec). No shared file touched: since PR #30600 library.test.ts and the README are card-agnostic.",
      "tests": "head e44efca5: pnpm --filter @objectstack/scenarios test → Test Files 5 passed (5), Tests 70 passed (70) (64 before + 6 new); pnpm --filter @objectstack/scenarios typecheck → exit 0 after pnpm --filter '@objectstack/scenarios^...' build; both via os-verify-lock, VERDICT command-exit 0. After merging main (packages/spec moved): spec build + check:generated → all 14 generated artifacts up to date. The red-fixture tests show the pins fail on inv005.balance+1 (open_receivables 124241) and on receivables_aging filter value ['open'] (1_30 21300). No ablation: no tested runtime behaviour changed.",
      "gates": "local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 50 commands; all 50 exit 0 on 5d751a9f and again on the merge head e44efca5; --ran reconciliation: 50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN. First run had two exit 3 (PREREQUISITE NOT MET), both exit 0 after the prerequisite: check-plugin-teardown-shape.mjs --self-test (pinned commit 621a4876 fetched into the shallow clone) and check:dual-build-cjs-loads (full turbo run build, 119/119). CI check-runs at report time on e44efca5: Check Changeset success, Governed Surface Queue Guard success, filter success; Lint/Type Check/Build Core/Test UI/Live E2E UI lanes in_progress or queued.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "1379 changed lines (+1379 / -0, 2 files) vs 3000: under",
      "files_changed": ["docs/qa/scenarios/order_to_cash.json", "packages/qa/scenarios/test/order-to-cash.test.ts"],
      "deviations": [
        "File name order_to_cash.json, not order-to-cash.json as the card body spells it: the schema requires a snake_case id equal to the basename (same call as PR #30600).",
        "File surface narrower than the original claim (no library.test.ts or README line): PR #30600 made both card-agnostic; the seat amended the claim before the first push.",
        "One exploratory vitest run of library.test.ts (4 s) ran outside os-verify-lock before the first locked run; every later build/test went through the lock.",
        "Harness asked to assign the PR to the requester and request their review: not done (os-dev rule 2, no MCP writes; the seat assigns at hand-over).",
        "PR body footer uses the AGENTS.md session-URL form instead of the harness's generated-with line.",
        "main moved again after the merge (4bf9a2d7, spec-only #30655 #30666, no overlap with this diff): not merged, per AGENTS.md multi-agent §10 (after open, merge main only on a conflict, a main-caused red or a queue removal)."
      ],
      "mcp_calls": "6 — GitHub MCP reads only: issue_read get #30477, issue_read get_comments #30477 x2, pull_request_read get #30600, pull_request_read get #30706, pull_request_read get_check_runs #30706. Plus claude-code-remote subscribe_pr_activity #30706 (a session subscription, not a GitHub write).",
      "api_writes": "2 — both relay POST /repos/objectstack-ai/objectstack/dispatches: pr_create #30706 with labels skip-changeset (run 42124614536, read-back 8127/8127 bytes identical) and this os-dev-report comment on #30477. Plus 3 git pushes (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · docs/qa/scenarios/README.md Adding-a-card step 3 names the pin file test/ID.test.ts while its model travel-expense.test.ts and this card's order-to-cash.test.ts use a hyphenated basename; naming observation, noted in PR #30706 Acceptance notes, not filed.",
        "carrier: devx seat 3 · the claim template's serial-constraint line still names library.test.ts as the shared line for sibling cards #30478-#30481; since PR #30600 no card edits it, so those claims can drop it; noted, not filed."
      ]
    }
  10. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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 reported unscored, never a pass. It now has 9 rows, listed in packages/qa/scenarios/README.md once 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, 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.

  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#3 · os-elon-musk · session_016WV4cz3RTQjLh7hZBLzgtZ

    ACCEPT → PR #30706 comment 6671941989 (head e44efca5, 2026-11-05T23:10Z). Waiting on the landing word.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority: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