Skip to content

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

Closed

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.

  12. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Landed · 2026-11-06T05:05Z

    Reading Value
    PR #30706 MERGED 2026-11-06T05:04Z as a599cc14 on main
    Card #30477 closed completed by Fixes #30477

    State: pm:dispatched removed in this stroke. Delivered: the mid-tier scenario card and its own truth-pin test file. Nothing left on this card.

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:seatpriority: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