Skip to content

qa(checklist): approvals — a provisioning recipe for an organization-less approval request (unblocks decision-action-matrix A9) #26621

Closed

Description

@objectstack-fleet

Filing gate: ③ a maintainer-directed task — in the 18.2.0 wave-2 session (2026-10-27), on the PM's list of improvements ("补测试数据配方: write the recurring fixture gaps up as area-level provisioning recipes"), the maintainer answered, verbatim: 「补测试数据配方。立卡」.
Business reason: approvals.decision-action-matrix A9 scored blocked(fixture) in BOTH 18.2.0 waves (#25817, #26456): no stock door mints an approval request without an organization (approval-service.ts sets requestOrg = subjectOrg ?? ctxOrg; no REST submit door; no stock approval flow on a schedule, time-relative or api trigger). Every release sweep re-rediscovers the gap and leaves the clause unscored.
Reader: the lane owning docs/qa/platform-checklist/** and packages/qa/** (domain:devx). The shape to copy is the area-level fixtures recipe block in docs/qa/platform-checklist/README.md ("Area-level fixtures"), the worked instance qa-scratch-authz in areas/attachments-storage.json; items opt in with fixtures.provisioning.use.
Dedupe (open AND closed): "checklist fixture provisioning recipe blocked fixture knownGaps org-less approval request" → 29 hits; the nearest is #21851 (closed: four other recipes, landed). None covers the gaps below.

Gap

  • approvals.decision-action-matrix A9 — knownGaps[0]. Candidates the wave-2 runner refuted: a schedule-triggered approval on stock; an api-hook on an object with no organization column. Recipe candidates to try: a scratch package flow with a schedule (or api) trigger whose approval node runs under OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1; or a system-context insert path that the service itself takes.

Done when

  • The recipe is written once at the area level (a keyed block beside items), with the exact call sequence a runner replays on a stock showcase boot, and each listed item references it with fixtures.provisioning.use + why.
  • Each listed clause is re-driven once on the recipe and its verdict recorded in the item history (citing this card); the item's knownGaps line for the gap is removed or reworded.
  • node scripts/check-platform-checklist.mjs stays green (it resolves every provisioning.use and refuses an unreferenced recipe).
  • A gap that turns out to be a product limit rather than a fixture (no door exists at all) is filed as its own card and stays blocked with that card as blocked.ref.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — tests · priority:p2 · domain:devx · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T11:03Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2, maintainer-directed (wave-2 session, 「补测试数据配方。立卡」): write the provisioning recipe so the named clauses can be scored, in docs/qa/platform-checklist/** / packages/qa/**, with the item revisions bumped. domain:devx. ⛔ No product change rides this card. If a recipe needs a door the platform lacks, that is a separate product card.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6 · 2026-10-27T14:53Z
    Session: session_01JQwxbWX1z1UjcHWZ9v2gPD (card thread cmsg_01U5RdnAAmkSQmZbqh6FtqZ8BZWLVmF49pt7EtrY1njbAP, dispatched by seat session session_01JQwxbaFpnMwgpCgneKe2qS)
    Account: os-warren (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-31n7bt (the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record)
    Worktree: objectstack-issue-26621
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: docs/qa/platform-checklist/areas/approvals.json (one area-level fixtures recipe plus approvals.decision-action-matrix A9: fixtures.provisioning.use, knownGaps, revision, history), and packages/qa/** only if the recipe needs a helper. ⛔ No product change; a missing door is its own product card with A9 left blocked (stop on breach)
    Container & model: M, mode:thread (Warren's 「opus 很多,并发5」, 2026-10-27), model: default (dispatch-gates --tier: "no path-derived mandate … default opus"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — maintainer-directed filing (wave-2 session, quoted in the card body); triage 6440310719
    Thread-read: 6440310719
    Premise: holds by the paths (the card's items are read on origin/main by the thread before its first edit; its report records any item already pinned)
    Serial constraints cleared: none blocking. Draft #26337 touches docs/qa/platform-checklist/coverage.json and packages/qa/dogfood/test (merge origin/main before each push); sibling card threads #26571, #26572, #26573 and #26621 each edit their own areas/<area>.json; no other devx seat is seated


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 26621,
     "status": "done",
     "branch": "claude/project-thread-31n7bt",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/26789",
     "session": "session_01JQwxbWX1z1UjcHWZ9v2gPD",
     "premise_still_valid": false,
     "summary": "The card's premise (an org-less request is a fixture gap; a scheduled flow may mint one) is refuted: organization_id is NOT NULL on sys_approval_request / _approver / _action (ADR-0131) and an org-less system insert is stamped or refused (ADR-0131 D9). Measured on main 74db43ef: a scratch time-relative sweep over a tenancy-disabled object under OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 opened its request stamped with the Default Organization; a node:sqlite UPDATE to NULL fails the NOT NULL constraint. The clause sentence (a request invisible inside the caller's organization narrowing) is still reachable, so no product card: the new area recipe qa-cross-org-request opens a budget-approval request in a second organization on a group-posture boot and leaves the admin narrowed to the Default Organization. A9 opts in (revision 10), verify/evidence/knownGaps[0]/steps/source/history updated; re-driven once by literal REST replay on a fresh boot: 500 READ_BACK_FAILED with the recorded-write text, matching-org re-read shows approved + the approve action row. Verdict pass. Fixes #26621 used: every Done-when line judged met (see open_questions for the one reading).",
     "tests": "No code changed. Live drives on examples/app-showcase built at 74db43ef (full turbo build under os-verify-lock, VERDICT command-exit 0). Refuting legs on a single-posture boot: sweep request areq_2c748c76 organization_id = default org; three NULL UPDATEs refused 'NOT NULL constraint failed'; organization/create 403 ORGANIZATION_CREATION_DISABLED. Recipe legs: driven twice on group-posture boots (first by REST + node:sqlite reads, second literally as written, REST only): approve as the A-narrowed admin -> 500 READ_BACK_FAILED; set-active B, GET /:id -> 200 status approved; /actions -> submit, comment, approve. No ablation: no tested behaviour changed.",
     "gates": "At head 47385df4 (merge of origin/main 0f3d068c): dispatch-gates --commands derived 16; each run with exit captured before any pipe, all 16 exit 0 (check-adr-links + self-test, check-closing-keyword-parity + self-test, check-comment-mask-corpus, plan-test-core-shards self-test, lint check:doc-formula-expressions, check:ci-filter-parity, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:platform-checklist, check:refd-timer-probe, check:watch-hint-literal). --ran: 16 derived, 16 run, 0 NOT-MEASURED. check:platform-checklist verdict line: OK, 6 area recipes, 11 item references resolved, 6/6 recipes referenced, symbol anchors 995/1005 (base 990/1000; 10 on the named residual both). PR check-runs: in_progress at report time, not awaited.",
     "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
     "mcp_calls": "0",
     "api_writes": "2 — relay pr_create (fleet-write run 40533877367, PR #26789, 8076 bytes sent = stored, assignee os-warren, label skip-changeset) and this os-dev-report comment via post-stamped. Plus git push of the branch (not a REST write). No label-write, no PR body patch.",
     "open_questions": [
      {
       "question": "Done-when line 1 says the runner replays the recipe 'on a stock showcase boot'; the recipe boots the stock showcase app (no repo change) with OS_TENANCY_POSTURE=group plus the two settings that posture refuses to boot without. Does that count as stock?",
       "options": [
        "A yes, like the card's own OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 hypothesis: keep Fixes",
        "B no: the seat amends the PR body to Refs and the card stays open for a single-posture door, which does not exist"
       ],
       "recommendation": "A, because ADR-0131 leaves no single-posture state in which a request is invisible to its decider, and an environment flag was already inside the card's own hypothesis"
      }
     ],
     "out_of_scope_findings": [
      "class: a (checklist accuracy; the recipe's own step 2 not replayed, so the seat judges filing) · reach: named producer — areas/attachments-storage.json qa-scratch-authz steps 2-4 author objects qa_vault/qa_shared/qa_nofiles under package com.objectstack.qa.attachments; a package-authored object without the namespace prefix now answers 422 NAMESPACE_PREFIX ('Rename it to approvals_qa_orgless_subject (namespace = approvals)' measured on the analogous save here) · dedupe words: qa-scratch-authz NAMESPACE_PREFIX recipe rot package namespace prefix",
      "carrier: none · noted, not filed — readBackRequest docblock still calls org-less rows 'a live state'; ApprovalService.isOverrideActor null-org arm reached by no row since ADR-0131; decision-action-matrix source note for handleApprovalError still says READ_BACK_FAILED is 'deliberately unmapped' (PR Acceptance notes)"
     ],
     "body_amendments": [],
     "deviations": "Recipe measured at 74db43ef, then origin/main 0f3d068c merged before the push; the incoming approvals diff (ADR-0142 queue approvers) does not touch findRequestRow, readBackRequest or isOverrideActor, so the recipe was not re-driven on the merge head. Full workspace build held the shared lock 17m29s (pnpm dev refuses an unbuilt workspace)."
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26789 comment 6446729521


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #26789 merged as 83c4bd29f7 · 2026-10-27T16:30Z

    The qa-cross-org-request recipe is on origin/main in areas/approvals.json, and approvals.decision-action-matrix acceptance[9] is scorable on it (revision 10). ACCEPT → PR #26789 comment 6446729521. Follow-up filed from this card: #26791.


    Generated by Claude Code

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:devxpriority:p2Medium: important, M3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions