Skip to content

docs(qa-checklist): two items' knownGaps prose still says the validator does not resolve provisioning.use — it now does #10809

Description

@claude

Follow-on from the gap-1 work on #10593 (the provisioning.use resolve check). Filed unassigned; recording the drift, not claiming the work.

What is now false

Two checklist items carry knownGaps prose stating that the validator does not resolve provisioning.use in either direction. As of the gap-1 check that is no longer true — a same-area use is resolved, and a cross-area one fails.

file item the stale clause
docs/qa/platform-checklist/areas/records-forms.json records-forms.crud-roundtrip "provisioning.use must name a key in this area's own fixtures block, README.md; unresolved by the validator either way, deferred at #7716 / tracked #7720"
docs/qa/platform-checklist/areas/search.json search.rls-both-personas "provisioning.use must name a key in the item's OWN area fixtures block (README.md), and the validator does not resolve it either way (deferred at #7716, tracked #7720)"

The first half of each sentence — the mechanism is area-scoped — stays true and is now load-bearing. It is the "either way" half that inverted.

Why it matters more than a stale footnote

It reads as permission. A future author following that prose is told the validator will not mind if they point use at the other area's recipe key — and that spelling now fails check:platform-checklist, naming the item. The prose invites exactly the edit the gate rejects.

Why it was not folded into the gap-1 PR

Editing an item's knownGaps is a semantic edit: it needs a revision bump plus a history entry per docs/qa/platform-checklist/README.md, and the revision is what run records pin their verdicts to. Two items across two area files, each re-pinning its run history, is not a rider on a gate-tooling PR — and the dispatch for #10593 fenced area-file reshaping out of scope.

Note on sequencing

Both sentences will be rewritten again by whatever answers gap 2 of #10593 (cross-area recipe reuse: a qualified use, a shared areas/_fixtures.json, or a ruling that recipes stay area-local). Doing this correction after that decision costs one edit instead of two. If gap 2 stays undecided for a while, do it standalone — a false statement in the ledger should not wait on a convention.


Generated by Claude Code

Activity

  1. huangyiirene commented on Aug 21, 2026

    @huangyiirene
    Collaborator

    Triage: pm:queue + documentation, type Task (checklist area files → devx). Sequencing note for the devx seat, from the card's own analysis: if #10593's gap-2 ruling (cross-area recipe reuse) is imminent, dispatch this after it to pay one edit instead of two; if that decision lingers, dispatch standalone — the "unresolved by the validator either way" clause is actively false today and reads as permission for an edit the gate now rejects. Both touched items owe a revision bump + history entry per the checklist README (enforced by check:platform-checklist).


    Generated by Claude Code

  2. claude commented on Aug 21, 2026

    @claude
    ContributorAuthor

    Claim: /pm-dispatch domain:devx execution seat.
    Session: session_01DdCnBGcHeufjrq7drTD3wt · Branch: claude/issue-10809-knowngaps-provisioning-prose · Worktree: objectstack-issue-10809
    Container & model: S, mode:subagent, model: opus
    File surface: docs/qa/platform-checklist/areas/records-forms.json and the sibling item the card names.

    Sequencing question — answered, so you do not have to wait

    Triage said: dispatch after #10593's gap-2 ruling if that ruling is imminent, otherwise standalone. It is not imminent — gap 2 has been with the maintainer for hours with no movement, and it is a convention decision with no deadline.

    ⇒ Dispatch standalone. The deciding reason is the card's own: the clause "unresolved by the validator either way" is actively false today, and it reads as permission for an edit the gate now rejects. A stale permission is worse than a stale fact.

    Standing constraints

    • ⛔ Governed, human-merge-only: docs/adr/**, .claude/**, skills/**, AGENTS.md, CLAUDE.md — propose wording in the report.
    • ⛔ Never edit content/docs/releases/**. ⛔ Never git stash — refs/stash is shared by every worktree of the repo.
    • ⚠️ A pipe swallows the exit code. Capture as cmd > log 2>&1; ec=$?.
    • ⚠️ ⭐ [finding] pnpm --filter <typo> exits 0 with "No projects matched the filters" — a whole verification round can be fictitious and read as green #10853: pnpm --filter <name> that names no package prints No projects matched the filters and EXITS 0. Verify your filter matched — a negative control (--filter @objectstack/definitely-not-a-package) is the cheap way; two agents used it successfully today.
    • ⚠️ The shared checkout at /home/user/objectstack is STALE. Measure against origin/main or your own worktree.
    • ⚠️ dispatch-gates is blind to both scripts/** gates — run check:entry-guard and check:parse-guard by hand.
    • ⚠️ Apply labels additively, never a whole-set PUT, and read back after the size labeler runs.
    • ⚠️ main has Console Pin Gate red for a known unrelated cross-repo reason (p0: main is RED — #10695 retired six spec/ui theme schemas that the PINNED objectui still imports, so Console Pin Gate cannot build the SPA #10856) — non-blocking, ⛔ not yours.
    • ⭐ State the predicted number of reddened cases before running an ablation, and treat a mismatch as a defect in your test, not noise — an agent found a vacuous self-test case that way today.

    Report back to me; I review against GitHub and land it.


    Generated by Claude Code

  3. claude commented on Aug 21, 2026

    @claude
    ContributorAuthor
    {
      "issue": 10809,
      "status": "done",
      "branch": "claude/issue-10809-knowngaps-provisioning-prose",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/10883",
      "premise_still_valid": true,
      "summary": "Both stale clauses corrected to what is true today: a same-area `provisioning.use` resolves, a cross-area one fails check:platform-checklist. Each keeps its still-true first half (the mechanism is AREA-SCOPED) and drops the dead #7716/#7720 deferral; the cross-area SPELLING is deliberately not predicted, since that is the open half of #10593 and a guess would create the next stale permission. ONE CORRECTION TO THE CARD: the sibling clause is not on item search.rls-both-personas as the card's table states -- it is on the AREA-LEVEL recipe qa-contributor-bound-member in areas/search.json. Area recipes carry no revision/history (the lifecycle check in scripts/check-platform-checklist.mjs is item-scoped, and none of the four recipes in the tree has either field), so the 'both items owe a revision bump' obligation was re-derived rather than applied literally: records-forms.crud-roundtrip 5->6 for its own knownGaps edit, and search.rls-both-personas 4->5 because it `use`s the edited recipe, making its revision the only pin a run record can hold that text against. Its own steps/clauses/fixtures/provisioning are unchanged and its history entry says so, so no run verdict is invalidated. That judgment call is the one thing worth a reviewer's eye.",
      "tests": "All gates run at final commit af2e9ee9b4 (clean tree; changeset re-derived at that commit = the same 2 paths). HAND-RUN HALVES (not CI-wired), both before and after the edit, identical verdicts: `✓ checklist-select self-test: 17 cases pass.` / `✓ check-platform-checklist --self-test: 36 assertions -- ... `fixtures.provisioning.use` resolves against its own area and fires on a dangling one.` / `check-platform-checklist: OK -- 15 areas, 205 items (205 active); ... provisioning: 4 area recipes, 6 item references resolved (self-checks: 22 trap-vocabulary + 14 provisioning-resolve assertions).` Invariants match the pre-edit baseline exactly. EDIT PROOF: every one of the 5 anchors asserted to hit exactly once before writing -- the assert caught a real hazard (`\"revision\": 5,` occurs twice in the item span, as the field AND as history entry 5) and aborted with no partial write; re-anchored on the 6-space indent. Edits then proven by LOADING THE JSON and testing fields (22 assertions incl. revision==6, last-history-revision==6, stale text absent, area-scoped half preserved, provisioning.use unchanged), not by grep. A tree-walk confirmed zero stale clauses remain in live text; the only 'either way' hits left are inside the two history/change fields I wrote, which quote the old wording on purpose. ABLATION (predicted before running: exactly 1 reddened case naming the item): reverted crud-roundtrip to revision 5 with history's last entry at 6; mutation proven on disk (target anchor 1->0, replacement +1, parsed field read back as revision=5/last-history=6) -- gate exited 1 with exactly 1 error line: `✗ records-forms.json · records-forms.crud-roundtrip: \"revision\" (5) must equal the last history entry's revision (6) -- a semantic edit bumps both`. Matched the prediction. My parenthetical guesses at how many OTHER items carry revision 5 were mis-stated arithmetic on my part (line 11 had already become 6); the load-bearing counts were correct. RESTORE LEG run and proven: byte-identical to the commit (`git diff --quiet` clean) and all three halves green again. No build/dist is involved -- this validator reads the JSON from the worktree at runtime. DERIVED GATES (scripts/pm/dispatch-gates.mjs, no paths passed, 2 paths from merge-base 03d0dec47): `✓ doc authoring guard: 389 files clean -- no bare metadata literals.` and `✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1444 TS blocks judged clean by @objectstack/formula.` (this one first failed ERR_MODULE_NOT_FOUND because I skipped pnpm install in the new worktree, then needed `pnpm --filter '@objectstack/lint^...' build` -- both run through scripts/pm/os-verify-lock.sh, VERDICT command-exit 0, held 6s and 133s). HAND-RUN scripts/** pair the claim comment flagged dispatch-gates is blind to: `✓ check:entry-guard: 129 scripts/ file(s)` and `✓ check:parse-guard: 128 scripts/ file(s)`, plus `check-nul-bytes: OK (scanned 6295 text file(s); no raw ASCII control bytes)`. #10853 negative control run: `--filter @objectstack/definitely-not-a-package` printed `No projects matched the filters` and EXITED 0, while my real filter echoed `@objectstack/lint@17.1.0` + the script name, so the match is confirmed rather than assumed. CI at report time (single non-blocking snapshot, no polling): Check Changeset SUCCESS (skip-changeset applied), duplicate-claim guards SUCCESS, Console Pin Gate skipped; Lint & Repo Gates and the four Type Check jobs still in_progress -- per the dispatch, CI convergence is the PM's to review.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #10885 (finding + tooling + domain:devx, unassigned, no pm:queue): area-level fixtures recipes carry no revision/history, so a semantic edit to a recipe's executable sequence silently re-validates the run records of all 6 items that consume one -- the exact failure the item-level revision mechanism exists to prevent, reachable through a door it does not cover. Hit directly here: there was no recipe revision to bump, which is why the consuming item had to be re-pinned instead. Adjacent to #10593 rather than inside it (that card is about the reference SPELLING; this is about versioning recipe CONTENT), and noted there that a shared _fixtures.json answer to gap 2 would change its shape."
      ]
    }

    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

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions