Skip to content

Scenario library: mid-tier card — 客服工单 service desk (8–10 问数 + 4–6 write operations, row-scoped personas) #30478

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, 客服工单 service desk (service)

Write docs/qa/scenarios/service-desk.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: ticket, customer, agent group, SLA policy, escalation rule, satisfaction rating.
  • 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/helpdesk (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

  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:09Z

    ⛔ 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#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Claim: PM loop round 1
    Session: session_016WV4cymvo9YoyLwKCXXBNw
    Account: os-elon-musk
    Branch: claude/project-thread-9hklro (the card thread's platform-assigned branch; a measured platform exception to claude/issue-<n>-<slug>, runbook 〈卡线程〉) · card thread session session_016WV4d1qKzjKPZvxpJsifYa
    Worktree: objectstack-issue-30478
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: docs/qa/scenarios/service_desk.json (new) and one new truth-pin test file packages/qa/scenarios/test/service-desk.test.ts, written against packages/qa/scenarios/src/schema.ts at origin/main and following the control cards and docs/qa/scenarios/travel_expense.json (#30476, PR #30600). ⛔ No edit to test/library.test.ts (README "Adding a card" step 3), schema.ts, loader.ts or truth.ts. No customer-derived content; not objectstack-ai/cloud#3567; objectstack-ai/templates/packages/helpdesk is a domain-design reference only (never its v15 code).
    Container & model: p1 · M, mode:thread, model: default tier (dispatch-gates --tier --repo objectstack-ai/objectstack on the two paths: "no path-derived mandate"), effort: xhigh (p1)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6662241335
    Premise: holds (Blocked-by: #30340 merged 58085ffd; no docs/qa/scenarios/service_desk.json on origin/main b3d2f4bd; no open PR or remote branch for this card). Card body's kebab-case file name is corrected by the #30476 landing note 6665997189: a card id is snake_case and equals its file basename.
    Serial constraints cleared: siblings #30477 #30479 #30481 (domain:devx#3) and #30478/#30480 each write their own card file and test file; no open PR touches docs/qa/scenarios/service_desk.json.

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4d1qKzjKPZvxpJsifYa
    os-dev-report

    {
     "issue": 30478,
     "status": "done",
     "branch": "claude/project-thread-9hklro",
     "pr": 30699,
     "head": "aa0ceb23b9cc55e39c2d1a774a1a93b402a797f8",
     "session": "session_016WV4d1qKzjKPZvxpJsifYa",
     "premise_still_valid": true,
     "summary": "Added docs/qa/scenarios/service_desk.json, the 客服工单 mid-tier card: 8 objects, 3 row-scoped personas, a support_performance dashboard, 120 tickets July-October 2026 from the $comment rule, 10 questions, 6 operations, 4 agent actions, one iterate step. packages/qa/scenarios/test/service-desk.test.ts pins 10 truths and 11 per-persona truths against hand-worked values, asserts the floor, the seed's SLA/escalation/routing/survey consistency and post-state where-uniqueness, and shows a wrong seed cell or truth spec goes red.",
     "gates": {
      "scenarios_test": "pnpm --filter @objectstack/scenarios exec vitest run --maxWorkers=2 :: exit 0 · Test Files 5 passed (5) · Tests 70 passed (70) · head aa0ceb23b9",
      "scenarios_typecheck": "pnpm --filter @objectstack/scenarios typecheck :: exit 0 · head aa0ceb23b9 (closure built)",
      "loader_refusals": 0,
      "dispatch_gates_commands": "50 derived · 50 exit 0 · head aa0ceb23b9",
      "prerequisite_reruns": [
       "check-plugin-teardown-shape.mjs --self-test exit 3 -> 0 after git fetch --unshallow origin main",
       "check:doc-formula-expressions exit 3 -> 0 after a full turbo run build (118/118)",
       "check:lean-entry-closure exit 3 -> 0 after the same build",
       "check:dual-build-cjs-loads exit 3 -> 0 after the same build"
      ],
      "ran_reconciliation": "50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN (derived zero: every line carries its exit code)",
      "merge_origin_main": "merged b77c160a02 (merge commit aa0ceb23b9); touches neither docs/qa nor packages/qa",
      "ci": "in_progress at report time; completed: Check Changeset success, Governed Surface Queue Guard success, Check Documentation Links success, filter success"
     },
     "line_budget": {
      "total": 1176,
      "additions": 1176,
      "deletions": 0,
      "files": 2,
      "threshold": 3000
     },
     "files_changed": [
      "docs/qa/scenarios/service_desk.json",
      "packages/qa/scenarios/test/service-desk.test.ts"
     ],
     "changeset": "none: @objectstack/scenarios is private; skip-changeset sent with pr_create and read back on the PR",
     "floor": {
      "objects_5_to_8": "expect.objects (8)",
      "automation_flow": "escalation_rule (2 active, 1 inactive) seeded + escalated tickets in grp_tier2; survey-on-resolve in run.operations[2]; capabilities automation.record-triggered-flow, automation.time-relative-trigger",
      "roles_with_row_scope": "run.personas[0..2] all scoped: support_agent (assignee a02), team_lead (group grp_tech), portal_customer (customer cus_03 + public comments)",
      "report_or_dashboard": "expect.dashboards[0] support_performance (+ appNavTargets[3])",
      "seed_span_and_size": "run.seed.ticket: 120 rows, opened_on 2026-07..2026-10 (4 months)",
      "declarative_preferred": "prompt.detailed zh/en + capabilities (formula-field, validation-rule, record-triggered-flow, time-relative-trigger); no schema field grades it",
      "questions_8_to_10": "run.questions (10)",
      "operations_4_to_6": "run.operations (6)",
      "agent_actions_3_plus_1_confirm": "run.agentActions (4); run.agentActions[3] close_ticket confirm true",
      "iterate": "iterate.change + expectDelta (objects kb_article; lookups ticket.kb_article)"
     },
     "run_half": {
      "question_kinds": {
       "count_sum": [
        "run.questions[0] open_tickets (count)",
        "run.questions[6] minutes_by_group (sum)",
        "run.questions[8] contract_value_by_tier (sum)"
       ],
       "group_by": [
        "run.questions[1] tickets_by_status",
        "run.questions[4] breaches_by_customer_tier",
        "run.questions[5] csat_by_group (avg)",
        "run.questions[6] minutes_by_group"
       ],
       "top_n": [
        "run.questions[2] top_customers"
       ],
       "time_window": [
        "run.questions[3] urgent_high_last_30_days (last_days 30)"
       ],
       "cross_object": [
        "run.questions[4] (customer.tier)",
        "run.questions[5] (ticket.group)",
        "run.questions[6] (ticket.group)",
        "run.questions[7] (assignee.name)"
       ],
       "permission_boundary": [
        "run.questions[0] (3 personas)",
        "run.questions[1] (team_lead)",
        "run.questions[5] (support_agent, portal_customer)",
        "run.questions[6] (team_lead, portal_customer withheld)",
        "run.questions[8] (support_agent and portal_customer withheld, team_lead)"
       ],
       "who_owns_latest_progress": [
        "run.questions[7] tk_0108_owner"
       ],
       "unanswerable": [
        "run.questions[9] avg_first_response_hours"
       ]
      },
      "operation_kinds": {
       "entry_from_free_text_incl_lines": "run.operations[0] log_ticket_from_call (applied: ticket + 2 comment lines)",
       "modify": "run.operations[1] reassign_ticket (applied)",
       "workflow_step": "run.operations[2] reply_then_resolve (applied: resolution sends the survey; progress query run.questions[7])",
       "confirm_gated_irreversible": "run.operations[3] close_ticket (pending_confirmation)",
       "refused_overstep": "run.operations[4] agent_edits_rating (refused PERMISSION_DENIED)",
       "refused_validation": "run.operations[5] resolve_without_code (refused VALIDATION_FAILED)",
       "multi_step_chain": "run.operations[2] reply_then_resolve (reply, resolve, survey); run.operations[0] also chains ticket + two comments"
      },
      "personas": 3,
      "guardrails": 5,
      "agent_actions": 4
     },
     "truths_pinned": {
      "all_rows": 10,
      "per_persona": 11,
      "file": "packages/qa/scenarios/test/service-desk.test.ts"
     },
     "wrong_truth_red": [
      "fixture copy, seed sr_029.score +1: assertPinned throws; csat_by_group grp_billing 85/18",
      "fixture copy, open_tickets filter value ['new','open']: assertPinned throws; open_tickets 12, team_lead 7"
     ],
     "deviations": [
      "branch is the platform-assigned claude/project-thread-9hklro, not the Claim's claude/issue-30478-service-desk-card; the seat was told before the first push so it can amend the Claim's Branch line",
      "file name service_desk.json, not the body's service-desk.json (snake_case id = basename, landing note 6665997189)",
      "PR carries no assignee and no review request (os-dev rule 2; the session context's assign/review ask is left to the seat at hand-over, and the order forbids MCP writes)",
      "PR body footer is the AGENTS.md session-URL form, not the harness's line",
      "sla_breached is null on unresolved tickets (breach judged at resolution), so the 3 open escalated tickets are not counted in breaches_by_customer_tier",
      "objectstack-ai/templates is outside this session's repo scope: domain designed from the card text",
      "seed generated by a scratch script kept out of the PR; its rule is in the card's $comment",
      "the worker restarted during the first gate pass (stopped at 46/50); every gate was re-run on the final head"
     ],
     "mcp_calls": "6 — reads only: issue_read get #30478, issue_read get_comments #30478, issue_read get_comments #30476, issue_read get_labels #30699 (failed: not an issue), pull_request_read get_check_runs #30699, pull_request_read get #30699",
     "api_writes": {
      "count": 2,
      "endpoints": [
       "relay pr_create: POST /repos/objectstack-ai/objectstack/pulls + POST /repos/objectstack-ai/objectstack/issues/30699/labels (run 42123399274, read-back identical 6618 bytes)",
       "post-stamped: POST /repos/objectstack-ai/objectstack/issues/30478/comments (this comment)"
      ]
     },
     "security_findings": "none",
     "out_of_scope_findings": [
      "carrier: seat · noted, not filed · the schema gaps the travel_expense report named still hold: no expect key for a flow or automation, nor for a report distinct from a dashboard"
     ]
    }
  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#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Landed · PR #30699 merged as bfb6e15238 · 2026-11-05T23:28Z. The card closed through Fixes, and this stroke removes pm:dispatched. ACCEPT 6671799724.

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