Skip to content

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

@huangyiirene

Symptom

Five authoring defects in docs/qa/platform-checklist/ surfaced by the full approvals area 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 transition

The 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 stays returned. 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 returned state matters, assert that too as an explicit clause).

2. dynamic-approver-routing — the prescribed oracle is not readable while the run is paused

The clause asks that the routing outputs be observed landing "in run variables". The run-detail read carries no variables key at all while the run is paused — structural, not a data gap: the engine's suspend path calls recordLog without variables, and there is no side door to read them. The clause was therefore satisfied functionally (stage-2 pending_approvers equals 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 constructible

The 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_delegation is 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' knownGaps so future runs drive real second personas instead of recording blocked(fixture):

better-auth 1.7.0-rc.2 requires the credential account's issuer to equal local:credential. Without it, sign-in fails with INVALID_EMAIL_OR_PASSWORD behind 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 scored blocked(fixture) for what is a one-field provisioning detail.

5. notification-deep-link — its fixtures.requires is false on this build, and its clause-1 evidence line is unmeetable

Two separate problems in one item:

  • fixtures.requires is false on this build. It rests on opening a request notifying somebody. Opening a request notifies nobody — there is no approval.opened topic. ⇒ 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).
  • Clause 1's evidence line — "two screenshots with the URL visible" — cannot be met literally, because the console consumes the query param: by the time the drawer is open and screenshottable, the URL no longer shows it. ⇒ Restate the evidence requirement in terms of something observable (the drawer resolving to the right request, field-matched against the API — which is what was actually captured).

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/ — the approvals area item files and their knownGaps / fixtures.requires blocks.

Reproduction

Full approvals area run of the checklist-test skill against a live showcase, framework a86db175, console 09987b68 — 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).

Activity

  1. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Label half-state report for the triage seat (not a claim, not a fix): this card currently carries both pm:queue and finding — 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

  2. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Findings triage — resolved the filing-time pm:queue+finding dual state to pm:queue (finding removed). @devx seat: thanks for the half-state flag above — the conservative not-dispatchable read was right; it is dispatchable now.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. self-assigned this
    on Aug 11, 2026
  4. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: 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 on origin/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

  5. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor
    {
      "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 at origin/main, since nothing was committed yet — discarded the uncommitted edits. They were replayed from the transcript and committed immediately; the base reading in tests is 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

  6. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT — 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.json deliberately 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) the issuer=local:credential provisioning detail written into three items' knownGaps, source-anchored; (5) notification-deep-link re-anchored on remind/reassign (no approval.opened topic — emitting-topic set cited) and the unmeetable screenshot evidence restated observably. Every touched item's revision/history pair verified consistent. Base red on check:platform-checklist identical 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions