Skip to content

docs(qa,spec): checklist maintenance pack — identity-auth corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention - #7785

Merged
huangyiirene merged 2 commits into
mainfrom
claude/issue-7740-checklist-run-notes-pack
Aug 11, 2026
Merged

docs(qa,spec): checklist maintenance pack — identity-auth corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention#7785
huangyiirene merged 2 commits into
mainfrom
claude/issue-7740-checklist-run-notes-pack

Conversation

@huangyiirene

Copy link
Copy Markdown
Collaborator

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

#7740docs/qa/platform-checklist/areas/identity-auth.json (5 items)

# Landing Before After
1 org-membership-team-management — step, acceptance clause, negative, source, rev 1→2 role vocabulary named {owner, admin, member, guest}; source cited the stale organization.zod.ts doc-comment ADR-0108 closed set {owner, admin, delegated_admin, member}; new clause proving the list is CLOSED (guest, a stack position, a PermissionSet name each refused 400 ROLE_NOT_FOUND, no row left behind); source re-pointed at membership-role.ts:116, ADR-0108 and membership-role-vocabulary.dogfood.test.ts
2 invitation-scope-gates — step 8, delegable-scope clause, negative, source, rev 2→3 "the returned role set contains member but NOT admin" — unassertable: DelegableScope has no invitation-role field clause asserts the real shape { 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 filed
3 admin-lifecycle-operations — revoke step, clause, negative, source, rev 2→3 oracle was get-session's status code, expecting 401 oracle is a PROTECTED authed request (2xx before the revoke, refused on the very next call); get-session's body kept as corroboration only, with the 200-with-null-body convention cited at session-of-record.test.ts:165
4 teams-bu-membershipfixtures.requires, knownGaps, step, clause, source, rev 1→2 knownGap said the tree-widening clause may be blocked(fixture) because maybe nothing consumes the BU tree gap RETIRED (kept as a retired line, not deleted): share_new_inquiries_with_field_ops expands the bu_field_ops subtree, so the clause runs. Replaced by the ZERO-SEEDED-PLACEMENTS note — a fresh boot seeds the tree but zero sys_business_unit_member rows, so make the placement and expect an empty BEFORE
5 identity-import-wizardknownGaps, auto clause, source, rev 1→2 no note; a run could read the missing fallback as a defect records that auto's temporary-fallback branch is unreachable on objectstack dev (both transports always register; NODE_ENV is development, so neither deliverability gate can be false), names the boot that would exercise it, and says score the fallback via the temporary policy

Cross-surface rider (triage-approved on #7740, declared here as its own line item):
packages/spec/src/identity/organization.zod.ts — the stale MemberSchema.role doc-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 the z.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:

  • Also fixed, one line beyond the named anchor: 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.mdx is generated FROM those .describe() strings, and check:docs (build-docs.ts --check) is a CI gate, so the two affected table rows are updated with it. This container has no node_modules (no install has ever run here), so the regeneration was done by hand against the generator's own rendering path — build-docs.ts:427 emits the description verbatim, and escapeMdxDescription touches only backticks/{/</|/\, none of which appear in the new strings. Worth a second look from anyone with a built tree.

#7745docs/qa/platform-checklist/areas/integration-system.json

# Landing Before After
1 email-template-render — step, raw-send clause, negative, source, rev 3→4 raw-send body named { to, subject, bodyHtml } — refused 400 "at least one of text or html is required" wire keys corrected to { to, subject, html | text } (SendEmailInput, email-service.ts:42-68); bodyHtml/bodyText named 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 defect
2 notify-inbox-deliveryfixtures.requires, knownGaps, rev 1→2 three-persona requirement with no minting recipe records that POST /api/v1/data/sys_account answers 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-user as the supported paths
3 flow-connector-pickerfixtures, knownGaps, step, rev 2→3 no note; a metadata-API-provisioned fixture flow opens read-only and looks like a bug records the ResourceEditPage artifact-backed heuristic + flow's allowOrgOverride:false, names the console create page as the editable path, and cross-links objectui#4308 as the polarity-reversed case that IS a defect
4 webhook-lifecyclefixtures.requires, knownGaps, bulk step, source, rev 3→4 "a predicate multi-write path for the bulk variants" with no route named records that predicate (multi:true) writes are unreachable over REST BY DESIGN — #3897 strips options.multi as a security boundary (rest-server.ts:10461-10492) — so the bulk clause needs a flow update_record/delete_record node fired through the api trigger

#7753docs/qa/platform-checklist/areas/studio-authoring.json (+ platform-core.json)

# Landing Before After
1 org-override-registry-gateknownGaps, source, rev 1→2 nothing recorded; #7637's observation stood as filed records the CORRECTION to run #7637: with OS_METADATA_WRITABLE=permission the badge clears and the editor is writable (GET /meta reports overrideSource:'env', protocol.zod.ts:208) — proven both ways, so #7637 must not be acted on as written
2 draft-publish-lifecycle — step, publish-drafts clause, negative, rev 2→3 clause scored the abort off the HTTP status scores the abort off data.success (the door answers 200 with success: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 it
3 org-override-registry-gateknownGaps, source (same rev bump as row 1) the metadata-API-authored-flow route note, with the ResourceEditPage line refs and the objectui#4308 cross-link
4 authoring-validation-not-persistedknownGaps, negative, rev 1→2 records the KNOWN spurious "Unrecognized key(s): _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 miss
5 record-page-roundtripautomated.stale, two clause verifys, source, rev 1→2 automated.ref pointed at two objectui specs with no staleness marker both marked STALE-not-red with the concrete reason (studio-record-page.spec.ts fills the Object control as an input when it is now a role=combobox button; studio-editor.spec.ts targets 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 FAIL
6 platform-core.metadata-authoring-roundtripautomated.stale (partial), clause 3 verify, rev 1→2 same unmarked ref the studio-record-page.spec.ts half only is marked stale; the dogfood pin and studio-object-designer.spec.ts are explicitly unaffected

#7720docs/qa/platform-checklist/README.md

Item anatomy now documents both halves of the area-level fixtures recipe convention, modelled on qa-scratch-authz in areas/attachments-storage.json:

  • the item-anatomy block gains fixtures.provisioning = { use, why };
  • a new section, Area-level 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 framework file:line; why is the debt marker; opting in rewrites knownGaps as CLOSED-by-recipe rather than deleting them).

Option C — teaching check-platform-checklist.mjs to resolve provisioning.use against the area's fixtures keys — is deliberately deferred and is named as deferred in the README, with the consequence stated (a typo'd use is caught by review, not by the validator).

Verification

node scripts/check-platform-checklist.mjs1 problem, the pre-existing coverage.json · qa: UNCLASSIFIED owned by #7347 and being fixed in parallel. Zero problems attributable to this diff. Every edited item bumped revision and appended a history entry, 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

 .changeset/spec-membership-role-doc-comment-adr-0108.md |  27 ++
 content/docs/references/identity/organization.mdx       |   4 +-
 docs/qa/platform-checklist/README.md                    |  74 +++++-
 docs/qa/platform-checklist/areas/identity-auth.json     |  92 +++++---
 docs/qa/platform-checklist/areas/integration-system.json|  68 ++++--
 docs/qa/platform-checklist/areas/platform-core.json     |  21 +-
 docs/qa/platform-checklist/areas/studio-authoring.json  |  67 ++++--
 packages/spec/src/identity/organization.zod.ts          |  25 +-

Generated by Claude Code

…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
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 11, 2026 7:52pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@huangyiirene
huangyiirene added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit 3bb9340 Aug 11, 2026
27 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-7740-checklist-run-notes-pack branch August 11, 2026 20:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment