You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
qa(checklist): approvals — a provisioning recipe for an organization-less approval request (unblocks decision-action-matrix A9) #26621
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.
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.
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
{
"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)."
}
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.
Activity
objectstack-fleet commentedon Oct 27, 2026
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.
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
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 6 · 2026-10-27T14:53Z
Session:
session_01JQwxbWX1z1UjcHWZ9v2gPD(card threadcmsg_01U5RdnAAmkSQmZbqh6FtqZ8BZWLVmF49pt7EtrY1njbAP, dispatched by seat sessionsession_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-26621Domain:
domain:devxSeat:
domain:devx#1File surface:
docs/qa/platform-checklist/areas/approvals.json(one area-levelfixturesrecipe plusapprovals.decision-action-matrixA9:fixtures.provisioning.use,knownGaps,revision,history), andpackages/qa/**only if the recipe needs a helper. ⛔ No product change; a missing door is its own product card with A9 leftblocked(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: highClause-②: 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.jsonandpackages/qa/dogfood/test(merge origin/main before each push); sibling card threads #26571, #26572, #26573 and #26621 each edit their ownareas/<area>.json; no other devx seat is seatedGenerated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
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
objectstack-fleet commentedon Oct 27, 2026
ACCEPT → PR #26789 comment 6446729521
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed: PR #26789 merged as
83c4bd29f7· 2026-10-27T16:30ZThe
qa-cross-org-requestrecipe is onorigin/maininareas/approvals.json, andapprovals.decision-action-matrixacceptance[9] is scorable on it (revision 10). ACCEPT → PR #26789 comment 6446729521. Follow-up filed from this card: #26791.Generated by Claude Code