Repository navigation
QA run · surface:api (89/89) · 251a7dd4 · 2026-10-04 · 68 PASS / 7 PARTIAL / 14 FAIL / 0 BLOCKED / 0 NOT-RUN #21720
Description
Activity
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsClose-out
Every
failhas a disposition re-derived by an independent verifier (RUNNER rule 7):Extracted: #21057 · access-security.crud-permission-matrix · acceptance[0] Extracted: #21723 · api-backend.rest-metadata-config-contract · acceptance[3] Extracted: #21724 · automation.trigger-status-contract · acceptance[4] Extracted: #21727 · platform-core.manifest-install-contract · acceptance[1] Extracted: #21728 · platform-core.marketplace-install-local-lifecycle · acceptance[4] Extracted: #21725 · automation.trigger-status-contract · outside the item's clauses Extracted: #21726 · access-security.sharing-rules-widen · outside the item's clauses Extracted: #21729 · attachments-storage.attach-requires-parent-edit · outside the item's clauses Extracted: #21730 · attachments-storage.field-accept-maxsize-server-enforced · outside the item's clauses Extracted: #21731 · identity-auth.two-factor-enrollment-reveal · outside the item's clauses Parked-on: #21735 · access-security.share-link-capability-tokens · acceptance[4] Parked-on: #21735 · ai.agent-tool-skill-metadata-roundtrip · acceptance[3] Parked-on: #21735 · api-backend.batch-transactional-discovery · acceptance[4] Parked-on: #21735 · api-backend.server-timing-admin-gated · acceptance[1] Parked-on: #21735 · identity-auth.two-factor-enrollment-reveal · acceptance[5] Parked-on: #21735 · identity-auth.two-factor-backup-codes · acceptance[5] Parked-on: #21735 · integration-system.external-schema-introspection · acceptance[0] Parked-on: #21735 · platform-core.activation-ledger-registration-home · acceptance[4] Parked-on: #21735 · platform-core.marketplace-install-local-lifecycle · acceptance[6] Parked-on: #21735 · records-forms.field-unique-enforcement · acceptance[0]Product defects
card from severity (verifier) note #21057 (existing) crud-permission-matrix A1 P2, fails closed still reproduces at 251a7dd4#21723 rest-metadata-config-contract A4 P1 / medium, authorization detail withheld pending maintainer (RUNNER rule 2) #21724 trigger-status-contract A5–A7 P2 resume refusals lose their engine codes #21725 found in trigger-status / approver-matrix recipes P2 an active PUT /meta/flowsave is not armed until restart#21726 found in sharing-rules-widen P3, diagnostic explain credits sharing for a depth grant #21727 manifest-install-contract A2 P2 protocol refusal: 500, diagnostic dropped #21728 marketplace-install-local-lifecycle A5 P2 purge-sample-data never works; seed rows carry no id #21729 found in attach-requires-parent-edit P2, fails closed parent editor cannot delete another's attachment #21730 field-accept-maxsize knownGap P3 FileConstraintError → 500 #21731 found in two-factor-enrollment-reveal low TOTP issuer "Better Auth" None is a 17.7 regression: every defect above reproduces against code unchanged since 17.6.0 or earlier.
Candidate observations — not verified, not extracted
Seen once by a runner, low severity or possibly by design; listed so they are not lost:
POST /automation/{flow}/runs/{id}/resumesilently dropsvariableswheninputsis also sent (inputs ?? variables).GET /meta/flow/{packaged flow}?layers=truereportslock:'none', editable:true, deletable:truewhile every write door answers 403 (also seen in the 17.6.0 run).POST /sharing/rulesnaming a package-seeded rule creates a second, org-stamped row of the same name.- An authoring refusal (422
INVALID_METADATA) is logged as[REST] Unhandled errorwith a full stack. updateMany/deleteManyanswer per-rowPERMISSION_DENIEDfor an invisible id vsRECORD_NOT_FOUNDfor a nonexistent one (an existence signal for ids the caller already holds; nothing mutated or read).- An unevaluable
warning-severity validation rule logs "… — write rejected." while the write lands 201 (rule-validator.tsreuses the error message). - A seed saved straight to active (
PUT /meta/seed/{n}withoutmode=draft) writes no rows; rows go live only through publish. - Approvals:
remindon a request with two slots for the same person mints two token pairs but the deduped notification carries one;reassignaccepts a nonexistenttoid. POST /datasources/testcreates the SQLite file it probes;two-factor/disablerevokes the bearer session that called it;get-totp-urire-reveals the enrolled secret with the password (conflicts with the dialog's "shown only once" copy).- Runtime
apisaves through theOS_METADATA_WRITABLE=apihatch answer "Saved … state=active" with no warning that the endpoint is not served (by design perapi注册表条目声明 allowRuntimeCreate: true,但运行时创建的端点匹配器永远看不见 —— 声明的能力运行时不兑现(真实 boot 实测) #5488; UX only).
Checklist-accuracy findings (no fail attached; for the checklist owner)
- access-security: sharing-rules-widen step 7 —
sys_record_shareis read-only (405); edit the seeded rule viaPOST /sharing/rules; the position variant cannot discriminate (manager reads contacts at org depth); the unit_and_subordinates audience is decided bysys_business_unit_member. write-path-guards step 5 —createManytakes a bare array; step 7 needsoptions.continueOnError. suggested-binding knownGaps stale (suggested-binding-loop (a): the isDefault audience-binding suggestion is never surfaced on stock (auto-bound at boot, then skipped) #7677 fixed; a pending row can only be provisioned by deleting the suggestion row, which the API refuses 405). org-override: thefieldvariant is stale (meta-field-write-inert: an acceptedfieldPUT never reaches the object — a runtime-created field is storedvalid=trueand is absent fromfieldsforever #7893), codes are uppercase, new objects needsharingModel. me-permissions persona W: provision viaorganization/update-member-role. record-view-read-audit: needs--log-level info. platform-owner A5 live leg can use a stopped-serveremail_verifiedstamp. crud-permission-matrix: delegate DELETE answers 200{success:true}, not 204. - ai: mcp-http-surface A5 lists 11 tools — there are 12 (
resume_run, feat(mcp): resume_run completes a paused screen flow — the caller's own run, behind run_action's gates #19985); thedata:readfamily is 6 (addsvalidate_expression,aggregate_records).list_actionstakes no args (MCPquery_recordssilently ignores unknown sort/filter keys whilefieldshard-errors on unknown values #16913); MCPrun_actiontakesactionName,get_recordtakesrecordId. validate-expression: the field isestimate_hours, andrecord.-prefixed refs are ok underflow_condition. open-edition discovery slot is{enabled, status, message}. Fixture apps needsharingModelandengines.protocol. - api-backend: rest-crud/batch-config knownGaps say the mount half is unpinned —
rest-config-mount-table.pin.test.tspins it. aggregate step 6's non-array answer isVALIDATION_FAILED "expected array". api-methods:searchneedssearchable. packaged-action A2 code isVALIDATION_ERROR. activation-door 400s carryerror.details.fields. bulk-write: door shapes (createManybare array,updateMany {records:[{id,data}]},deleteMany {ids}). error-envelope step 6 uses the strippedoptions.atomicspelling. package-restscope:'custom'is refused (cloud / system / project). route-ledger: 18 families (reportsretired, retire the saved-report stack —sys_saved_report/sys_report_schedule,/api/v1/reports,client.reports,IReportService, thereportscapability and@objectstack/plugin-reports(zero consumers; not thereportmetadata kind) #20102). batch fixture:showcase_taskrequiresproject. query fixture: noprogressfield. filter A2: array / operator-less probes now get the shape-face sentence (analytics: a list comparand at a scalar operator ({ amount: { $gt: [10, 99] } }) answers 200 bound to its first member on the engine-aggregate face (and on both faces for a text column), where the spec's verdict refuses the list form #21448). rest-metadata-config-contract step 3 namesshowcase_account, which no stock persona masks — the stock fixture isclient_liaisononshowcase_project. - approvals / attachments: email-action-token A1
token_hashisinternal: true(fix(plugin-audit,platform-objects,plugin-auth,plugin-sharing,plugin-approvals,objectql)!: the audit ledger honours internal, and the credential-class census is declared internal #21301) — verify at the DB; expiry cannot be backdated over the API (405). approver-matrix: scratch flows needPUT /automation/{name}(see automation: a flow saved active through PUT /api/v1/meta/flow is never registered with the running engine (404 until restart), unlike hooks and actions #21725); the queue warning no longer cites 审批节点「处理人 Value」应改为记录 lookup(现查 metadata 端点→只能手填);附 approver value 语义核实 + queue 未实现 #3508;sys_team(405) andsys_user.manager_id(403) need DB writes. attach-requires-parent-edit A3 code isPERMISSION_DENIED. sys-file-status step 8. status-mirror persona plan needs a create grant. A scratch permission set isPOST /data/sys_permission_set, notPUT /meta/permission_set(400). - automation: recipe
qa-flow-status-doorssteps 2–3 (usePUT /automation, see automation: a flow saved active through PUT /api/v1/meta/flow is never registered with the running engine (404 until restart), unlike hooks and actions #21725); recipeqa-contributor-bound-memberstep 5 must setownerto the member's email; disable-durable's ledger line needsOS_LOG_LEVEL=info. - identity / integration: verify-to-activate step 4 refusal is
INVALID_TWO_FACTOR_COOKIE; settings live at/api/settings/…(not/api/v1). datasource-admin:result.status(noaction), driver idmongodb,config.filename(file→ did-you-mean 400), health fieldstatus+statusReason. federated-read A3 still declaresoracle: screenshot;$filtermust be JSON. declarative-boot: the ready-instance log line is not printed at the default level; listing body{success, data:{connectors,total}}. - platform-core: manifest-install step 2
scope:'custom'(fix(runtime): the package install door parses its whole body through PackageInstallBodySchema #20218),engine.objectstackneeds full semver, leg 8b needsoverwrite:true. ledger row contract: 405allowedlist is 5 verbs; the table has a__searchcolumn. docs-audience A3 unknown-audience deny has no test case. seed-mode: author with?mode=draft(notstate), nonamekey in the body. marketplace step 5:storageDiris on the envelope; install-local writes into{cwd}/.objectstack(needs a scratch cwd). - records-forms: field-unique
updateManyis per-id, not predicate; validation-rule cross_field targetsfields[0](start_date),invalid_initial_stateis only drivable onshowcase_project; predicate-traversal A2's verify names a rule name the envelope does not carry, and the knownGap "member_default does not grant account read" is false.
Environment notes are in the record body. The 17.6.0 run's open items (#21330) not re-judged here are browser-side and carry forward to the post-#21696 run.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClose-out addendum: grep-able lines for three disposed rows. The record stays open for its partials
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T16:09Z. The maintainer approved clearing the openqa-runrecords' close-out debt: 「同意,动手」. This was audited row by row (read-only) against checklist-test §5 before this write.Parked-on: #21735 · api-backend.server-timing-admin-gated · A3
Parked-on: #21735 · integration-system.external-schema-introspection · A3
Extracted: #21724 · api-backend.trigger-status-contract · A5–A7- These rows were already disposed in qa(checklist): re-point 17 clauses on 16 items that the 17.7 pre-release runs (#21720 / #21721 / #21722) proved stale or mis-asserted #21735's table and in automation: a refused flow resume answers status-derived codes (VALIDATION_ERROR / RESOURCE_NOT_FOUND) instead of INVALID_SCREEN_INPUT / INVALID_SIGNAL / RUN_NOT_FOUND #21724, but no grep-able line named them.
- Still undisposed: seven partials.
access-security.rls-both-sidesA6;access-security.write-path-guardsN2;api-backend.declarative-endpoint-executionA3;records-forms.predicate-relationship-traversalA4;- three browser halves deferred "post-chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696" that no browser run re-selected:
api-backend.route-ledger-live-parityA10,automation.packaged-flow-clone-contractA7,platform-core.metadata-registry-servingA7.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClose-out complete: the blocked partial gaps are parked. The record closes
completedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T17:06Z. The maintainer approved clearing the openqa-runrecords' close-out debt: 「同意,动手」. ⛔ No verdict on this record is changed.Parked-on: #22017 · access-security.rls-both-sides · A6 blocked(dependency)
Parked-on: #22017 · access-security.write-path-guards · N2 no door, no pin
Parked-on: #22017 · api-backend.declarative-endpoint-execution · A3 code-only by design (#5488)
Parked-on: #22017 · records-forms.predicate-relationship-traversal · A4 persona fixture, knownGap to re-check-
Every fail was already disposed, in this record's close-out and in addendum
6020403609. -
The three browser halves deferred past chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696 are
not-run, and stay on this record's handoff list (§4, ⛔ no second list):api-backend.route-ledger-live-parityA10;automation.packaged-flow-clone-contractA7;platform-core.metadata-registry-servingA7.
The next release-candidate Tier 1 run re-selects them (§5, trigger 1).
-
17.7 pre-release verification, non-browser half: every runnable
surface:apiitem againstorigin/mainas it stood when the run started, the base 17.7 will be cut from (not yet cut; packages still read 17.6.0 with the pending changesets). The browser half waits for the Console pin bump (#21696). Text only; the durable truth stays indocs/qa/platform-checklist/areas/.Environment fingerprint
objectstack-ai/objectstack251a7dd4(fix(organizations)!: a create naming an organization_id meets the Layer 0 write wall, as the update does (#21666) (#21680)), in a dedicated detached worktree:pnpm install --frozen-lockfile && pnpm build→ exit 0 (6m07s)..objectui-sha=ab187972(chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625). Every clause that can only be judged in the browser is recordednot-run (frontend deferred, #21696).RUNNER.mdandscripts/checklist-select.mjsfrom the subject tree; the revision of every item is in the table.examples/app-showcase,OS_PORT={p} objectstack dev --seed-admin -p {p} -d file:/tmp/qa1770/{lane}/{item}.db, one file DB and one port per item on disjoint lane ranges 42101–43959 (egress proxy port 41333 excluded). Two lanes deviated under load and say so: L1 drove its eight access-security items on one boot with fresh personas and probe rows per item (plus an independent fresh-DB reproduction for [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), and L6 shared one DB per item group. Members minted by admininvite-member+sign-up/email; identity proved byGET /auth/get-sessionbefore each persona cell. Scratch apps and packages lived under/tmp, never in a checkout.session_018zT8d8NpiQ1ExhuNd5TxY6, 2026-10-04 08:10–11:10Z. The box (4 CPUs, 15 GB) was badly oversubscribed in the first wave (load 60–110): some boots took 10+ min and several hit plugin-start timeouts and were re-booted on fresh DBs; batched vitest runs were SIGKILLed or timed out and every affected pin was re-run alone — every verdict rests on the clean re-run. Environment / waiting ≈ 40–55 % of runner time.Scope
node scripts/checklist-select.mjs surface:api --json→ 89 runnable items. Hidden as blocked (not run):access-security.no-active-org-session-semantics,approvals.sla-escalation. This record is one of three for the same subject; the CLI and build selectors are separate records.verify --rls38 PROVEN · 0 HOLES · 226 NOT PROVEN, 10/10 positions; private-owd 5/5isSystemwrite; no REST door, no pin); owner-anchor 9/9 · static-readonly 3/3 · readonly-when-parent 5/5rule, survives restartconfirmedrow; confirm writes the binding under the callermanage_metadataholder 200readrow per detail viewWWW-Authenticate, scope narrowingok/bare-reference/unknown-fieldmatch a real buildprompts/listandprompts/getround-trip/ai/agents200 empty; models/chat 501 with the remedy; anonymous 401continueOnError:falsestops at the first failure (NOT_ATTEMPTED tail, batch.zod.ts:81-84) — assertion defectfields[]with label, nofieldErrorssearch:qa-contributor-bound-member/_statustracks/datagroup-by exactlysys_user.enable_two_factornow declares aresultDialog(266654d, #11110) — stale clausegenerate_backup_codesnow declares aresultDialog(266654d, #11110) — stale clauseorganization_idcolumnTotals: 68 PASS / 7 PARTIAL / 14 FAIL / 0 BLOCKED / 0 NOT-RUN. Of the 14 fails, 5 carry a product defect (one known, four new) and 9 are checklist clauses whose assertion is wrong or that a deliberate change made stale. Every fail was re-derived by an independent verifier from a fresh reproduction; where a verifier changed a disposition, the verifier's is recorded.
Fails — reproduction rules and dispositions
Product defects
access-security.crud-permission-matrix A1 — known #21057, still reproduces at
251a7dd4(fails closed). Fresh boot; admin invites + signs up D and T; adminPOST /api/v1/data/sys_user_permission_set {"user_id":D,"permission_set_id":{showcase_field_ops_delegate}}→ 201 andPOST /api/v1/data/sys_business_unit_member {"business_unit_id":"bu_field_ops","user_id":D}→ 201; as DPOST /api/v1/data/sys_user_position {"user_id":T,"position":"contributor","business_unit_id":"bu_west_coast"}. Expected 2xx; actual403 PERMISSION_DENIED "… outside the delegated subtree". Seededsys_business_unitrows still readorganization_id: null; stamping the org onto them flips D's create to 201.api-backend.rest-metadata-config-contract A4 — authorization class. Detail withheld pending maintainer (RUNNER rule 2). Verifier V1: CONFIRMED (narrower: no data values cross the boundary).
automation.trigger-status-contract A5 / A6 / A7 — resume refusals put status-derived codes on the wire. Admin
POST /api/v1/automation/showcase_reassign_wizard/trigger {"recordId":{a task id}}→ 200runId; then onPOST /api/v1/automation/showcase_reassign_wizard/runs/{runId}/resume:{"inputs":{}}→ 400VALIDATION_ERROR(expectedINVALID_SCREEN_INPUT);{"inputs":{"new_assignee":"x"},"output":{"$User":{}}}→ 400VALIDATION_ERROR(expectedINVALID_SIGNAL);…/runs/run_nope/resume→ 404RESOURCE_NOT_FOUND(expectedRUN_NOT_FOUND); resuming a run whose flow was deleted → 404RESOURCE_NOT_FOUND. The run stayspausedand statuses are right; the SDK'serr.codetherefore never carries the documented codes (A7). Verifier V3: CONFIRMED.platform-core.manifest-install-contract A2 — admin
POST /api/v1/packages {"manifest":{"id":"com.example.qa-old","name":"Old","version":"1.0.0","scope":"project","type":"app","engines":{"protocol":"^16"}}}. Expected a 4xx carryingrequiredRange,rangeSource,protocolVersion,targetMajor,migrateCommand; actual500 {code:"OS_PROTOCOL_INCOMPATIBLE", message, httpStatus:500}with the fields only inside the prose. The refusal itself holds (nothing installed, A1 passes). Verifier V4: CONFIRMED.platform-core.marketplace-install-local-lifecycle A5 — boot with
OS_CLOUD_URL=offfrom a scratch copy of the showcase;os package install {examples/app-crm/dist/objectstack.json} -r http://localhost:{p}; adminPOST /api/v1/marketplace/install-local/com.example.crm/purge-sample-data {}. Expected{deleted, skipped, errors}; actual500 DRIVER_UNAVAILABLE "driver service unavailable — cannot purge.", nothing deleted. Verifier V4: CONFIRMED, and found a second fault behind it (below).Checklist clauses (no product defect)
INVALID_OR_EXPIRED, byte-identical to an unknown token (the delete cascades the link row; fail-closed so "record gone" is not readable); 410RECORD_GONEis race-onlyNOT_OVERRIDABLE; a runtime-created name drafts 200ee58392e1(#6608), predates the clause's rev 3NOT_ATTEMPTEDtail);options.continueOnError:truegives "neither blocks the other"batch.zod.tscontinueOnErrordefault,744b8f5f5(#7581)OS_SERVER_TIMING=truesends spans to every caller; env off +X-OS-Debug-Timingis admin-only; the SQL-shape detail header is admin-only in both (verified)hono-plugin.ts:83-104,300-353, #3163 / #3169sys_user.enable_two_factordeclares aresultDialog(QR + code list), nosuccessMessage266654d82e(#11110, fixes #10681)generate_backup_codesdeclares aresultDialog266654d82e(#11110)columnCountis 7 per table (the fixture'sinitObjectsaddscreated_at/updated_at)external-fixture.ts:36-45fields.{f}.primaryKey;ObjectSchemais a value import forObjectSchema.create4257e4e4e3(#11073, ruling D of #11000)platform-objectsarray holds 46 names (46 at 17.6.0 too); the one-owner assertion holdsplatform-object-names.ts901e7cf13(#21581)unique:trueis the composite(organization_id, field)and the 409 names the object, never a guessed column9a4182a75(#21598);duplicate-record-error.tsPartial-coverage gaps (named, not dropped)
access-security.rls-both-sidesA6 — blocked(dependency): the clause forbids ticking it without the private D11 write-up; the by-handproject_membershipprobe answered 403 on GET / list / PATCH.access-security.write-path-guardsN2 — no REST door for an in-processisSystemwrite and no pin targets it.api-backend.route-ledger-live-parityA10,automation.packaged-flow-clone-contractA7 (Studio half),platform-core.metadata-registry-servingA7 — browser halves, deferred to the post-chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696 run.api-backend.declarative-endpoint-executionA3 — no live script/proxy endpoint without editing source (runtimeapiauthoring is code-only by design,api注册表条目声明 allowRuntimeCreate: true,但运行时创建的端点匹配器永远看不见 —— 声明的能力运行时不兑现(真实 boot 实测) #5488).records-forms.predicate-relationship-traversalA4 — no stock persona with invoice CRUD and no account read (showcase_member_defaultgrants account read; the item's knownGap says otherwise). The behaviour holds on a scratch-object substitute.Fixed since the last run
9f13c949b(fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door #21372).Close-out (extracted cards, checklist-accuracy findings) follows in a comment.
Generated by Claude Code