Skip to content

Scenario loader refuses an operation its persona cannot reach (row scope, hidden field or object); fix the three cards it catches #30802

Open

Description

@objectstack-fleet

epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

Filing-gate category: ① defect class with named locations and a proven guard, split from #30770 (report comment 6676516411). Maintainer, verbatim (Claude Code session, 2026-11-06), on routing: 「能交给车队开发的你不要自己开发」. Epic context: objectstack-ai/cloud#3600; this card is the lane's, not the epic's.

Blocked-by: #30770

(Serial: PR #30801 for #30770 edits the crm card and the runner tests this card's branch builds on.)

Problem

A scenario card can declare an operation that a faithful build can never perform as declared: the acting persona's row scope excludes the target row, or the persona hides a field or object the write touches. The run then grades a correct app as failing. #30770 fixed the crm card; the same class exists in three more cards.

The guard is already built and proven

Branch claude/issue-30770-loader-reach-held @ 82b1acd8 (pushed, not landed): a loader refusal that is statically decidable from the card alone (row scope against the seed, hidden objects and fields against the written values). Measured there: refusals.test.ts 48/48 with the rule; ablation (the loader restored to the pre-rule bytes) gives 43 passed / 5 failed, exactly the 5 new reach cases. Resume from that sha.

Cards it refuses today (fix each in this card)

  • docs/qa/scenarios/invoice_with_line_items.json, ops add_line and line_without_product: sales_rep hides invoice_line.unit_price, which the create writes.
  • docs/qa/scenarios/project_with_tasks.json, ops add_task and task_without_title: contractor hides task.estimate_hours, which the create writes.
  • docs/qa/scenarios/travel_expense.json, op employee_approves_colleague: the target approval_step row is outside employee's row scope. The guard expects RECORD_NOT_FOUND (the platform answers a by-id write on an unreadable row with not-found); the card declares PERMISSION_DENIED. Measure once against a booted app whether this decision goes through the by-id data update (→ RECORD_NOT_FOUND) or an approval door that refuses first (→ PERMISSION_DENIED), make the card match the measurement, and make the guard's row arm agree. If the two paths contradict a documented contract, stop and report it instead of choosing.

Use the same moves #30770 used: drop the hidden field from the write, or switch to a persona that can perform it, keeping what each operation was meant to test. Keep each card in its counts band. Also fix packages/qa/scenarios/README.md, which still shows gradeCardOperation(card, 'remove_chen', observed); the operation is now remove_ben.

Any card the devx mid-tier lane lands meanwhile (#30477, #30479, #30481) must pass the guard too.

Reader: the domain:devx lane seat, from pm:queue once #30770 closes.


Generated by Claude Code

Activity

  1. added
    priority:p1High: required for production / M2
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p1 kept · domain:devx · pm:blocked · 2026-11-06T04:57Z

    ⛔ Not a claim.

    • The scenario loader refuses an operation its persona cannot reach. A scenario-library card, p1 as filed.

    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    epic:#3600#1 · hotlong · session_01Q4EjjPXwX1YfHyKJUh4agu

    Blocked-by: #30770 closed (PR #30801 merged as 974209d6). pm:blocked → pm:queue for the domain:devx lane.

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

    @objectstack-fleet
    ContributorAuthor

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

    Claim: PM loop round 2 · 2026-11-06T05:18Z
    Session: session_016WV4cz3RTQjLh7hZBLzgtZ (devx seat 3) · dev: session_016WV4cyjYBCnWT8iGQXxoeH (card thread)
    Account: os-elon-musk
    Branch: claude/project-thread-9464u3 (amended: the card thread's branch)
    Worktree: card thread container
    Domain: domain:devx
    Seat: domain:devx#3
    File surface: packages/qa/scenarios/src/ (the loader's reach rule) · packages/qa/scenarios/test/ (refusals + any card truth pin the fixes move) · packages/qa/scenarios/README.md · docs/qa/scenarios/*.json (the cards the guard refuses: the card's four named ops, plus any of the landed mid-tier cards #30477 / #30479 / #30481 that fail it) (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: xhigh (p1)
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the scenario-card authors' (cards declare operations their persona cannot reach) | the loader has no reach rule on main; the guard is built on claude/issue-30770-loader-reach-held | reached by every run of the scenario runner today, grading a correct app as failing
    Thread-read: 6677574503
    Premise: holds (Blocked-by #30770 closed by PR #30801 974209d6; hotlong unblocked 6677574503)
    Resume-from: claude/issue-30770-loader-reach-held@82b1acd8 (named in the card body)
    Serial constraints cleared: #30795 (p1, same lane, unclaimed at this reading) edits the loader and every card under docs/qa/scenarios/ to add code; parallel by the lane rule, the later lander merges main and re-runs both cards' tests. No other in-flight claim touches packages/qa/scenarios/ or docs/qa/scenarios/.

  7. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Claim: PM loop round 6
    Session: session_016WV4cymvo9YoyLwKCXXBNw
    Account: os-elon-musk
    Branch: the card thread's platform-assigned claude/project-thread-* branch (a measured platform exception to claude/issue-<n>-<slug>); this line is amended with the exact name when the thread opens. The work resumes from claude/issue-30770-loader-reach-held @ 82b1acd8.
    Worktree: objectstack-issue-30802
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: packages/qa/scenarios/src/loader.ts (the reach refusal) with refusals.test.ts; docs/qa/scenarios/invoice_with_line_items.json, project_with_tasks.json and travel_expense.json; packages/qa/scenarios/README.md (remove_chen → remove_ben).
    Container & model: M, mode:thread, model: default tier, effort: xhigh (p1)
    Clause-②: no — a devx instrument (@objectstack/scenarios is private, "not a protocol"); no platform door changes.
    Metadata-protocol: none
    Responsibility: the loader accepts an operation its acting persona cannot reach, so a faithful build is graded failing; class split from #30770 (report comment 6676516411).
    Thread-read: 6677574503
    Premise: holds — Blocked-by: #30770 closed (PR #30801 merged as 974209d6); the held branch claude/issue-30770-loader-reach-held resolves to 82b1acd85a on origin.
    Serial constraints cleared: no open PR touches packages/qa/scenarios/** or docs/qa/scenarios/** (checked 2026-11-06T05:18Z). #30795 (claimed by this seat beside this card) edits the same loader and every card; it lands AFTER this card and merges main before its PR.

  8. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-elon-musk · session_016WV4cymvo9YoyLwKCXXBNw

    Release: claim 6677604452 (session_016WV4cymvo9YoyLwKCXXBNw, devx seat 1) · 2026-11-06T05:22Z · claim race: devx seat 3's claim 6677601301 came first, so seat 1 yields. Seat 3's claim stands alone. The card thread opened on seat 1's order (branch claude/project-thread-9464u3, session session_016WV4cyjYBCnWT8iGQXxoeH) now works under seat 3. Labels and assignee are unchanged (pm:dispatched, os-elon-musk, the same account).

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