Skip to content

docs(qa): re-point the half-A platform-checklist items that described an older product - #24118

Merged
objectstack-fleet[bot] merged 11 commits into
mainfrom
claude/issue-24036-ledger-a
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 11 commits into
mainfrom
claude/issue-24036-ledger-a

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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 are access-security, ai, search, api-backend, approvals, attachments-storage, automation and cli. 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:

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 framework c91af8ed6 with the console at objectui f8267df93aba. The re-runs are recorded in one qa-run record per area:

area record judged verdicts
access-security #24104 12/35 1 pass, 11 partial
ai #24105 5/10 1 pass, 4 partial
search #24106 1/8 1 partial
api-backend #24107 11/27 11 partial
approvals #24108 8/20 1 pass, 7 partial
attachments-storage #24109 5/11 5 partial
automation #24111 10/22 10 partial
cli #24114 9/22 9 partial

partial here 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-guards r5:
  • readonly-package-locks-studio r5: step 5 says the package manifest needs type and the scratch object needs sharingModel. Re-run.
  • crud-permission-matrix r6:
  • fls-mask-and-strip r4: clause 4 scores the two budget controls the form renders. budget_remaining is a formula field and is not on the form. Re-run in the browser.
  • sharing-rules-widen r2:
    • the position variant is confounded by manager depth, so it is recorded but not scored, and the clauses run on the unit rule;
    • A13 edits the sys_sharing_rule row, because sys_record_share PATCH answers 405;
    • a manual share needs object-level read.
    • Re-run.
  • record-share-grant-revoke r5: source[1] names sharing-routes.ts#registerSharingEndpoints. Anchor only, no re-run owed.
  • audit-log-browser r5: 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-intake r3:
    • the anonymous row's owner_id is null;
    • /forms/:name answers 302 to /_console/f/:name.
    • Re-run.
  • share-link-capability-tokens r7:
    • Vary includes the two share-password headers, because CORS appends Origin;
    • an email audience gives a uniform 404 INVALID_OR_EXPIRED;
    • emailAllowlist is required.
    • Re-run.
  • sharing-rule-authoring-ui r3: two rules are seeded, one on showcase_contact, and the Setup nav source is corrected. Wording only.
  • capability-declaration-lifecycle r4:
    • sys_capability is retired;
    • the dispatcher /actions domain is the surface;
    • the regrant leg runs on a clone, because showcase_ops is sealed;
    • step 6 now says a platform-name shadow is refused at boot, while validate and build pass it.
    • Re-run, build legs included.
  • activation-write-operator-gate r3: the posture oracle is the Tenancy: single banner line. Re-run.
  • platform-owner-email-anchor r3: 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-audit r2:
    • the stock leg boots at OS_LOG_LEVEL=info with a positive control;
    • the stock leg reads showcase_account, because a baseline member is refused showcase_contact;
    • a scripted scratch-copy recipe covers the configured half.
    • Re-run on both halves.
  • share-link-landing-page r3: the objectui pin text is updated to f8267df93aba. Wording only.

ai (6 items)

  • mcp-validate-expression r3: the field is estimate_hours, not est_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-gate r3: list_actions takes no arguments; objectName answers -32602. Re-run.
  • mcp-http-surface r3: resume_run is in the tool list. Re-run.
  • agent-tool-skill-metadata-roundtrip r5: ?mode=draft answers 400 VALIDATION_ERROR. Re-run.
  • mcp-stdio-fail-closed r6, residual:
    • a fixture note: on os start, a sign-in that carries a Cookie header and no Origin answers 403 MISSING_OR_NULL_ORIGIN, while os dev accepts it;
    • cookie-less sign-in and key minting are unaffected.
    • Runner note only.
  • skill-instructions-mcp-prompts r2:
    • step 5 names what makes a source edit live (the watcher's rebuild and restart, objectstack build or --compile) and the runtime PUT route;
    • a bare restart serves the stale dist at /meta while the MCP projection follows the source (measured).
    • Re-run, pass.

search (2 items)

api-backend (11 items, re-runs in #24107)

  • error-envelope-ledger r4: BATCH_NOT_ATOMIC needs a top-level atomic:false.
  • bulk-write-contract r2: the doors are id-based, and the member has no allowDelete.
  • package-rest-lifecycle r3: scope project, and clause 4 scores 400 VALIDATION_ERROR instead of message text.
  • route-ledger-live-parity r4: 18 families; the reports family was retired.
  • server-timing-admin-gated r4: the spans are parse, db, serialize, handler and total.
  • rest-metadata-config-contract r4: the masking fixture is showcase_project with client_liaison.
  • aggregate-contract-matrix r2: it now uses search:qa-contributor-bound-member.
  • batch-transactional-discovery r5: project is required.
  • enforce-or-remove-authoring-gates r4: the strip-by-design control is an unknown key on RestServerConfig.routes.
  • declarative-endpoint-execution r3: three endpoints; os build reports "3 APIs".
  • retired-def-refusal r2:
    • steps sample defs by carrier. A def is either reached through a retired-key tombstone (manifest.loading, agent.lifecycle) or is a zero-consumer schema export, driven through its import.
    • the control is an invented stack key and an invented type.
    • No clause changed.

approvals (8 items, re-runs in #24108)

  • approver-resolution-matrix r4 (residual): the bindings flow ships obsolete, and there is a runtime flow door.
  • ooo-delegation-reroute r6: runtime flow registration on stock. Full re-run, pass.
  • status-mirror-field r2: runtime flows; scoped re-run.
  • per-group-signoff r7: a mismatched actorId is refused 403 "cannot act as".
  • decision-action-matrix r5: request-info is approver-only.
  • email-action-token-door r3: the dead-slot leg reassigns with from.
  • record-page-decisions r2: the served route is /record/:id, and a non-override persona now covers the both-sides clause.
  • pending-count-surfaces r2: 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-edit r7: a non-reader outsider gets 404, a reader outsider gets 403.
  • sys-file-status-pipeline r3: the hooked re-attach un-tombstones, and the tombstone-download pin is named.
  • upload-session-abort r4: a bogus eTag gives 409 before the backend, so failed is reachable only through the test seam.
  • field-accept-maxsize-server-enforced r2: 400 ERR_FILE_CONSTRAINT; the oracle moves from log to api.
  • download-authz-both-sides r5:
    • step 7 drives the reachable shape: persona A's open panel, A's grant revoked, then Download;
    • persona B never reaches the panel.
    • Re-run in the browser.
  • The qa-scratch-authz recipe mints three invited members and pins the three permission-set payloads.

automation (10 items, re-runs in #24111)

  • trigger-type-matrix r4 and time-relative-trigger r3: the scheduled legs need OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1.
  • These five walk a task to done through in_review with its required project:
    • flow-node-type-matrix r6;
    • flow-error-handling r4;
    • packaged-flow-subflow-disable-refusal r3;
    • connector-dispatch-matrix r3;
    • flow-toggle-kill-switch r3.
  • flow-node-type-matrix also names the self-pinging http recipe.
  • connector-dispatch-matrix's premise guard reads the exported OS_PORT and a completed run, because /connectors carries no baseUrl.
  • trigger-status-contract r2: the qa_always_fails recipe authors an errorMessage.
  • packaged-flow-disable-durable r3: the log corroboration needs --log-level info.
  • packaged-flow-clone-contract r3:

cli (9 items, re-runs in #24114)

  • hook-body-extraction-gates r3: the expected-fail flipped. The default build prints "N handlers could not be lowered…", --json carries bodyExtractionWarnings, and the clause now fails if that goes silent.
  • build-own-contract r5: the advisory key sits at a strip-mode site (a field's object-form visibleWhen) under strict:false; a key on a field is a hard refusal.
  • dev-automigrate-policy r2:
    • the datasource is named and mapped as default, because a datasource named default is refused;
    • drift is staged with storage.notNull;
    • relax_not_null is needs_confirm;
    • the safe specimen is a planted legacy unique index;
    • the schema dump replaces os migrate plan as the pending oracle (see below).
  • dev-boot-contract r5: the config-declared default is a named datasource plus datasourceMapping {default:true, datasource}.
  • migrate-duplicates-inventory r7: the overlay index is (type, name, package_id, bundle_member), and sys_metadata has no organization_id.
  • doctor-health-report r3: the staged config must load. A malformed view body makes doctor skip config analysis, while a well-formed orphan container loads.
  • datasource-introspect-codegen r5: the scratch namespace must match the draft's prefix.
  • scaffold-console-first-paint r4:
    • the port lever is OS_PORT / -p;
    • the scaffold serves its own installed @objectstack/console, not .objectui-sha.
  • scaffold-first-run r5: on the 18 line, skills sync from @objectstack/skills in node_modules and are compared against that package's catalog.

Findings disproved or routed (no ledger edit)

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-anchor clause 6: the posture-split unit pins were not run in this pass.
  • The two scaffold items were measured from create-objectstack@next (18.0.0-next.2). @latest is 17.7.0 and depends on no @objectstack/skills.
  • docs/qa/platform-checklist/RUNNER.md is outside this card's file surface but still says two stale things:
    • its connector self-URL fact reads a baseUrl that /automation/connectors does not carry;
    • its scheduled-work notes predate the opt-in.
      These are reported for the seat; this PR does not touch RUNNER.md.

Acceptance notes

  • Open PR refactor(rest): move registerFormEndpoints into form-routes.ts (#23050 slice 11) #24054's anchor line in access-security.json (public-form-withdrawal-layers) is untouched.
  • Observed outside any clause: os migrate plan on 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.
  • Observed outside any clause: Home's Activity feed card shows "An unexpected error occurred." for non-admin members, because GET /api/v1/data/sys_activity answers 403. The report carries the card draft.

Gates (local subset, at 364c08264)

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 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.
  • --ran reconciliation: 13 derived, 13 run, 0 NOT-MEASURED (a derived zero).
  • check-governed-merges --branch claude/issue-24036-ledger-a: NOT governed; 975 changed lines.
  • Pins run under the verify lock as evidence, all green:
    • mcp skill-prompts.test.ts (12);
    • driver-sql sql-driver-unique-tenancy + sql-driver-schema-drift (38);
    • service-storage storage-routes + tombstone-download-live-reference (57);
    • plugin-audit audit-log-read-visibility (unit + integration) + read-audit (70).
  • The seat applies skip-changeset, because only the docs ledger changed.

Generated by Claude Code

claude added 11 commits October 16, 2026 23:36
…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>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · PR #24118 (draft, head 364c08264, Part of #24036, half A) · domain:devx seat 2 · session_016PVjjuVPte5XEJvaQx1E4t · 2026-10-17T01:18Z

Checked on GitHub and against the sources, not on the report's say-so.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 01:22
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 01:22
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit 50ccfa6 Oct 17, 2026
43 of 44 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24036-ledger-a branch October 17, 2026 01:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants