docs(qa,spec): checklist maintenance pack — identity-auth corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention - #7785
Conversation
…h corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention Four checklist-maintenance cards, one branch. All landings are disjoint per card; `coverage.json` is untouched (owned by #7347). #7740 — areas/identity-auth.json (5 items) * org-membership-team-management: the role vocabulary was wrong. Corrected to the ADR-0108 closed set {owner, admin, delegated_admin, member}; added a closed- vocabulary clause (guest / a stack position / a PermissionSet name each refused 400 ROLE_NOT_FOUND, no row left behind). * invitation-scope-gates: the delegable-scope clause conflated two axes. DelegableScope has no invitation-role field, so it can only under-report — rewrote it onto the real shape and split the negative (over-report FAILs, under-report does not). * admin-lifecycle-operations: revoke-user-sessions now names the authed-request oracle. better-auth's no-session convention is 200-with-null-body, so the old literal 401 misdescribed a correct implementation. * teams-bu-membership: retired the "maybe nothing consumes the BU tree" knownGap (share_new_inquiries_with_field_ops ships) and replaced it with the zero-seeded- placements note that actually costs runs. * identity-import-wizard: recorded that the auto policy's temporary-fallback branch is unreachable on `objectstack dev`. Rider (triage-approved, declared cross-surface): the stale doc-comment on MemberSchema.role — and its InvitationSchema twin — in packages/spec, where the wrong four names came from. Comment + .describe() text only; the generated reference page is regenerated to match, and a patch changeset declares it. #7745 — areas/integration-system.json * email-template-render: raw-send wire keys are html/text, not bodyHtml (that is the TEMPLATE field). Corrected step + clause, added the wrong-vocabulary probe and a NOT-a-FAIL negative. * three recording notes so the next sweep does not re-derive them: sys_account 405 closes the old persona-login recipe; a metadata-API-authored flow is read-only in Studio; predicate multi:true writes are unreachable over REST by design (#3897) and need a flow node. #7753 — areas/studio-authoring.json (+ platform-core.json) * the #7637 correction (the read-only badge IS honest with OS_METADATA_WRITABLE), the publish-drafts HTTP-200 ledger note (recorded as an open question, not adjudicated), the metadata-API flow route note, the known spurious _diagnostics banner, and stale markers on the two objectui e2e refs so a runner stops scoring their failure as this repo's FAIL. #7720 — README.md * Item anatomy documents both halves of the area-level `fixtures` recipe convention (the keyed recipe block and the item-level fixtures.provisioning reference), modelled on qa-scratch-authz. Option C (teaching the validator to resolve provisioning.use) stays deliberately deferred and is named as such. `node scripts/check-platform-checklist.mjs` reports only the pre-existing `coverage.json · qa: UNCLASSIFIED` (#7347, being fixed in parallel). Fixes #7740 Fixes #7745 Fixes #7753 Fixes #7720 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013GSfhABhmzsa8uA2fZCiXU
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Four checklist-maintenance cards from four QA runs, packaged on one branch because their file surfaces are pairwise disjoint.
Fixes #7740
Fixes #7745
Fixes #7753
Fixes #7720
Itemized checklist — every item, with its landing
#7740 —
docs/qa/platform-checklist/areas/identity-auth.json(5 items)org-membership-team-management— step, acceptance clause, negative,source, rev 1→2{owner, admin, member, guest};sourcecited the staleorganization.zod.tsdoc-comment{owner, admin, delegated_admin, member}; new clause proving the list is CLOSED (guest, a stackposition, a PermissionSet name each refused 400ROLE_NOT_FOUND, no row left behind);sourcere-pointed atmembership-role.ts:116, ADR-0108 andmembership-role-vocabulary.dogfood.test.tsinvitation-scope-gates— step 8, delegable-scope clause, negative,source, rev 2→3DelegableScopehas no invitation-role field{ isTenantAdmin, scopes, placeableBusinessUnitIds, assignablePositions }(security-service.ts:92-105) and the self-scoping; invite-role gate scored from clauses 1–4; negative split — OVER-reporting FAILs, UNDER-reporting is the safe direction and must not be filedadmin-lifecycle-operations— revoke step, clause, negative,source, rev 2→3get-session's status code, expecting 401get-session's body kept as corroboration only, with the 200-with-null-body convention cited atsession-of-record.test.ts:165teams-bu-membership—fixtures.requires,knownGaps, step, clause,source, rev 1→2blocked(fixture)because maybe nothing consumes the BU treeshare_new_inquiries_with_field_opsexpands thebu_field_opssubtree, so the clause runs. Replaced by the ZERO-SEEDED-PLACEMENTS note — a fresh boot seeds the tree but zerosys_business_unit_memberrows, so make the placement and expect an empty BEFOREidentity-import-wizard—knownGaps,autoclause,source, rev 1→2auto's temporary-fallback branch is unreachable onobjectstack dev(both transports always register; NODE_ENV isdevelopment, so neither deliverability gate can be false), names the boot that would exercise it, and says score the fallback via thetemporarypolicyCross-surface rider (triage-approved on #7740, declared here as its own line item):
packages/spec/src/identity/organization.zod.ts— the staleMemberSchema.roledoc-comment at :84-87 (and the.describe()at :87 that repeats it) is where the wrong four names came from. Corrected to the ADR-0108 closed set, with thez.string()typing explained so the loose type is not re-read as evidence that the set is open.Two knock-ons, both declared rather than quiet:
InvitationSchema.role's doc-comment (:139) carried the identical'admin', 'member', 'guest'defect in the same file. Leaving it would have left the next reader the exact trap this card exists to close. Comment text only — happy to revert if the PM prefers the anchor read strictly.content/docs/references/identity/organization.mdxis generated FROM those.describe()strings, andcheck:docs(build-docs.ts --check) is a CI gate, so the two affected table rows are updated with it. This container has nonode_modules(no install has ever run here), so the regeneration was done by hand against the generator's own rendering path —build-docs.ts:427emits the description verbatim, andescapeMdxDescriptiontouches only backticks/{/</|/\, none of which appear in the new strings. Worth a second look from anyone with a built tree.#7745 —
docs/qa/platform-checklist/areas/integration-system.jsonemail-template-render— step, raw-send clause, negative,source, rev 3→4{ to, subject, bodyHtml }— refused 400 "at least one of text or html is required"{ to, subject, html | text }(SendEmailInput,email-service.ts:42-68);bodyHtml/bodyTextnamed as the TEMPLATE fields; added the wrong-vocabulary probe that pins the two apart, and a NOT-a-FAIL negative so the 400 is not filed as a defectnotify-inbox-delivery—fixtures.requires,knownGaps, rev 1→2POST /api/v1/data/sys_accountanswers 405 (managedBy better-auth,apiMethods ['get','list']— 405 before the write guard's 403,sys-account.object.ts:234-241), closing the old graft-a-credential recipe; names sign-up /admin/create-useras the supported pathsflow-connector-picker—fixtures,knownGaps, step, rev 2→3ResourceEditPageartifact-backed heuristic +flow'sallowOrgOverride:false, names the console create page as the editable path, and cross-links objectui#4308 as the polarity-reversed case that IS a defectwebhook-lifecycle—fixtures.requires,knownGaps, bulk step,source, rev 3→4multi:true) writes are unreachable over REST BY DESIGN — #3897 stripsoptions.multias a security boundary (rest-server.ts:10461-10492) — so the bulk clause needs a flowupdate_record/delete_recordnode fired through the api trigger#7753 —
docs/qa/platform-checklist/areas/studio-authoring.json(+platform-core.json)org-override-registry-gate—knownGaps,source, rev 1→2OS_METADATA_WRITABLE=permissionthe badge clears and the editor is writable (GET /metareportsoverrideSource:'env',protocol.zod.ts:208) — proven both ways, so #7637 must not be acted on as writtendraft-publish-lifecycle— step, publish-drafts clause, negative, rev 2→3data.success(the door answers 200 withsuccess:false), keeps the verified atomicity (both names 404), and logs the status-code question as an OPEN ledger item awaiting one deliberate ruling. Recorded, not adjudicated — a runner asserts current behaviour and does not file itorg-override-registry-gate—knownGaps,source(same rev bump as row 1)authoring-validation-not-persisted—knownGaps, negative, rev 1→2_diagnostics" banner on a successfully saved valid draft (designer re-validates the server's own annotation), and tells it apart from a real located-error missrecord-page-roundtrip—automated.stale, two clauseverifys,source, rev 1→2automated.refpointed at two objectui specs with no staleness markerstudio-record-page.spec.tsfills the Object control as an input when it is now arole=comboboxbutton;studio-editor.spec.tstargets a removed "Layout" heading plus a shipped page the editor correctly locks), plus the runner rule: drive by hand, do not cite their output, do not score their failure as this item's FAILplatform-core.metadata-authoring-roundtrip—automated.stale(partial), clause 3verify, rev 1→2studio-record-page.spec.tshalf only is marked stale; the dogfood pin andstudio-object-designer.spec.tsare explicitly unaffected#7720 —
docs/qa/platform-checklist/README.mdItem anatomy now documents both halves of the area-level
fixturesrecipe convention, modelled onqa-scratch-authzinareas/attachments-storage.json:fixtures.provisioning = { use, why };fixtures— one named provisioning recipe, many items, gives the recipe block's full shape (title/why/provenance/app/requires/sequence[{step, call, body, expect, source}]/teardown/knownGaps), the matching item-side reference, and the four design rules behind it (runtime-provisioned so teardown is the only cleanup; every call cites frameworkfile:line;whyis the debt marker; opting in rewritesknownGapsas CLOSED-by-recipe rather than deleting them).Option C — teaching
check-platform-checklist.mjsto resolveprovisioning.useagainst the area'sfixtureskeys — is deliberately deferred and is named as deferred in the README, with the consequence stated (a typo'duseis caught by review, not by the validator).Verification
node scripts/check-platform-checklist.mjs→ 1 problem, the pre-existingcoverage.json · qa: UNCLASSIFIEDowned by #7347 and being fixed in parallel. Zero problems attributable to this diff. Every edited item bumpedrevisionand appended ahistoryentry, as the validator's revision/history check requires.node scripts/check-empty-changeset.mjs→ clean (1 declaring changeset).node scripts/check-changeset-no-major.mjs→ clean.Notes for the PM
docs/qa/platform-checklist/coverage.jsonis untouched — thegit diff --statbelow is 1:1 with the itemized checklist above and contains nocoverage.jsonrow.skip-changeset, but thepackages/specrider genuinely changes published.describe()text, so a patch changeset for@objectstack/specis included rather than relying on the label. The gate is label-based (not path-based), so this satisfies it either way.e2e/live/studio-record-page.spec.tsande2e/live/studio-editor.spec.tsat the current surface is the objectui half of studio-authoring run notes: one correction to #7637, two staleautomated.refspecs, and three ledger/route observations #7753 item 6. Nothing in objectui was edited here; this repo only records the staleness so the refs stop costing a red run. Related: objectui#4308 (the polarity-reversed artifact-backed-heuristic defect), referenced from two notes.automated.refspecs, and three ledger/route observations #7753 item 2) is recorded as an open ledger item only.Generated by Claude Code