Repository navigation
docs(qa): re-point the half-A platform-checklist items that described an older product - #24118
Conversation
…red product Revises capability-declaration-lifecycle, record-share-grant-revoke, crud-permission-matrix, sharing-rules-widen, write-path-guards, readonly-package-locks-studio, fls-mask-and-strip, audit-log-browser, share-link-landing-page, share-link-capability-tokens, sharing-rule-authoring-ui, public-form-intake and activation-write-operator-gate against main c91af8e, each with a bumped revision and a history row. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…ist items Each revised item carries a bumped revision and a history row naming the measurement it was re-pointed to on main c91af8e. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…the persona sets attach-requires-parent-edit, sys-file-status-pipeline, upload-session-abort and field-accept-maxsize-server-enforced re-pointed to their measured answers on main c91af8e; the qa-scratch-authz recipe's step 6 now carries the three permission-set payloads it needs. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…order the owner-email anchor legs approvals: record-page-decisions routes to /record/:id with a non-override persona; pending-count-surfaces drops the stale #7344 gap and seeds a non-admin member through a runtime user-routed flow. automation: the scheduled-work opt-in is a fixture, the status walks pass through in_review, the always-fails recipe declares its errorMessage, and the connector premise guard reads the exported port. access-security: platform-owner-email-anchor runs the entitled leg before the malformed list so the sibling check discriminates. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…eg, pinyin roster and clone reachability download-authz-both-sides drives the stale panel after a revoke as persona A, since persona B never reaches the panel. record-view-read-audit boots at info, reads an object the member can read, and carries a scripted scratch-copy recipe for the configured half. pinyin-flag-both-sides places 'wf' on the contact and scores the one-plugin roster difference. packaged-flow-clone-contract asserts the org-scope Studio rail lists the package-less clone. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…etired-def doors skill-instructions-mcp-prompts names what makes a source edit live under os dev and the runtime PUT route; mcp-stdio-fail-closed records the os start Origin requirement for cookie-carrying sign-ins; retired-def-refusal samples defs by carrier and drives the doors they actually had. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…checklist items hook-body-extraction-gates asserts the surfaced default-path warnings; build-own-contract places the undeclared key at a strip-mode site; dev-automigrate-policy stages one drift per category on a named, mapped datasource; dev-boot-contract names the mapping shape; and migrate-duplicates-inventory uses the current overlay index keys. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
…t items doctor-health-report says the staged config must load and names the well-formed orphan shape; datasource-introspect-codegen says the scratch namespace must match the draft's prefix; scaffold-console-first-paint names the port lever and whose console the scaffold serves; and scaffold-first-run scores the 18-line skills install against the installed @objectstack/skills catalog. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
… build-clause re-run Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
席位核对 · ACCEPT · PR #24118 (draft, head
|
Part of #24036
Clause-②: no
Half A of the ledger card: the stale items in eight area files under
docs/qa/platform-checklist/areas/. Those files areaccess-security,ai,search,api-backend,approvals,attachments-storage,automationandcli. Half B owns the other eight files and is a separate PR. This PR does not close the card, which stays open for half B.Each revised item gets the following:
revision;historyrow naming platform-checklist: revise the items the #23878 full run and the #23879 since:v18 run found stale (knownGaps, steps, fixtures, oracles, source anchors across 15 areas; no clause red) — ledger follow-up #24036 that carries the reading;node scripts/check-platform-checklist.mjs.Where a revision changed a fixture, a step's request or an oracle, the item was re-run once against a real app built from this tree (
checklist-test§3). That means frameworkc91af8ed6with the console at objectuif8267df93aba. The re-runs are recorded in oneqa-runrecord per area:partialhere is the derived verdict of a scoped re-run. The clauses a revision touched were driven and passed, and the item's other clauses were skipped as outside the run. No clause failed in any record. Product code is untouched, and the only changed paths are the eight area files: +659 / -316.What changed, per item
access-security (15 items)
write-path-guardsr5:{records:[{id,data}]}updateMany);continueOnError, because the default run stops at the first failure.readonly-package-locks-studior5: step 5 says the package manifest needstypeand the scratch object needssharingModel. Re-run.crud-permission-matrixr6:objectstack devboot — seeded business units are organization-less while every session carries an active organization, so every in-scope delegated write is refused #21057 known-fail gap is removed, because [finding] The delegated-admin gate resolves an EMPTY subtree on a stockobjectstack devboot — seeded business units are organization-less while every session carries an active organization, so every in-scope delegated write is refused #21057 closed and the in-subtree create answers 201.fls-mask-and-stripr4: clause 4 scores the two budget controls the form renders.budget_remainingis a formula field and is not on the form. Re-run in the browser.sharing-rules-widenr2:sys_sharing_rulerow, becausesys_record_sharePATCH answers 405;record-share-grant-revoker5:source[1]namessharing-routes.ts#registerSharingEndpoints. Anchor only, no re-run owed.audit-log-browserr5: a fresh member gets 403 at the object gate, so the parent-record gate rests on the plugin-audit visibility pins. Re-run.public-form-intaker3:owner_idis null;/forms/:nameanswers 302 to/_console/f/:name.share-link-capability-tokensr7:Varyincludes the two share-password headers, because CORS appendsOrigin;INVALID_OR_EXPIRED;emailAllowlistis required.sharing-rule-authoring-uir3: two rules are seeded, one onshowcase_contact, and the Setup nav source is corrected. Wording only.capability-declaration-lifecycler4:sys_capabilityis retired;/actionsdomain is the surface;showcase_opsis sealed;activation-write-operator-gater3: the posture oracle is theTenancy: singlebanner line. Re-run.platform-owner-email-anchorr3: the entitled leg now precedes the malformed list, so the sibling check discriminates. Re-run on one scratch DB across five restarts.record-view-read-auditr2:OS_LOG_LEVEL=infowith a positive control;showcase_account, because a baseline member is refusedshowcase_contact;share-link-landing-pager3: the objectui pin text is updated tof8267df93aba. Wording only.ai (6 items)
mcp-validate-expressionr3: the field isestimate_hours, notest_hours. Re-run in QA run · ai (5/10) · c91af8ed · 2026-10-17 · 1 PASS / 4 PARTIAL / 0 FAIL / 0 BLOCKED / 5 NOT-RUN #24105.mcp-run-action-exposure-gater3:list_actionstakes no arguments;objectNameanswers -32602. Re-run.mcp-http-surfacer3:resume_runis in the tool list. Re-run.agent-tool-skill-metadata-roundtripr5:?mode=draftanswers 400VALIDATION_ERROR. Re-run.mcp-stdio-fail-closedr6, residual:os start, a sign-in that carries a Cookie header and no Origin answers 403MISSING_OR_NULL_ORIGIN, whileos devaccepts it;skill-instructions-mcp-promptsr2:objectstack buildor--compile) and the runtime PUT route;/metawhile the MCP projection follows the source (measured).search (2 items)
pinyin-flag-both-sidesr4:wfis the contact 王芳, not an account;global-search-skips-unreadabler2: the flag defaults ON through zh-CN, so a run must set it false. Wording only.api-backend (11 items, re-runs in #24107)
error-envelope-ledgerr4:BATCH_NOT_ATOMICneeds a top-levelatomic:false.bulk-write-contractr2: the doors are id-based, and the member has noallowDelete.package-rest-lifecycler3: scopeproject, and clause 4 scores 400VALIDATION_ERRORinstead of message text.route-ledger-live-parityr4: 18 families; thereportsfamily was retired.server-timing-admin-gatedr4: the spans are parse, db, serialize, handler and total.rest-metadata-config-contractr4: the masking fixture isshowcase_projectwithclient_liaison.aggregate-contract-matrixr2: it now usessearch:qa-contributor-bound-member.batch-transactional-discoveryr5:projectis required.enforce-or-remove-authoring-gatesr4: the strip-by-design control is an unknown key onRestServerConfig.routes.declarative-endpoint-executionr3: three endpoints;os buildreports "3 APIs".retired-def-refusalr2:manifest.loading,agent.lifecycle) or is a zero-consumer schema export, driven through its import.approvals (8 items, re-runs in #24108)
approver-resolution-matrixr4 (residual): the bindings flow shipsobsolete, and there is a runtime flow door.ooo-delegation-rerouter6: runtime flow registration on stock. Full re-run, pass.status-mirror-fieldr2: runtime flows; scoped re-run.per-group-signoffr7: a mismatchedactorIdis refused 403 "cannot act as".decision-action-matrixr5: request-info is approver-only.email-action-token-doorr3: the dead-slot leg reassigns withfrom.record-page-decisionsr2: the served route is/record/:id, and a non-override persona now covers the both-sides clause.pending-count-surfacesr2: the The Account app's Notifications entry 403s for every non-admin — no permission set grants sys_inbox_message #7344 gap is stale; member surfaces were measured with ten pending approvals.attachments-storage (5 items, re-runs in #24109)
attach-requires-parent-editr7: a non-reader outsider gets 404, a reader outsider gets 403.sys-file-status-pipeliner3: the hooked re-attach un-tombstones, and the tombstone-download pin is named.upload-session-abortr4: a bogus eTag gives 409 before the backend, sofailedis reachable only through the test seam.field-accept-maxsize-server-enforcedr2: 400ERR_FILE_CONSTRAINT; the oracle moves from log to api.download-authz-both-sidesr5:qa-scratch-authzrecipe mints three invited members and pins the three permission-set payloads.automation (10 items, re-runs in #24111)
trigger-type-matrixr4 andtime-relative-triggerr3: the scheduled legs needOS_AUTOMATION_SCHEDULED_WORK_ENABLED=1.in_reviewwith its required project:flow-node-type-matrixr6;flow-error-handlingr4;packaged-flow-subflow-disable-refusalr3;connector-dispatch-matrixr3;flow-toggle-kill-switchr3.flow-node-type-matrixalso names the self-pinging http recipe.connector-dispatch-matrix's premise guard reads the exportedOS_PORTand a completed run, because/connectorscarries nobaseUrl.trigger-status-contractr2: theqa_always_failsrecipe authors anerrorMessage.packaged-flow-disable-durabler3: the log corroboration needs--log-level info.packaged-flow-clone-contractr3:cli (9 items, re-runs in #24114)
hook-body-extraction-gatesr3: the expected-fail flipped. The default build prints "N handlers could not be lowered…",--jsoncarriesbodyExtractionWarnings, and the clause now fails if that goes silent.build-own-contractr5: the advisory key sits at a strip-mode site (a field's object-formvisibleWhen) understrict:false; a key on a field is a hard refusal.dev-automigrate-policyr2:defaultis refused;storage.notNull;relax_not_nullis needs_confirm;os migrate planas the pending oracle (see below).dev-boot-contractr5: the config-declared default is a named datasource plusdatasourceMapping {default:true, datasource}.migrate-duplicates-inventoryr7: the overlay index is(type, name, package_id, bundle_member), andsys_metadatahas noorganization_id.doctor-health-reportr3: the staged config must load. A malformed view body makes doctor skip config analysis, while a well-formed orphan container loads.datasource-introspect-codegenr5: the scratch namespace must match the draft's prefix.scaffold-console-first-paintr4:OS_PORT/-p;@objectstack/console, not.objectui-sha.scaffold-first-runr5: on the 18 line, skills sync from@objectstack/skillsin node_modules and are compared against that package's catalog.Findings disproved or routed (no ledger edit)
api-backend.date-range-preset-matrix: disproved. No item text claims where a rolling window ends, andlast_7_daysends today as the item already implies.cli.doctor-health-report("orphan-view staging needsstrict:false"): only half held. A malformed body is refused by the default load, but a well-formed orphan container loads under the defaultdefineStack. The step now says which.approvals.quorum-m-of-nduplicate-slot count is product-side (approvals: the decision-progress line's "N eligible approvers" counts pending_approvers slots, so one person holding two slots is counted twice (5 eligible shown for 3 people) objectui#12781).automation.flow-runs-page-test-triggerpicker labels are product-side (console Flow Runs page: the flow picker shows only machine names — it reads the label from it.spec.label, but meta.getItems('flow') serves flattened items whose label is top-level objectui#12783).Left, with reason
automation.time-relative-trigger: only the binding leg was re-run. The due-date sweep was not driven.approvals.status-mirror-field: the returned / maxRevisions / cascade legs were not re-run.access-security.platform-owner-email-anchorclause 6: the posture-split unit pins were not run in this pass.create-objectstack@next(18.0.0-next.2).@latestis 17.7.0 and depends on no@objectstack/skills.docs/qa/platform-checklist/RUNNER.mdis outside this card's file surface but still says two stale things:baseUrlthat/automation/connectorsdoes not carry;These are reported for the seat; this PR does not touch RUNNER.md.
Acceptance notes
access-security.json(public-form-withdrawal-layers) is untouched.os migrate planon a project whose primary store is a config-declared datasource "Examined 0 managed table(s)" and printed a PARTIAL plan, while the dev boot of the same config reported three drifts in that file. The report carries the card draft.GET /api/v1/data/sys_activityanswers 403. The report carries the card draft.Gates (local subset, at
364c08264)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 13 commands. Each one ran and exited 0, with the exit code captured before any pipe:check-ci-filter-parity,check-closing-keyword-parity(plus--self-test),check-comment-mask-corpus;check:doc-formula-expressions,check:cross-package-test-inputs,check:doc-authoring;check:driver-memory-census,check:gitlink-declared,check:nul-bytes;check:platform-checklist,check:refd-timer-probe,check:watch-hint-literal.--ranreconciliation: 13 derived, 13 run, 0 NOT-MEASURED (a derived zero).check-governed-merges --branch claude/issue-24036-ledger-a: NOT governed; 975 changed lines.skill-prompts.test.ts(12);sql-driver-unique-tenancy+sql-driver-schema-drift(38);storage-routes+tombstone-download-live-reference(57);audit-log-read-visibility(unit + integration) +read-audit(70).skip-changeset, because only the docs ledger changed.Generated by Claude Code