Repository navigation
QA run · approvals.approver-resolution-matrix (1/1) · fb82f9b1 · 2026-10-16 · 1 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #23997
Description
Run record for the re-run #23950 asks for, after its six stale clauses were re-pointed. Runner: an os-dev subagent dispatched by the domain:devx seat 2 PM (session session_016PVjjuVPte5XEJvaQx1E4t). Protocol: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md. Executed sequentially (no subagent tool in this runner).
Environment fingerprint
- framework:
fb82f9b180bcc6af04ce8d36153fd52d2eb6845c, the tip of branchclaude/issue-23950-checklist-stale-clausesat run time. Its product tree isorigin/main022c6e799; the branch addsdocs/qa/platform-checklist/areas/*.jsononly. Built withpnpm install --frozen-lockfile && pnpm build(75/75 tasks green). .objectui-sha:daeb77fc84dd824e74c95b87cdede85afdb248e7(API-only item).- boot:
OS_PORT=47312 objectstack dev --ui --seed-admin -p 47312 -d file:(run dir)/appr/data.dbfromexamples/app-showcase. - identities: the dev admin, who owns the organization; Ada Auditor (
usr_showcase_auditor_demo) and Mei Phone (usr_showcase_phone_demo) from the seeded demo personas. - directory rows, written through the doors the revised fixtures name:
POST /api/v1/auth/admin/set-user-manager(admin to Mei) 200;POST /api/v1/auth/organization/create-team200, thenadd-team-memberfor Mei and Ada, 200 each (sys_team_member reads back both);POST /api/v1/data/sys_business_unit_memberfor Mei inbu_field_opsand Ada in its descendantbu_west_coast, 201 each. The controls for the doors the fixtures retired: data-APIPATCH sys_user.manager_idanswers 403 (manager_idnot editable via the data API, ADR-0092), and data-APIPOST sys_teamanswers 405 OBJECT_API_METHOD_NOT_ALLOWED. - flows: one scratch active autolaunched flow per leg,
qa_appr_LEG, triggered by ashowcase_field_zoocreate whose name startsqa_LEG_. Requests are matched by record id ANDprocess_nameflow:qa_appr_LEG. - timestamps: 2026-10-16, 16:34Z to 16:39Z.
Scope
Selector approvals.approver-resolution-matrix resolves to 1 runnable item: approvals.approver-resolution-matrix at revision 3, P1, surface api. The item text was read at branch head c4bf2ba4e. No pin is declared. The supporting suite pnpm --filter @objectstack/plugin-approvals exec vitest run --maxWorkers=2 src/admin-rescue-named-slate.integration.test.ts passed 11 of 11.
Who the organization's administrators are: of the organization's three sys_member rows (admin owner, Ada member, Mei member), only the admin's resolved permission sets hold an organization-admin grant (organization_admin_no_bypass, read via GET /api/v1/security/explain?userId=…). So the administrators' slate is exactly the admin.
Per-clause verdicts
| item | # | clause (short) | verdict | evidence |
|---|---|---|---|---|
| approvals.approver-resolution-matrix | 0 | each type resolves the slate it declares | pass | pending_approvers: user Ada → [Ada]; field f_users = [Ada, Mei] → [Ada, Mei]; manager → [Mei], the submitter's manager; team → [Ada, Mei]; department bu_field_ops → [Ada, Mei]; org_membership_level owner → [admin]; position manager → [admin], the position's only holder; expression current.created_by → [admin]. Every request is pending |
| approvals.approver-resolution-matrix | 1 | department = unit + every active descendant | pass | parent bu_field_ops slate [Ada, Mei], where Ada is a member only of the descendant bu_west_coast; after PATCH sys_business_unit/bu_west_coast {active: false} a re-trigger opens on [Mei]; the unit was re-activated afterwards |
| approvals.approver-resolution-matrix | 2 | multi-value field fans out per id | pass | two entries [usr_showcase_auditor_demo, usr_showcase_phone_demo], never one comma-joined literal; __resolvedFrom {"field:f_users": [both ids]} |
| approvals.approver-resolution-matrix | 3 | deprecated role warns and resolves like org_membership_level | pass | WARN [approvals] approver type 'role' is deprecated (ADR-0090 D3) — author 'org_membership_level' instead; role owner slate [admin] = org_membership_level owner slate [admin] on the same org |
| approvals.approver-resolution-matrix | 4 | empty-slate fork per policy; admin_rescue opens on the administrators | pass | admin_rescue (key absent, and declared): pending, pending_approvers [admin], with no position:qa_nobody entry; __resolvedFrom {"admin_rescue:abandoned": ["position:qa_nobody"], "admin_rescue:reason": "position 'qa_nobody' has no holder"}; the actions carry one comment with null actor, Routed to this organization's administrators because the approver slate named no one: position 'qa_nobody' has no holder.; WARN … resolved to no concrete approver (position 'qa_nobody' has no holder) — opening on this organization's administrators per onEmptyApprovers: 'admin_rescue'. …. fail: no request from the flow, run failed, NO_APPROVERS: approval node 'review' … its onEmptyApprovers policy is 'fail'. auto_approve: no request from the flow, run completed down the approve edge (an update_record there wrote approve edge: decision=approve autoApproved=true, read back from review.decision / review.autoApproved), WARN … auto-approving per onEmptyApprovers: 'auto_approve' (no request opened). fallback to Mei: pending [Mei], no literal slot, WARN … opening on the declared fallbackApprovers per onEmptyApprovers: 'fallback'. fallback to nobody: WARN … AND its declared fallbackApprovers resolved to nobody either — falling back to admin_rescue, request on [admin] with reason …; the declared fallbackApprovers resolved to no one either |
| approvals.approver-resolution-matrix | 5 | queue: dead slot, loud, never a fake approval | pass | WARN [approvals] approver type 'queue' is not implemented — the slot resolves to nobody, …; request pending, pending_approvers [admin] with no queue:support entry; __resolvedFrom {"admin_rescue:abandoned": ["queue:support"], "admin_rescue:reason": "queue 'support' resolved to no one"}; the routed-to-administrators comment is on its actions |
Each graph expansion to nobody (position:qa_nobody, position:qa_nobody2) carried the … expanded to nobody — the slot names no one … warn that names its type and value.
Derived item verdict
approvals.approver-resolution-matrix r3: pass (6 of 6 clauses).
Fixture note: the stock showcase flow showcase_approver_bindings is status: 'draft' and triggers on showcase_field_zoo record-after-update. Draft flows still fire their triggers (the automation plugin says so at boot), so the auto_approve leg's approve-edge update_record fired it. It opened its own admin_rescue request (flow:showcase_approver_bindings, node by_user) on the same record. Matching requests by process_name keeps it out of every verdict above. The flow's docblock says draft keeps it out of the runtime. That defect is handed to the dispatching seat for its own card.
Timing: about 5 minutes of legs, on the build shared across this re-run's five records.
Checklist-accuracy findings, if any, close out on the wave anchor #23878.
Activity
objectstack-fleet commentedon Oct 17, 2026
Close-out (
domain:devxseat 2): every clause PASS; nothing to extract. The re-pointed item landed with #24000 (e18b23fac5), Fixes #23950.Generated by Claude Code