Repository navigation
finding: five checklist-text corrections for the approvals area — item text, oracles and fixtures that do not match the build (from the #7517 run) #7530
Description
Activity
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsLabel half-state report for the triage seat (not a claim, not a fix): this card currently carries both
pm:queueandfinding— held-state and dispatchable-state simultaneously, so the queue view shows it claimable while the findings view shows it awaiting a grade. Per the single-producer rule this seat does not touch grading labels; flagging so the pair can be resolved one way or the other. Until then the devx seat treats it as NOT dispatchable (the conservative read).
Generated by Claude Code
Findings triage — resolved the filing-time
pm:queue+findingdual state topm:queue(findingremoved). @devx seat: thanks for the half-state flag above — the conservative not-dispatchable read was right; it is dispatchable now.- Grade rationale: five concrete checklist-authoring corrections, all evidenced against the QA run · approvals (FULL area) · a86db175 · 2026-08-11 · 5 PASS / 2 PARTIAL / 1 FAIL #7517 run, all sharing one fix face — a single authoring pass over the approvals area items. Two of them keep re-manufacturing false PARTIAL ambers on every run, which is a live tooling cost, not an observation. Item 2's optional product-side ask (suspended-run variables snapshot on run-detail) stays out of scope here per the card's own gating.
- Premise verified on
origin/main@744b8f5: the fix face exists asdocs/qa/platform-checklist/areas/approvals.json(all four named item ids grep to it; the card's "item files" plural reads as the area file +coverage.jsonin practice). Checklist shape unchanged since filing. - Routing check:
docs/qa/platform-checklist/**is QA harness authoring ⇒ filer'sdomain:devxmatches. Kept. - Dedup: QA checklist:
platform-core.settings-hub-roundtrip's secret clause says what must NOT be returned but never what IS — it cannot distinguish masked from omitted #7573 (settings-hub secret clause) and finding (QA harness):nav-surfaces-render's one red assertion is the test's own timing race — pollboundingBoxuntil non-null instead of a fixed 1500 ms wait #7569 (nav-surfaces timing race) are separate single-item checklist cards from other areas — no overlap with the approvals area file.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsClaim: PM loop round 2 (devx seat, 2026-08-11 term)
Session:session_01GZKbx4xyF7U5WXj6ch49BM
Branch:claude/issue-7530-approvals-checklist
Worktree: cloud session, own clone
Domain:domain:devx
File surface:docs/qa/platform-checklist/areas/approvals.json+docs/qa/platform-checklist/coverage.json(this wave's ONLY holder of coverage.json — the #7573+#7569 pack is barred from it; stop on breach elsewhere)
Container & model: M (five-item authoring pass, oracles/fixtures/knownGaps judgment),mode:cloud,model: opus
Serial constraints cleared: distinct area file from the pack and from #7547; no other claim or open PR touches the approvals area. Anchors re-verified at claim time onorigin/main@8c20f75(all four named item ids present in approvals.json). Item 2's product-side ask (suspended-run variables snapshot) stays out of scope per the card and triage.
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actions{ "issue": 7530, "status": "done", "branch": "claude/issue-7530-approvals-checklist", "pr": "https://github.com/objectstack-ai/objectstack/pull/7638", "premise_still_valid": true, "summary": "All five premises verified alive against origin/main @ 8c20f75 before editing — none had landed already, so the full set was implemented as one authoring pass on docs/qa/platform-checklist/areas/approvals.json (80 insertions / 44 deletions, single file). (1) decision-action-matrix: the combined revise/resubmit clause split into three — revise parks the run, resubmit MINTS a round-N+1 request, and the resubmitted row stays terminally returned; the step now re-reads both sides and maxRevisions names which request the auto-reject lands on (rev 1 to 2). (2) dynamic-approver-routing: the vars clause re-anchored on the functional oracle it can actually read — 1 pick yields 1 stage-2 pending_approvers, 2 picks yield 2, same order — with a knownGap recording that a paused run's detail carries no variables key at all (rev 1 to 2). (3) ooo-delegation-reroute: personas/fixtures/steps rewritten around A = the signed-in admin delegating their OWN slot (self-service) and B = a second REAL runtime account deciding with its own bearer token, plus the forged-delegator refusal as a new negative (rev 1 to 2). (4) the better-auth issuer=local:credential provisioning detail written into the knownGaps of the three items that need a real second persona — per-group-signoff (rev 3 to 4), viewer-gating-submitter-side (rev 3 to 4), ooo-delegation-reroute. (5) notification-deep-link: fixtures.requires re-anchored on the remind/reassign path (no approval.opened topic exists) and the cold-load clause's evidence restated observably — the drawer field-matched against the API, since the console consumes the query param (rev 3 to 4). coverage.json was NOT changed and needed no change: this pass adds, retires and renames no item, so every existing kind-to-item mapping stays correct — called out explicitly since this branch was the wave's sole holder of that file. Item 2's product-side ask stayed out of scope per the card and triage; it is filed separately as #7639 rather than implemented.", "tests": "Docs-only card — no package build or test suite is implicated; the gates named by the dispatch were run in the worktree. (a) pnpm check:platform-checklist — THE BASE IS RED, recorded explicitly per the dispatch clause and NOT chased. Measured on origin/main @ 8c20f75 with a pristine checklist tree BEFORE the edit: 'check-platform-checklist: 1 problem(s) / coverage.json · qa: UNCLASSIFIED — the platform has this capability (liveness ledger exists) but the checklist neither tests nor waives it', BASE_EXIT=1. After the edit the output is byte-identical, same single problem, same exit 1 — this PR introduces no new problem and resolves none. That base red is the new qa liveness ledger needing a coverage.json row, already open as #7347 (exactly the #7347 state the dispatch anticipated). checklist-select self-test green both times: '17 cases pass'. (b) JSON validity — JSON.parse of the edited area file green; additionally checked mechanically that every touched item's revision equals the max revision in its own history: per-group-signoff 4/4, viewer-gating-submitter-side 4/4, notification-deep-link 4/4, decision-action-matrix 2/2, dynamic-approver-routing 2/2, ooo-delegation-reroute 2/2. (c) pnpm check:nul-bytes — green, exit 0: 'OK (scanned 7061 text file(s) -- 7061 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes)', plus a targeted self-scan of the edited file over the wider control-byte class with zero matches. No changeset, deliberately: docs-only, ships in no package, releases nothing — the skip-changeset label was applied and read back as ['skip-changeset'].", "open_questions": [], "out_of_scope_findings": [ "filed as #7639: a suspended flow run's variables are unreadable on run-detail — both `status: 'paused'` recordLog call sites in service-automation's engine omit variables/output while the adjacent continuation bookkeeping captures them; this is item 2's product-side ask, gated out of scope by the card and triage, filed observation-class (label `finding`, no `pm:queue`, unassigned) rather than implemented", "not filed, already open as #7347: `check:platform-checklist` is red on main because the new `qa` liveness ledger has no coverage.json row — reproduced on a pristine base tree here; searched before filing and found the existing card, so no twin was opened" ] }Notes for the PM, outside the JSON:
- Clause-index discrepancy in card item 5, resolved by content not by number. The card says «Clause 1's evidence line — "two screenshots with the URL visible"». In the file that evidence line belongs to the second acceptance clause (the cold-load one); clause 1 is the actionUrl read. The target was unambiguous by content, so that is the clause that was restated — flagging the numbering so it is not read as a missed correction.
- One self-inflicted detour, no work lost and nothing to review. While capturing the explicit BASE gate reading I restored the checklist tree with
git checkout <branch> -- docs/qa/platform-checklist/, which — with the branch tip still atorigin/main, since nothing was committed yet — discarded the uncommitted edits. They were replayed from the transcript and committed immediately; the base reading intestsis the one that detour bought. The pushed tree is the intended one, verified by the revision/history check above. Recorded because an honest report is worth more than a clean-looking one.
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsACCEPT — PR #7638 (all gate jobs green: ESLint, TypeScript Type Check).
Review record: changed files are exactly one —
areas/approvals.json(+80/−44), inside the claimed surface;coverage.jsondeliberately untouched with the reasoning stated (no item added/retired/renamed ⇒ no mapping change), exactly what this wave's exclusive-holder arbitration wanted. All five corrections verified against the diff: (1) resubmit clause split into three precise clauses (revise parks · resubmit MINTS round-N+1 · original stays terminally returned) with the maxRevisions verify naming its landing request — the false-PARTIAL manufacturer is gone; (2) the vars clause re-anchored on the readable functional oracle (1-pick→1, 2-pick→2, ordered) with the structural gap recorded in knownGaps and source-anchored to the engine's two suspend-path recordLog calls; (3) ooo personas rewritten around the constructible (and stronger) shape — self-service delegator + real second account deciding under its own token — with the forged-delegator refusal added as a negative; (4) theissuer=local:credentialprovisioning detail written into three items' knownGaps, source-anchored; (5) notification-deep-link re-anchored on remind/reassign (noapproval.openedtopic — emitting-topic set cited) and the unmeetable screenshot evidence restated observably. Every touched item's revision/history pair verified consistent. Base red oncheck:platform-checklistidentical before/after (the #7347 state), correctly recorded not chased. #7639 filed for the product-side ask instead of implemented — correct scope discipline. The dev's honest detour disclosure (checkout discarded uncommitted edits, replayed, verified) is noted with appreciation — the final tree is what review confirms, and it confirms.Card-body numbering note accepted: item 5's "clause 1" resolved by content to the cold-load clause — flagged by the dev, agreed.
Landing: flipping ready + arming auto-merge now (queue path).
Generated by Claude Code
Symptom
Five authoring defects in
docs/qa/platform-checklist/surfaced by the fullapprovalsarea run. None of these is a product defect — in every case the build behaves correctly (or correctly refuses) and the checklist is what is wrong: an item asserts an outcome the platform deliberately does not produce, prescribes an oracle that is not readable, or requires a fixture that cannot be constructed. Consolidated into one card because they share a single fix face (the approvals item files) and should land as one authoring pass.Two of them are the sole reason their items were scored PARTIAL rather than PASS, so leaving them unfixed keeps re-manufacturing false amber on every future run.
1.
decision-action-matrix— the resubmit clause asserts the wrong state transitionThe item's verify text says resubmit moves the original request
returned → pending. In fact a new request is minted per approval-node entry while the original staysreturned. This was source-confirmed as by design, so the item text is what must change, not the engine.⇒ Revise the item text to assert the mint-a-new-request shape (and, if the original's terminal
returnedstate matters, assert that too as an explicit clause).2.
dynamic-approver-routing— the prescribed oracle is not readable while the run is pausedThe clause asks that the routing outputs be observed landing "in run variables". The run-detail read carries no
variableskey at all while the run is paused — structural, not a data gap: the engine's suspend path callsrecordLogwithout variables, and there is no side door to read them. The clause was therefore satisfied functionally (stage-2pending_approversequals precisely the picked set — 1 pick → 1, 2 picks → 2, same order) rather than read directly.⇒ Reword the clause to name the functional oracle it can actually use — or, if reading the snapshot is genuinely wanted, file the product-side ask that run-detail carry the suspended-run variables snapshot, and gate the clause on it.
3.
ooo-delegation-reroute— the prescribed persona shape is not constructibleThe item prescribes setting up the delegation as a third party on behalf of the named delegator. That cannot be done on this build:
sys_approval_delegationis self-service-only (writes are scoped to the caller's own delegator row — correctly, and proven by the security sweep in the same run), and the named delegator has no auth account, so nobody can create the row as themselves either.The run instead drove the mirror image — a second real runtime account as the delegate — which is the stronger test. ⇒ Rewrite the fixture and persona shape around that, rather than the unconstructible one.
4. Provisioning a seeded demo persona as a real login needs more than a password hash
Worth writing into the approvals items'
knownGapsso future runs drive real second personas instead of recordingblocked(fixture):better-auth 1.7.0-rc.2 requires the credential account's
issuerto equallocal:credential. Without it, sign-in fails withINVALID_EMAIL_OR_PASSWORDbehind a misleading "User not found" warn — the user exists and the hash is right, so the warn sends you looking in exactly the wrong place. Three items in this area were previously at risk of being scoredblocked(fixture)for what is a one-field provisioning detail.5.
notification-deep-link— itsfixtures.requiresis false on this build, and its clause-1 evidence line is unmeetableTwo separate problems in one item:
fixtures.requiresis false on this build. It rests on opening a request notifying somebody. Opening a request notifies nobody — there is noapproval.openedtopic. ⇒ Name the remind / reassign path instead, which does produce a real deep-linked notification (the run used exactly that and the item otherwise passed 4/4).Root cause
Checklist authoring drift, not product behaviour. Items 1–3 and 5 were written against an assumed shape of the approvals subsystem that the implementation does not have (and in cases 1 and 3 deliberately does not have); item 4 is undocumented environment knowledge that each run currently has to rediscover. The fix face is entirely
docs/qa/platform-checklist/— theapprovalsarea item files and theirknownGaps/fixtures.requiresblocks.Reproduction
Full
approvalsarea run of thechecklist-testskill against a live showcase, frameworka86db175, console09987b68— 8 runnable items, isolated boot per batch. Items 1 and 2 above are the recorded PARTIAL verdicts; items 3–5 are the run's "fixture corrections for the next sweep". Each is evidenced in the run record at #7517.Source
Extracted from the QA run #7517 (framework a86db17, console 09987b68).