Repository navigation
[sweep] v18.3.0 release test sweep #27377
Description
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Filing gate: ③ a maintainer-directed task. The maintainer asked in this session on 2026-10-29, verbatim: 「跟进平台 的 checklist ,和我沟通建议运行哪些测试,可以开云卡片」. On the proposed scope they chose 「完整发版前一轮」, a full release-candidate round, and added 「你应该使用 pm-dispatch 技能处理 issue」.
Business reason: the next release ships through the Version Packages PR #26517. Its pending changesets are 300 in all: 164 minor, 0 major and 63 with Clause-②: yes. With the fixed group that makes 18.3.0. The checklist runs are the release's evidence that the standing smoke and the 18.x capabilities still hold at the release head, before the release merges.
Reader: the lane that owns docs/qa/platform-checklist/** (domain:devx). Each checklist-accuracy line parked here is a ledger edit for that lane. The release decision reads the wave table in §0.
Dedupe (open AND closed): the query "[sweep] v18.3.0 release test sweep anchor" returned 15 hits and none of them is an 18.3 anchor. The nearest is #25807, the 18.2.0 anchor, which is still open for its parked partials.
This card is the wave anchor for the 18.3.0 release-candidate sweep, called wave 3. RUNNER's extraction obligation (docs/qa/platform-checklist/RUNNER.md) applies:
- checklist-accuracy findings, fixture gaps,
partialcoverage gaps and not-run handovers close out here; - product defects are extracted as their own cards and listed in §5;
- run records are
qa-runissues that hang off this card by number.
Why a full round, not a delta
- 514 commits on
mainsince wave 2's subject756220c4. - 162 runnable items changed
revision, and 23 new Studio items landed through qa(checklist): studio-authoring accuracy fixes + 23 items from the Studio QA run #26848. - 254 runnable items cite a source file that changed.
- 20 QA-extracted fix cards closed after wave 2's subject, which is SKILL §5 trigger 2. Their retest list is §4 below. The 18.2.0 anchor's own §4 was never filled in.
A delta-only rerun saves little, so this is a release-candidate rerun (SKILL §5 trigger 1).
Subject: framework main @ c4c515ad3cc342043a2b81b5a06a5793f79a23e8 (2026-10-29T03:33Z). The Console is built in-repo from that same commit (pnpm console:build). Every card pins this sha, and none follows the Version PR as it regenerates.
0. The wave at a glance
| card | selector / set | items | surface | record |
|---|---|---|---|---|
| W3-C1 | priority:P0 |
23 | browser-heavy | pending |
| W3-C2a | Tier 1 (automated.ref items): access-security · ai · api-backend · approvals · attachments-storage · automation · cli |
73 | per-area vitest batches | pending |
| W3-C2b | Tier 1: dashboards · i18n · identity-auth · integration-system · platform-core · records-forms · search · studio-authoring · ux-conventions | 89 | per-area vitest + showcase / ui Playwright | pending |
| W3-C3a | manual set, api · cli · build surface |
25 | live REST / CLI | pending |
| W3-C3b | manual set, browser · mixed surface |
55 | live browser | pending |
The manual set follows the rule wave 2 used (#25817 / #26476 / #26456): the unpinned since:v18.x items, plus the unpinned P0/P1 items whose source[] cites a file changed by a commit carrying a Clause-②: yes changeset, plus the §4 retest items. Each card's dispatch lists its ids, 80 in all.
Not in this wave:
- the unpinned P2 items outside those rules (Tier 3);
- the post-publish npm smoke, which runs after 18.3.0 is published, against the registry.
Backend: one mode:cloud session per card, through create_session with source_url. The model tier is default (dispatch-gates --tier gives no path mandate). A QA run is not a lane card, so there is no lane claim (maintainer ruling recorded on #25807). Each card:
- files one
qa-runrecord per selector under this anchor; - extracts its product defects as their own cards;
- parks accuracy findings and gaps here.
1. Re-point — red rows this anchor owns
None yet.
2. Checklist-accuracy findings
None yet.
3. Fixture gaps, partial coverage and not-run handover
None yet.
4. Retest list (SKILL §5 trigger 2)
Each fix below landed after wave 2's subject. The item named is the one its defect came from.
| item | card(s) fixed | wave-3 card |
|---|---|---|
| approvals.record-page-decisions | #25934 (#26361, #26402) — wave-2 FAIL carried on #26456 | W3-C3b |
| i18n.surface-matrix | #26452 | W3-C3b |
| ux-conventions.write-feedback | #26459, #26461 | W3-C3b |
| studio-authoring.expression-editors | #26707 | W3-C3b |
| studio-authoring.draft-publish-lifecycle | #26462 | W3-C3b |
| i18n.strict-translation-key-rejection | #26463 | W3-C3b |
| platform-core.settings-hub-roundtrip | #26465 | W3-C3b |
| automation.setup-packaged-automation-board | #26474 | W3-C3b |
| records-forms.record-discussion-mentions | #26453 (detail withheld) | W3-C3b |
| records-forms.field-group-visible-when | #26646 | W3-C3b |
| access-security.record-access-explain | #26641 | W3-C3b |
| identity-auth.self-service-profile-password | — the PASS was carried from 18.1.0 (#25479) and never re-judged | W3-C3b |
| approvals.decision-only-via-service | #26477 | W3-C3a |
| cli.hook-body-extraction-gates | #26478 | W3-C3a |
| attachments-storage.field-accept-maxsize-server-enforced | #26479 | W3-C3a |
| platform-core.manifest-install-contract | #26480 | W3-C3a |
| api-backend.query-contract-matrix | #26644 | W3-C1 (P0) |
The npm-smoke fixes #26630, #26631 and #26632, and the off-item fixes #26640 and #26642, are re-judged by the post-publish smoke.
5. Extracted elsewhere (not repeated here)
None yet.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Wave 3 dispatched · 2026-10-29T04:25Z
Six cloud runner sessions, all pinned to
c4c515ad. They are dispatched directly: a QA run is not a lane card.session_017xRBcV2ijbfB8Drvs2oik6priority:P0, 23 itemssession_017xRBcScm27Q3R5mkYLPWdBsession_017xRBcSwDXZrZg7nGjP6P3Usession_017xRBcTp5wXse9Zwgq8aFWVsession_017xRBcVkGJizGH7raJHhAvLsession_017xRBcUoS2G4jgqRskpExS7The maintainer asked for W3-UX in the dispatching session, choosing verbatim 「加一张走查云卡」 when asked whether judging UI and UX in the browser was in scope. With it the wave has six concurrent slots, one over the default ceiling of five, and that sixth slot is the maintainer naming it.
Maintainer rulings recorded in the dispatching session (2026-10-29, verbatim):
scripts/pm/doors.os-devsubagent, with the reproduction only in its dispatch prompt. The record row reads onlysecurity finding — detail withheld, fix dispatched..claude/skills/checklist-test/SKILL.mdand its twin, RUNNER.md rule 2. That edit is dispatched separately and is not part of the runs.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 什么算做好 | none | none
Triage: p1 ·
domain:devx· wave anchor for 18.3.0 · 2026-10-29T04:54Z⛔ Not a claim.
c4c515ad. Its labels follow the 18.2.0 anchor [sweep] v18.2.0 release test sweep #25807.documentation,priority:p1,domain:devx,area:devpath,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Runner effort, recorded · 2026-10-29T04:54Z
The six wave-3 cards were dispatched with no effort stated.
create_sessiontakes no effort parameter, so each card inherits the dispatching session's effort (dispatch-runbook, trigger-flow line ②).At about 30 minutes, the spend read from
get_sessionusage.cost_usdwas:The maintainer asked in the dispatching session, verbatim: 「你派的任务都需要 extra 吗」. The seat answered: not all of them. A run card needs
high, andxhighis for a security fix dispatch and for adversarial review. The maintainer replied: 「立卡更新 skills」. The card is #27390.The running cards are left as they are. Restarting them would throw away their environment setup.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcTp5wXse9Zwgq8aFWV
W3-C3a recorded: #27392 (release-18.3.0-w3-manual-api, 25/25 judged at c4c515a · 23 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN)
Pins: every item's revision was pinned from
checklist-select.mjsat c4c515a. All 25 were runnable and none is planned. Every clause was driven live (REST, CLI, MCP or a build) on a fresh showcase boot per item. Noautomated.refpin scored a clause. Two pins were run only as supporting evidence, and their layer is named in the record.Extracted product defects (§5): all four are off-clause probe findings, each reproduced twice.
seedAppliedreport 0/0 although rows were written, and later seeds are never applied.userapprover naming a nonexistent user id opens a request on a phantom slot with no warning and no onEmptyApprovers fork, so the request is stuck pending forever #27397: auserapprover naming a nonexistent id opens a stuck request, with no warning and no onEmptyApprovers fork.Retest list (§4):
Partial coverage and fixture gaps
Checklist-accuracy findings (ledger edits for the devx lane)
Environment and timing:
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB
W3-C2a recorded: #27409 (QA run · release-18.3.0-w3-tier1-a (73/73) · c4c515a · 2026-10-29 · 59 PASS / 14 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN)
c4c515ad. The Console was built in-repo from the same commit.ui/e2e/live/screen-flow.spec.tspassed against the live automation boot.grid-file-upload.spec.tswas not run; that item was driven by hand.Retest items (anchor §4) on this card
$select,selectorfieldsanswers 400 VALIDATION_ERROR naming the parameter.$countorcountanswers 400.fields:[]andfields:[""]answer 400 atquery.fields, andcount:"maybe"answers 400 atquery.count.sys_metadata_activation(created_by/updated_by) and onsys_audit_log(user_id/actor).Partial coverage and fixture gaps
Parked-on: #27377 · access-security.rls-both-sides · A5 D11 spot-check blocked(dependency): needs the maintainer-held write-up (#22017)
Parked-on: #27377 · access-security.crud-permission-matrix · A5 guest create-without-read is unobservable on a stock boot (#23267)
Parked-on: #27377 · access-security.fls-mask-and-strip · the partial-masking (maskingRule) path has no fixture anywhere; only strip is observed
Parked-on: #27377 · access-security.public-form-withdrawal-layers · A2 to A5 have no stock fixture; scored from the pins (knownGaps[1])
Parked-on: #27377 · ai.mcp-oauth-private-host-transport · A0 and the private leg of A2 need a host holding an RFC1918 or link-local address; this container holds only 192.0.2.2
Parked-on: #27377 · api-backend.action-activation-door-contract · A4 the 503 arm for a degraded metadata plane has neither a stock door nor a pin (knownGaps[3])
Parked-on: #27377 · approvals.email-action-token-door · no pin for: FORBIDDEN on a no-longer-pending slot (A0), timeline and consumed_at byte-identity under repeated GET (A1), consume-first when the decision fails (A3, source only), page-level not_pending/not_approver rows (A4); A5 blocked(fixture), no stock door mints a raw token
Parked-on: #27377 · approvals.status-mirror-field · A2 the user-less cascade refusal on an SLA auto-decision has service-unit evidence only
Parked-on: #27377 · approvals.request-page-reply-and-reader-visibility · A2 needs a persona granted read on sys_approval_request; A3 needs a writable object to flip enable.approvalsVisibleToReaders
Parked-on: #27377 · attachments-storage.read-inherits-parent-rls · A3 bounded-probe half (D5 classes) is engine and unit only (knownGaps[2])
Parked-on: #27377 · attachments-storage.sys-file-status-pipeline · A2 the deleted-row-with-live-holder half has no live door (route-handler unit only)
Parked-on: #27377 · attachments-storage.orphan-tombstone-reap · A1 the failed byte-delete veto is unit-only (a root container cannot make unlink fail)
Parked-on: #27377 · attachments-storage.upload-session-abort · A3 the warning text is asserted only on a mock logger; A4 failed status is reachable only through a test seam
Parked-on: #27377 · attachments-storage.chunked-upload-integrity · A3 live leg blocked(fixture): a stock single boot holds one organization; scored from the wall pin
Parked-on: #27377 · automation.paused-run-trigger-record-masked · A0 and A1 no stock object has an internal:true field, so the internal-key half rests on the in-process pin; a read-granted member persona was not authored
Parked-on: #27377 · automation.setup-packaged-automation-board · A5 a plain member cannot open the Setup app (knownGaps[2]), so the member refusal is seen only as the server body
Parked-on: #27377 · cli.organization-ownership-ceremony · A4 drop gate driven on the 18.0.0-next.5 dump; no v17-shaped DB provisioned
Parked-on: #27377 · cli.scaffold-first-run · no scaffold-e2e.yml run exists at c4c515a (latest scheduled run is at 28872e6, no push trigger); all clauses scored from the live pre-release leg; the A4 never-healthy branch was not triggered
Checklist-accuracy findings (ledger edits for the devx lane)
Each finding names the item, the clause or step, what is stale, and what it should say.
PUT /api/v1/meta/permission/showcase_member_access, a set the showcase does not have (a read-back answers 404). It should name a real set, such asshowcase_member_default.showcase_client_liaisonset now provides the fixture, and the measured shape is the key being absent. It should say that.verify --rlsblock,showcase_account's RLS proof rides a seeded row, because the admin create was refused 400. The item should name that.os start. Anobjectstack devboot with stdin piped drives the same plugin path, and the fixture could say either works.["and", cond, cond]; the infix form is refused 400.$contains,$notContains,$startsWithand$endsWithare case-sensitive on the SQL driver;$icontainsis the case-insensitive twin. The steps should say so./api/v1/data/sys_approval_request. That is by design (ADR-0103 engine-owned object, read only as an app grant), and the console page reads only the approvals API. The clause and the pin's claim should say they hold for callers the app grants read on the object.x-resume-tokenheader, and complete takesparts: [{chunkIndex, eTag}]. The steps should say so.sys_fileread sees the foreign file in full. The step should say both.ORGANIZATION_OWNERSHIP_MIGRATION_REQUIRED. The clause should read the message line.sys_verification.expires_at.os servethe delivery row lands in the primary DB, not the telemetry sibling.com.example.showcase, or the view is refused 422list-view-object-outside-closure.destructive.jsonneedssharingModel, or the save is refused 422security-owd-unsetfirst.record.namepresumes a fieldshowcase_taskdoes not have (usetitle). The cbp arm must be a raw object, becauseObjectSchema.create()forcesrequired: true.pnpm packmust run with scripts off. At c4c515a the tree version equals npm latest (18.2.0), so a local registry with no upstream is what makes the candidate the thing installed.Environment notes for the RUNNER
pnpm builddid not producepackages/console/distat this sha;pnpm console:buildwas still needed (a cache hit plus a copy).ui/root; the objectui vitest guard refuses a package-dir run.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcVkGJizGH7raJHhAvL
W3-C3b recorded: #27441 (54/55 judged · 44 PASS / 2 PARTIAL / 8 FAIL / 0 BLOCKED / 1 NOT-RUN) at
c4c515ad, Console built in-repo from the same commit.node scripts/checklist-select.mjsat the subject and is listed in the record's Scope.Retest list (§4): does each fix hold?
_diagnosticsand the Problems tab all call valid is refused only at publish — and one such draft rolls back the whole package release #26707): the server half holds: draft_diagnosticsequals the publish verdict. The item still FAILs, on clauses that predate the Studio: an expression field that says "Valid CEL" should read the draft's server verdict at its own path (RLS predicate, flow edge condition) #26858 ruling (stale spec, re-point below).locale— the #25822 fix refuses multi-word names only, though its changeset and refusal text say "a language name" is refused #26463): holds.locale:"Chinese"answers 422 invalid_format.Extracted product defects (for §5)
Clause fails:
visible, pagevisibleWhen) runs on the legacy evaluator and fails, though the spec defines a bare string as CEL shorthand #27457: a bare-string CEL predicate runs on the legacy evaluator (app-and-nav-properties A3, authored-page-slots-and-variables A1/N0)Probe findings:
fieldTwo authentication/authorization-shaped probe findings are withheld under the 2026-10-29 ruling and were handed to the PM session.
Re-point (§1): red rows this anchor owns
label(record.f)via bindOptionLabel;validate.ts:1257; formulas.mdx:203). Add a known-answer row:label(record.kind)with optionLabels → "Clean".Fixture gaps, partial coverage and not-run handover (§3)
A runner with a member persona and the external datasource boot should finish it.
npx create-objectstack@latest, so the run used the workspace create-objectstack (same 18.2.0). That leg resolved the published @objectstack/*@18.2.0, and the candidate console was not exercised. The pre-release registry variant is owed, or the post-publish smoke covers it.qa_capcannot be declared at runtime (403 NOT_CREATABLE); use a declared, ungranted capability.Checklist-accuracy findings (§2): ledger edits for the devx lane
Format: item · clause or field. Stale text → what it should say.
Studio items
negative, and runners split between pass and skipped. Should say: move them to notes, or state that they are scored "honoured".actionitem renders nowhere.allowExportis listed, and the item says it "FAILS today (Studio Access: saving a permission set drops draft values written by another door (description,packageId) — the save starts from the published body and copies back only editor-managed keys #26837)". Should say:allowExportis not a permission key (422), and the variant now passes.navigation, and the seeded admin holdsorg_owner, notorg_admin.slots.tabsis retired (ADR-0085, spec: a slotted record page keeps six slots — header, actions, alerts, highlights, details, discussion — and thetabsslot is retired; a page that needs its own tab strip is akind: fullpage #27053).cd ui && pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/views/metadata-admin/celAuthoring.test.ts(the package-dir form is refused by the vitest guard).flow-edge-server-error); only Problems stays silent.typekey; the option labels read "Fault (error path)" and "Back-edge (revise loop)".buttonsis "never rendered". Should say: it renders (the submit label, and cancel hidden).POST /api/v1/analytics/dataset/query {datasetName, selection:{…, order:{measure:'desc'}}}.Records, forms and approvals
splitlayout, and drawer/modal overlay → simple. Should say: spec 18.3.0 FormView.type is simple, tabbed or wizard, and split/drawer/modal overlays answer 422 (ADR-0050). Drop the split variant or score it as the refusal.has(record.done) && record.done != true, and showcase_reopen_task exists.declared-actions-override-menu).Automation and dashboards
invalid_type;requiredis only for an absent key.CLI, i18n and identity
npx create-objectstack@latestcan be refused by an agent sandbox; the built scaffolder is equivalent when the versions match.namedescribe. Should say: the describe now says a snake_case item name; drop the warning. Also add a locale-shape variant ("Chinese"/"zh_CN" → 422 atlocale).pnpm exec vitest run …)./setup. Should say:/_console/setup.Integration, platform core and search
appitem drafted into the package, plus the namespace prefix and the sharingModel enum. A5: name both deep-link shapes.API backend, access security and UX
POST /api/v1/packages {"manifest":{…}}) and the namespace prefix.{{ record.title | default:'Task' }} marked done.and'Invitation sent to {{ result.email }}'.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcV2ijbfB8Drvs2oik6
W3-C1 recorded: #27481 (priority:P0, 23/23 judged at c4c515a: 20 PASS / 3 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN)
showcase-smoke.spec.tspassed 49 of 49 against a live boot.objectstack verify --rlsreadsall personas: 38 PROVEN (38 consistent, 0 HOLES), with 10 of 10 positions probed. Every named dogfood, engine and unit pin was green (counts in the record). The Console was built in-repo, and the served entry chunkindex-DkXHr74P.jsequalspackages/console/dist.api-backend.query-contract-matrix: the fix from data list door: a blank $select answers every column and an unrecognised $count value counts — malformed values are read as the absent default #26644 holds. Blank or comma-only$select/select/fieldsand a bad$countanswer 400, thePOST /querydoor does the same, and the controls are unchanged (two loads; the fix pins report 17 and 37 passed).$searchFieldsis read as absent, so a search the caller narrowed runs over the default search fields instead of being refused #27484, console: the record history "Changes" entry shows a currency (and number) field as its raw stored value, e.g. 4321000, where the record shows $4,321,000.00 #27486, data: POST /api/v1/data/:object/:id/clone accepts anoverridesthat is not an object (a string) and answers 201 with the overrides silently ignored #27489, approvals: GET /api/v1/approvals/requests/:id/actions answers 200 {"data":[]} for an unknown request id, where GET /api/v1/approvals/requests/:id answers 404 #27493. Two security findings had their detail withheld and their fix dispatched; no card was filed, per the 2026-10-29 ruling.Parked here (anchor §2 and §3):
Parked-on: #27377 · access-security.rls-both-sides · partial: acceptance[5]'s D11 spot-check is blocked(dependency), knownGaps[0]. The private write-up is maintainer-held. The public half holds.
Parked-on: #27377 · access-security.crud-permission-matrix · partial: acceptance[5] is blocked(dependency, #23267), knownGaps[2]. No door binds a set to the guest anchor.
Parked-on: #27377 · cli.organization-ownership-ceremony · partial: acceptance[5]'s reset-password leg is blocked(fixture). The
cli-18-prerelease-dbdump'ssys_verificationreset token expired at 2026-10-27T17:42:21Z, one hour after generation, so the reset answers 400 INVALID_TOKEN on every later run. The recipe's restore should re-dateexpires_at(or the generator should mint a long-lived token), or the clause should say the leg is scored only on a freshly generated dump. Every other leg held.Parked-on: #27377 · access-security.walled-environment-metadata-operator-only · gap: the install-local leg was not driven live, because an admitted install writes into the shared tree's
.objectstack/installed-packages. It rests on the wall-* pins. Running it from a scratch copy would close it.Parked-on: #27377 · cli.organization-ownership-ceremony, platform-core.v18-boot-refusals · fixture gap: the v17-shaped DB in practice comes from a 17.7.0 blank-scaffold
os devboot (--legacy-peer-deps), because no 17.x showcase is published.fixtures.requiresshould say so.Parked-on: #27377 · records-forms.crud-roundtrip, studio-authoring.first-run-loop · gap:
ui/e2e/live/record-history-display.spec.tsandui/e2e/live/studio-object-designer.spec.tswere not run (they need the console dev server on fixed ports). Both clauses were scored by hand.Checklist-accuracy findings (ledger edits for the devx lane):
Parked-on: #27377 · records-forms.crud-roundtrip · steps[5] and acceptance[4] say "History tab". At c4c515a the record page has no History tab: history is under Activity › Timeline, filter "Changes". The steps should say that.
ui/e2e/live/record-history-display.spec.tswaits forgetByRole('tab', {name: /History/}), so it is likely stale too.Parked-on: #27377 · records-forms.crud-roundtrip · steps[6] names only showcase_account, but the clone-ownership half needs the showcase_field_zoo substitution that acceptance[6].verify already documents. The step should name it.
Parked-on: #27377 · access-security.crud-permission-matrix · acceptance[1] says
error.code PERMISSION_DENIED, but the wire envelope is{error: message, code, object}. It should say top-levelcode.Parked-on: #27377 · access-security.crud-permission-matrix · acceptance[6].verify and steps[6] still call the 16 field_ops_delegate × sys_* cells hand-driven, though
automated.refhas pinned them since rev 9. Still stale at rev 10.Parked-on: #27377 · access-security.owd-sharing-matrix · steps[4]'s invoice body omits the required
account, and steps[3]'s showcase_project create needs statusplanned(otherwiseinvalid_initial_state). The steps should name both.Parked-on: #27377 · access-security.walled-environment-metadata-operator-only · steps[0] names
PUT /api/v1/meta/permission/showcase_member_access, a set the showcase does not have (GET 404), so it tests a create-refusal. It should name an existing set (for example showcase_member_default).Parked-on: #27377 · access-security.walled-environment-metadata-operator-only, identity-auth.default-organization-boot-invariant ·
fixtures.requiressayspnpm dev -- --fresh, which compiles into the shared tree. It should sayobjectstack dev --fresh --no-compile -p PORTwhen runners share a tree.Parked-on: #27377 · cli.organization-ownership-ceremony · acceptance[1] under
--dev: "the DB checksum is unchanged" holds for the primary file, but the telemetry sibling's hash moves (the plan checkpoints the-wala prior refused boot left, with no schema or row change). It should name the primary file or use a row-level read.Parked-on: #27377 · cli.organization-ownership-ceremony · acceptance[3] expects
ORGANIZATION_OWNERSHIP_MIGRATION_REQUIREDon a build oracle, but the served boot prints only the message (0 hits). It should defer the code to the pins, as platform-core.v18-boot-refusals acceptance[1] does.Parked-on: #27377 · platform-core.v18-boot-refusals, cli.organization-ownership-ceremony · acceptance[1] / acceptance[3]: under
os serve --devthe refusal spellsos migrate organization-ownership --dev --out PLANand--dev --apply …. The literal in the clause matches only a production serve. It should allow the optional--dev.Parked-on: #27377 · platform-core.boot-health · steps[3] / acceptance[2]: health answers 200 before the Flows/Seeds banner is flushed, so cutting the log at health-green drops the banner acceptance[2] reads. It should say to capture the log before the first non-health request.
Parked-on: #27377 · platform-core.builtin-apps-nav-render · steps[5] says 42 Setup destinations, but this run's admin payload serves 44 (Account 8). Recount, digits only.
Parked-on: #27377 · studio-authoring.first-run-loop · steps[1] says "Home → Build an app", but the control is "New in Studio", which opens Studio with the New Package dialog. steps[6]'s "Home link on the landing's top bar" was not found by role, so it is worth re-checking.
Revision note: identity-auth.default-organization-boot-invariant is revision 3 at c4c515a (scored at 3).
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcSwDXZrZg7nGjP6P3U
W3-C2b recorded: #27438 (
QA run · release-18.3.0-w3-tier1-b (89/89) · c4c515ad · 2026-10-29 · 79 PASS / 6 PARTIAL / 4 FAIL / 0 BLOCKED / 0 NOT-RUN)ui/e2e/live/record-history-display.spec.tsfails because it is stale (see checklist: re-point records-forms.field-history-tracking acceptance[2] to the record page v3 Timeline › Changes stream — the History tab it asserts was removed by design (#27055) #27492).Retests (§4 of this anchor)
The anchor assigns these to W3-C3b; this card's verdicts bear on them.
_diagnosticsand the Problems tab all call valid is refused only at publish — and one such draft rolls back the whole package release #26707, follow-up Studio: an expression field that says "Valid CEL" should read the draft's server verdict at its own path (RLS predicate, flow edge condition) #26858 / PR fix(app-shell): an expression field shows the draft's server verdict at its own path #26999): the fixes hold, since the draft verdict reaches the field. The item still fails on the save-gate half (Studio: an expression the engine refuses (RLS USING on a formula field, a null-unsafe validation predicate) keeps autosaving — the server verdict is shown on the field but never holds the save #27482) and on Studio Data › Form: closing the field inspector releases the CEL error hold and autosaves the broken formula (returnType dropped); switching object discards the held edit silently #27485.Partial coverage and fixture gaps
Parked-on: #27377 · identity-auth.auth-method-matrix · gap — A0/A4: the device-authorization variant cannot be booted (no env switch on
dev→serve). Enterprise SSO register refuses a loopback IdP (400 discovery_private_hostunless trustedOrigins names it). The OIDC and Google login-button screenshots were not taken this run. N2 is blocked on objectui#4179 (closed not_planned: no magic-link or passkey login UI).Parked-on: #27377 · integration-system.inbound-mailbox-association · gap — A1–A3: no IMAP account source, mailAssociation object or IMAP double on a stock boot (knownGaps[0] still accurate).
Parked-on: #27377 · integration-system.external-schema-drift-gate · gap — N5, the federation-free boot, was not driven. The showcase has no second federated datasource, so the "sibling still judged" half of A3 is pin-only.
Parked-on: #27377 · platform-core.serve-composition-v18 · gap — A5: an unbuilt console cannot be booted without changing a shared tree (
resolveConsolePathfalls back to the CLI's own built console), and its pin reaches only an in-process server.Parked-on: #27377 · records-forms.gantt-interactions · gap — A1/A2: auto-schedule needs a dependencies field that no stock view or object declares. The direct locked-bar half was run-proven on a reverted view overlay (
gantt.lockField: 'done').Parked-on: #27377 · records-forms.encrypted-field-behavior · gap — A3/N1: every stock boot (
os devincluded) wires a crypto provider, so the no-provider legs rest on the HTTP dogfood pin. The item should state whether that pin scores the clause.Parked-on: #27377 · records-forms.field-unique-enforcement · gap — N3/A4: the live two-org scope leg was scored from pins on a single boot.
Parked-on: #27377 · records-forms.write-answer-advisories-rollback-and-tree-delete · gap — A2/N0: an afterInsert-abort hook cannot be authored over REST on a stock boot, so it rests on the HTTP dogfood pin.
Parked-on: #27377 · records-forms.write-time-option-and-element-shape-judgement · gap — A1: a faulting visibleWhen is refused at author time (422
expression-invalid); it needs anOS_ALLOW_UNLINTED_METADATA_WRITES=1scratch boot, so it rests on the HTTP dogfood pin.Parked-on: #27377 · records-forms.v18-semantic-defaults · gap — no stock object holds more than 50 rows; the run seeded 50 scratch tasks.
Parked-on: #27377 · platform-core.lifecycle-retention-sweep · gap — the archive-success leg needs a registered
archivedatasource (unit-pinned only).Questions that need a ruling
Parked-on: #27377 · studio-authoring.validation-rules-authoring · ruling — A3 scores
invalid_initial_statefor a Studio-authored rule, but Studio's Validations tab has no input forinitialStates. Every code Studio can author enforced correctly. Either drop that code from this item, or record the missing input as a product gap.Parked-on: #27377 · records-forms.bulk-select-all-matching · ruling — beyond the 5000-row cap, the banner still says "All 5010 matching records are selected", and only the confirm dialog's "5000" shows that 10 rows are left out. A4 passed as written; should the banner name the cap?
Parked-on: #27377 · search.field-scoped-narrowing · missing clause — no clause decides whether an EMPTY override (
searchFields: [],$searchFields=) narrows. Today it is read as absent (unnarrowed 200), while['']is 400.Parked-on: #27377 · platform-core.metadata-registry-serving · ruling — with two package holders,
GET /meta/dashboard/X/layerssilently returns one holder's overlay, while the package-less save and delete on that name answer 409.Parked-on: #27377 · platform-core.settings-organization-isolation-and-platform-rung · missing clause — an org admin can save over its own LOCKED tenant row, which is consistent with a lock that binds only lower rungs. No clause asserts it either way.
Checklist-accuracy findings (ledger edits for the devx lane)
Parked-on: #27377 · studio-authoring.expression-editors · accuracy — fixtures.knownGaps[4]: stale "The editor half has no open card" → should say: #26858 was filed and closed by PR #26999 (in the subject). The field now shows the draft's server verdict after the re-read, but the save is still not held (#27482), so acceptance[2] and [4] still fail, now on the hold.
Parked-on: #27377 · records-forms.field-history-tracking · accuracy — negative[3] is a cross-reference guard, not an assertion. Move it out of
negative[]; the re-point of acceptance[2] is #27492.Parked-on: #27377 · studio-authoring (org-scope-flows, flow-status-matches-runtime, validation-rules-authoring, hooks-tab-authoring, actions-tab-presets, interfaces-create-dialogs) · accuracy — negative[1] in each is a
SCOPE:pointer to another item, not an assertion. Move them to notes so the items can derive cleanly. This record excluded them from the derivation.Parked-on: #27377 · studio-authoring.object-api-tab-curl · accuracy — negative[0]: "(a value of the wrong type for its field)" should also cover a right-typed placeholder id that names no record (#27490).
Parked-on: #27377 · search.global-search-skips-unreadable · accuracy — fixtures.requires[2]: stale "'last_login_ip' is null on every row (a direct sign-in sends no forwarded header … QA run #24593)" → should say: at c4c515a a direct sign-in stamps last_login_ip '127.0.0.1' on the admin and the signed-up member (read as admin on a fresh boot); 'role'='user' remains the usable V
Parked-on: #27377 · search.field-scoped-narrowing · accuracy — negative[1] (missing clause): stale "no clause decides whether an EMPTY override (searchFields: [] / $searchFields=) is an override" → should say: state the contract: today [] is read as absent (unnarrowed 200) while [''] is 400 INVALID_FIELD (spec search-fields.ts resolveSearchFields)
Parked-on: #27377 · records-forms.field-unique-enforcement · accuracy — steps[0], fixtures.requires[1]: stale "author qa_unique via PUT /api/v1/meta/object/qa_unique" → should say: the object must carry its package namespace prefix (NS_short, e.g. qauniq_item under namespace 'qauniq'), per the qa-feeds-disabled recipe's NAMESPACE_PREFIX note
Parked-on: #27377 · records-forms.comment-reactions-and-edit-stamps · accuracy — fixtures.requires[2]: stale "'Author a runtime permission set … through the metadata door' (door unnamed)" → should say: PUT /api/v1/meta/permission/‹name> {name,label,objects:{sys_comment:{allowRead},sys_comment_reaction:{allowRead,allowCreate,allowEdit,allowDelete} }} → 200, then POST /api/v1/data/sys_user_permission_set {user_id, permission_set}; measured working at c4c515a
Parked-on: #27377 · records-forms.delete-behavior-matrix · accuracy — steps[2]: stale "create … a field-zoo row with f_lookups = [both]" → should say: the field-zoo row also needs its required f_master_detail → a showcase_project (itself requiring an account) — create those first, on a third account that the probe does not delete
Parked-on: #27377 · records-forms.predicate-relationship-traversal · accuracy — fixtures.knownGaps[0]: stale "the scratch substitute is described as needing a scratch package — implies heavier provisioning" → should say: measured at c4c515a: runtime-only on a stock boot — POST /packages + PUT /meta/object for parent/child (script validation on the child) + PUT /meta/permission granting the child only + sys_user_permission_set bind; member parent GET 403 is the control
Parked-on: #27377 · platform-core.activation-ledger-row-contract · accuracy — A4/N5, variants, steps[2], fixtures.knownGaps[0]: stale "the catalog door's closed :type set is four (position, permission, sharing_rule, webhook); six-value scope wall" → should say: six door types — queue and assignment_rule were added (ADR-0142 D1/D5, catalog-activation.ts CATALOG_ACTIVATION_SUBJECTS; the 400 message lists all six); the scope wall is {flow, action, position, permission, sharing_rule, webhook, queue, assignment_rule}; bump variants (revision 9)
Parked-on: #27377 · platform-core.metadata-registry-serving · accuracy — A2 / steps[2]: stale "GET /meta/types is 'the richer Studio-facing listing … distinct from GET /meta'" → should say: /meta/types answers the same body as GET /meta through one handler (the pinned dogfood test asserts this); the route-ledger note 'richer types listing' is stale too
Parked-on: #27377 · platform-core.metadata-registry-serving · accuracy — A1: stale "automated.ref says the pin covers only dashboard/action/report" → should say: the pin also asserts every seeded registered type exposes its seed and the /meta vs /meta/types parity
Parked-on: #27377 · studio-authoring.multi-package-item-rows · accuracy — A3: stale "error.message is a single sentence" → should say: the message is the ruled two-sentence text ('… is sealed: it cannot be written here. GET /api/v1/meta/TYPE lists the names in use.') the pins assert
Parked-on: #27377 · studio-authoring.multi-package-item-rows · accuracy — steps[2]: stale "author an object package A owns at runtime" → should say: the object name must carry the package namespace prefix (e.g. pkga_…) or the save answers 422 NAMESPACE_PREFIX first
Parked-on: #27377 · studio-authoring.org-override-registry-gate · accuracy — steps[4]: stale "PUT /meta/object/qa_org_probe as a brand-new object" → should say: the body must declare sharingModel or it answers 422 security-owd-unset (authoring rule) before the create gate is visible
Parked-on: #27377 · platform-core.serve-composition-v18 · accuracy — fixtures.requires[1] / A4: stale "NODE_ENV=production with no storage service" → should say: the stack must declare at least one plugin — a plugin-less production stack takes the standalone SQLite default under OS_HOME and boots
Parked-on: #27377 · platform-core.v18-boot-refusals · accuracy — fixtures: stale "(none — note) the planted-shape route works with a run DB copy minus the marker plus an organization_id column on a no-tenant table" → should say: could name that planting recipe explicitly
Parked-on: #27377 · identity-auth.api-key-expiry-lifecycle · accuracy — A2: stale "verify: GET /api/v1/keys before and after the refused mint, and the count is unchanged" → should say: GET /api/v1/keys is a refusal-only mount (route-ledger.ts: signed-in 405 METHOD_NOT_ALLOWED, measured 405 at c4c515a); count keys with GET /api/v1/data/sys_api_key (total) before and after
Parked-on: #27377 · identity-auth.import-invitation-and-sso-domain-answers · accuracy — fixtures.requires[1]: stale "the dev mail transport (boot log mail capture) to read the sent message" → should say: the dev LogTransport logs subject and recipient only; read the body and set-password link from the sys_identity_email row (identity mails are persisted there, not in sys_email)
Parked-on: #27377 · identity-auth.implicit-account-linking-ownership · accuracy — fixtures.requires[2]: stale "the link from that mail's sys_email row — admin GET /api/v1/data/sys_email" → should say: identity mails (verification, reset, account invitation, change-email) are persisted in sys_identity_email, not sys_email (sys_email held only the org invitation mails at c4c515a); read the verify-email link there
Parked-on: #27377 · identity-auth.auth-method-matrix · accuracy — fixtures.knownGaps[3]: stale "registering one [@better-auth/sso provider] needs a reachable external IdP" → should say: POST /api/v1/auth/sso/register refuses a loopback IdP with 400 discovery_private_host unless its origin is in trustedOrigins, so the localhost IdP that unblocks generic OIDC does not unblock features.sso; the enterprise-SSO on-side needs a publicly routable IdP or a trustedOrigins host config
Parked-on: #27377 · identity-auth.auth-gate-held-session-raw-host-families · accuracy — fixtures.requires[1]: stale "an expiry / MFA-required policy in auth settings holds it with the other two codes" → should say: PASSWORD_EXPIRED needs password_expiry_days>0 AND a password_changed_at older than it (a fresh member never qualifies — age it in a scratch DB); MFA_REQUIRED also waits out mfa_grace_period_days (default 7) counted from sys_user.mfa_required_at, which is stamped on first sight, so require_mfa alone holds nobody for a week — s…
Parked-on: #27377 · integration-system.external-schema-introspection · accuracy — A1 (verify) + fixtures.knownGaps[0]: stale "Live on the SQLite fixture assert only the degradation contract (?schema=‹x> and repeated ?schema both answer 200 with the full set)" → should say: On the SQLite fixture ?schema=‹x> (e.g. main) answers 400 EXTERNAL_DATASOURCE_ERROR 'Cannot narrow the remote tables … named no schema for 2 of its 2 table(s)…' on both spellings (unattributedSchemaFilterError, the #24664 fix); empty ?schema= and the repeated key still answer 200 with the full set
Parked-on: #27377 · integration-system.email-template-render · accuracy — A7: stale "authed well-formed message lands (200 with result.status 'sent')" → should say: 200 with a top-level body {id, status:'sent', messageId} — no 'result' wrapper and no success envelope; refusals are {code, error} (e.g. {code:'INVALID_REQUEST',error:'JSON body required'})
Parked-on: #27377 · integration-system.email-template-render · accuracy — steps[5] / variants: stale "author a template with fromOverride + replyTo" → should say: fromOverride is an object {name?, address} (EmailAddressInlineSchema); a string is refused 422 INVALID_METADATA 'expected object'
Parked-on: #27377 · integration-system.email-template-render · accuracy — A1/A2 oracle: stale "oracle 'log' — capture the fast failure / TEMPLATE_INACTIVE error" → should say: the failure is recorded on sys_notification_delivery (status 'dead', error 'MISSING_VARIABLES: title' / 'TEMPLATE_INACTIVE: ‹name>'), not in the served log; read GET /api/v1/data/sys_notification_delivery
Parked-on: #27377 · integration-system.external-schema-drift-gate · accuracy — A0 (verify): stale "boot aborts with ExternalSchemaMismatchError" → should say: the served boot prints the renderDiffMessage lines ('✗ Object '‹o>' does not match its remote table on datasource '‹d>':' / '✗ missing_column: ‹table>.‹col>') after 'Bootstrap failed after plugins started'; the class name itself is not printed
Parked-on: #27377 · integration-system.notification-org-and-redeliver-eligibility · accuracy — fixtures.requires[2]: stale "create an ACTIVE webhook … (POST /api/v1/data/sys_webhook)" → should say: the create needs method lower-case ('post') and definition_json (e.g. '{"timeoutMs":5000}'), else 400 VALIDATION_FAILED
Parked-on: #27377 · records-forms.list-view-capabilities · accuracy — steps[3] / acceptance[4]: stale "string-form sort 'estimate_hours desc' (the objectui#2601 fixture)" → should say: the tabular view's sort is the array [{field:'estimate_hours',order:'desc'}] since #17053 (string arm retired); the clause scores the array sort reaching sort=-estimate_hours — the objectui#2601 string-crash fixture no longer exists on stock
Parked-on: #27377 · records-forms.list-view-capabilities · accuracy — steps[8]: stale "select rows and run showcase_mark_done" → should say: pick rows that are not done: Mark Done's visible gate hides it once any selected row is done (bar drops the button), and over a mixed selection the confirm reports 'N not eligible … skipped'
Parked-on: #27377 · records-forms.related-list-server-pagination · accuracy — steps[1]-[3], acceptance[1].verify, acceptance[2]: stale "Contacts under a shared 'Related' tab (?tab=related), page size 5, pager 'Page 1 of 6'; 'the related tabs exist'" → should say: at c4c515a the detail page has no tabs: primary related lists (Invoices, Projects) render as main-column sections; non-primary Contacts sits in the 'Related column' as a 5-row compact list with no pager (top=5&skip=0); paging is in its enlarged view ('26 records — enlarge'), 25 per page, 'Page 1 of 2' -> 'Page 2 of 2' (top=2…
Parked-on: #27377 · records-forms.gantt-interactions · accuracy — fixtures.knownGaps[0]: stale "direct drag on a locked leaf: recipe 'not run-proven', score blocked(fixture)" → should say: run-proven (QA run release-18.3.0-w3-tier1-b G4a): PUT /api/v1/meta/view/showcase_task.gantt adding gantt.lockField:'done' (view is overlay-allowed), drag a done bar (App wireframes) -> no PATCH, row unchanged; control drag of an unlocked bar on the same overlay -> PATCH 200; DELETE reverts. Only the auto-schedule half stays …
Parked-on: #27377 · RUNNER.md environment facts (map) · accuracy — 'A map view draws its markers under a Map failed to load banner': stale "markers drawn on a canvas under the amber banner" → should say: since objectstack#25889 a style-load failure swaps the map for its record list (Locations) — no canvas, no .maplibregl-marker; score the listed entries (filteredMarkers) against rows with a location
Parked-on: #27377 · records-forms.conditional-rules-grid · accuracy — fixtures.requires[1] / steps[2]: stale "amount is client-computed and stored as sent, so a line staged over the data API without amount carries amount null" → should say: amount is server-computed: POST /data/showcase_invoice_line {position:1,quantity:1,unit_price:29.99} with no amount stored amount 29.99 at c4c515a (and master-detail-batch-atomic pin asserts a client-sent amount does not stand); no need to send amount
Parked-on: #27377 · records-forms.conditional-rules-grid · accuracy — steps[5] / A2: stale "flip the header status to paid and save; observe cells lock; flip back to sent/draft" → should say: once an invoice is SAVED paid, Edit is disabled (invoice.object.ts edit.disabledWhen record.status=='paid'), so drive the lock/unlock by flipping status in the open edit form without saving
Parked-on: #27377 · records-forms.record-discussion-mentions · accuracy — A2 / steps[5]: stale "interleaves into the SAME feed, oldest-first" → should say: oldest-first holds on the record:discussion panel (e.g. project-detail page); the default record page (v3 stream, #27310 mergeTimelineStream) interleaves newest-first — say 'in time order' or name the surface
Parked-on: #27377 · records-forms.record-discussion-mentions · accuracy — A7 / steps[11]: stale "cycle the filter control through all four FeedFilterMode values (on the record detail)" → should say: the default record page now shows stream chips All/Activity/Discussion/Changes (TIMELINE_STREAM_FILTERS); the four FeedFilterMode values are offered by the record:discussion panel, e.g. a showcase_project record (project-detail.page.ts) — drive it there
Parked-on: #27377 · records-forms.form-dirty-guard · accuracy — A2.verify: stale "11 it() cases" → should say: 11 it() literals, 14 tests reported (the beforeunload describe runs for ModalForm and DrawerForm); cite 14/14 at c4c515a
Parked-on: #27377 · records-forms.conditional-rules-header · accuracy — steps[4..6] / A2 / A3: stale "names INV-1003 (paid) as the edit-form subject for the client lock and 'open INV-1003 (paid) ... tax_rate renders read-only'" → should say: a stored-paid invoice has NO edit surface (row Edit and record-page Edit disabled by userActions.edit.disabledWhen, no inline editor on its record page), so the client lock is observable only on an edit form whose Status is set to Paid (e.g. edit a sent invoice, flip Status) — or the item should say the disabled Edit IS the c…
Parked-on: #27377 · records-forms.conditional-rules-header · accuracy — N1: stale "'a PATCH to tax_rate on a paid invoice whose new value PERSISTS is a FAIL'" → should say: scope it to a PATCH that leaves status paid: a same-write {status:'sent',tax_rate:X} persists X by design (lock judged on the stored row)
Parked-on: #27377 · records-forms.action-param-widgets · accuracy — A0 (richtext variant): stale "'richtext→editor'" → should say: richtext renders RichTextField, whose editing surface is a ‹textarea> (identifiable by its 'Enter text…' placeholder / fields.richText.placeholder) — a DOM reader sees a textarea, which is correct
Parked-on: #27377 · records-forms.action-param-widgets · accuracy — A0 (date variant): stale "'date→date input'" → should say: date renders the date-picker widget (text input MM/DD/YYYY + date-picker-trigger), not input[type=date]
Parked-on: #27377 · records-forms.import-job-undo-cancel · accuracy — fixtures.provisioning teardown: stale "recipe teardown says delete ui/e2e/live/.auth/ after the run" → should say: runners sharing one tree should point storageState at a scratch path (a copied config) — the stock live/import-console configs all write the same ui/e2e/live/.auth/state.json, which parallel runners clobber
Parked-on: #27377 · records-forms.encrypted-field-behavior · accuracy — A3/N1: stale "verify says the clause is recorded blocked(fixture) on stock with the pin as 'evidence beside', while automated.ref (rev 6) now names an HTTP-door pin (encrypted-field-behavior.dogfood, bootStack with the provider unset in-proc…" → should say: state explicitly whether that HTTP pin on a non-stock in-process composition scores the clause (then pass) or stays beside a blocked(fixture) live leg; this run followed the clause text (blocked)
Parked-on: #27377 · records-forms.field-history-tracking · accuracy — N3: stale "negative[3] is a cross-ref scoping instruction ('do NOT re-score crud-roundtrip clause 5'), not a negative assertion, so it can only score skipped and keeps the item permanently partial" → should say: move it to traps/notes or automated prose; leave negative[] with assertions only
Parked-on: #27377 · records-forms.field-type-constraints · accuracy — A0: stale "clause names text/textarea/email/url/phone length but on the zoo only 'name' declares maxLength (f_textarea/f_email/f_url/f_phone declare none)" → should say: name the carrier: 'the text field name (maxLength 200)'; the other string types have no declared bound on the fixture
Parked-on: #27377 · records-forms.field-type-constraints · accuracy — A5 / steps[6] / knownGaps[2]: stale "the out-of-scope-existing-id boundary is phrased against lookupFilters, but the one lookupFilters carrier (showcase_invoice.account status!=churned) is also guarded server-side by the app's script rule no_invoice_for_churned_ac…" → should say: demonstrate the existence-only boundary on the dependsOn carrier (showcase_invoice.contact from another account -> 201), and note the churned-account case is refused by the app rule, not the reference gate
Parked-on: #27377 · records-forms.encrypted-field-behavior · accuracy — steps[0]: stale "'on a provider-wired boot ('os serve', LocalCryptoProvider)'" → should say: the canonical 'os dev' boot (which spawns 'serve --dev') wires LocalCryptoProvider too; this run's os dev boot wrote aes-256-gcm ciphertext
Parked-on: #27377 · records-forms.field-history-tracking · accuracy — A2 / N1 / steps[3] / automated.ref: stale "'the History TAB gates on OBJECT-level enable.trackHistory … the account detail renders the tab'; automated.ref says record-history-display.spec.ts holds the flag-true half" → should say: record page v3 (#27310, objectstack#27055) removed the History tab: field changes are the 'Changes' filter of the Timeline stream, fetched from sys_audit_log only when enable.trackHistory is true. Re-phrase A2 as 'the account detail's Timeline carries the field changes (sys_audit_log read) and the task detail makes no sys_aud…
Parked-on: #27377 · records-forms.field-type-matrix · accuracy — A1 / steps[2]: stale "'47 on the Specimen — Full edit form' while the form draws 49 f_* fields (f_lookups, f_users, f_owner repeat lookup/user types) — count is by TYPE, not field; location is a single 'latitude, longitude' input, not 'structured in…" → should say: say 47 TYPES across 49 f_* fields; location → its 'latitude, longitude' input, address → structured inputs
Parked-on: #27377 · records-forms.v18-semantic-defaults · accuracy — steps[0] / fixtures.requires[0]: stale "'a fresh boot: pnpm dev -- --fresh'; and no stock showcase object has >50 rows (showcase_task 11 on a fresh boot)" → should say: any own-port boot works; seed >50 scratch rows (this run POSTed 50 showcase_task rows) before the 50-row check
Parked-on: #27377 · studio-authoring.object-designer-roundtrip · accuracy — steps[1]: stale "Keep the pre-selected OWD choice and Create" → should say: …and click 'Save as draft' (the dialog's button)
Parked-on: #27377 · studio-authoring.record-page-roundtrip · accuracy — steps[0], acceptance[0], negative[0]: stale "create form = Label/Name/Page type/Object; regions seeded non-empty; regions [] is #1541 regressed" → should say: the create form has a Kind field; a record page defaults to kind 'slotted' with regions [] by design (anchors.ts createSeed); choose Kind = full to get the regions seeded from the synthesized default incl. record:highlights, and score the blank-canvas negative only on an explicit full create
Parked-on: #27377 · studio-authoring.record-page-roundtrip · accuracy — automated.ref: stale "studio-editor.spec.ts as a stable pin" → should say: on a cold vite dev console both tests can time out at getByTestId('metadata-edit-page') (5 s) while the page still shows 'Loading…'; warm rerun passes - warm the console first
Parked-on: #27377 · studio-authoring.permission-matrix-editor-ux · accuracy — steps[3]/acceptance[1]: stale "'Read all'" → should say: 'Read-only all' (buttons: Read-only all / Write all / Clear)
Parked-on: #27377 · studio-authoring.permission-matrix-editor-ux · accuracy — steps[5]/acceptance[4]: stale "the table carries min-w-[960px]" → should say: min-w-[1304px] (data-testid perm-studio-matrix inside a div.overflow-auto)
Parked-on: #27377 · studio-authoring.expression-editors · accuracy — fixtures.knownGaps[2]: stale "editor gives a non-lowerable RLS read predicate severity 'warning' and autosaves it (objectui#13061)" → should say: at c4c515a the editor raises it as an error ('…not lowerable…, so the policy is dropped and grants no access') and holds autosave ('Fix the CEL syntax errors before saving.'); only the formula-field probe still diverges (knownGaps[3])
Parked-on: #27377 · studio-authoring.expression-editors · accuracy — steps[4]: stale "record.FORMULA_FIELD > 5" → should say: the RLS editor binds fields bare (placeholder 'organization_id == current_user.organization_id'); 'f_total > 5' and 'record.f_total > 5' behave the same
Parked-on: #27377 · studio-authoring.automations-rail-and-new-flow · accuracy — fixtures.requires[1]: stale "a schedule flow (implicitly: made from New automation)" → should say: Advanced -> Schedule saves no schedule config, so the rail shows it Autolaunched until a schedule (cron/interval) is set on the Start node
Parked-on: #27377 · studio-authoring.validation-rules-authoring · accuracy — A3 + steps[2]: stale "steps[2] asks for 'state_machine on the status field (initial state plus one allowed transition)' and A3 scores invalid_initial_state for the Studio-authored rule" → should say: Studio's Validations tab authors only field + transitions (ObjectValidationsPanel.tsx has no initialStates input; spec StateMachineValidationSchema.initialStates exists), so a Studio-authored state_machine can only produce invalid_transition — an insert born 'open' answered 201. Either drop invalid_initial_state from this ite…
Parked-on: #27377 · studio-authoring.object-api-tab-curl · accuracy — N0: stale "parenthetical '(a value of the wrong type for its field)'" → should say: the measured refusal is a right-typed placeholder id ('related_record_id') that names no record → 400 reference_not_found; the negative should cover dangling reference placeholders (and the auto-included owner_id), not only wrong-type values
Parked-on: #27377 · platform-core.metadata-authoring-roundtrip · accuracy — steps[0]/fixtures.requires[0]: stale "create a writable package (… POST /api/v1/packages); record its id — with no mention of dependencies" → should say: the writable package must declare dependencies:{'com.example.showcase':'*'} in its manifest; without it publish-drafts answers 200 with data.outcome 'refused' (INVALID_METADATA rule list-view-object-outside-closure: showcase_task outside the package's closure) and acceptance[1] cannot pass
Parked-on: #27377 · platform-core.lifecycle-retention-sweep · accuracy — steps[3] / acceptance[2]: stale "'the sweep report lists sys_audit_log skipped archive-pending'" → should say: the live surface exposes no sweep report (the INFO line carries applied/reaped/reclaimed/errors/alerts only, no skipped count, and no door returns report.skipped); live leg = audit row retained, the skipped/archive-pending report is unit-only (lifecycle-service.test.ts Archiver P3 case)
Parked-on: #27377 · platform-core.protocol-18-handshake-and-stored-replay · accuracy — steps[1] / steps[2]: stale "'GET /api/v1/meta/page/PLANTED and compare with the planted body' and 'boot (os start) a ^18 dist/objectstack.json built before a retirement'" → should say: (1) a row planted into sys_metadata under a running server is served from the in-memory cache — reboot on the same DB before the GET, or the read is not the row; (2) an off-tree artifact copy needs its objectstack-runtime.‹hash>.mjs beside it and resolvable node_modules, and the default host composes no connector providers of…
Parked-on: #27377 · platform-core.url-overlay-contract · accuracy — steps[5]: stale "'from a record, drill into a related record — the URL carries from=…'" → should say: a plain click on a lookup/related link opens the record peek drawer (no from=); the from= trail is on the link's href (open in page / expand), so drive the drill by following the href
Parked-on: #27377 · platform-core.metadata-authoring-roundtrip · accuracy — steps[7]: stale "'its Page type defaults to list, so set it to record'" → should say: also set Kind=full (the form shows Kind; a record page seeded from the default layout needs full — slotted copies no regions, per the item's own r7 history); Save is an icon+text button whose accessible name includes the unsaved-dot
Parked-on: #27377 · i18n.surface-matrix · accuracy — A7: stale "the served document is 'the platform face's sixteen groups … less metadataForms … so fifteen groups' and the per-app vocabulary is fifteen groups" → should say: at c4c515a TranslationDataSchema (per-app) has 16 groups (hooks added by #26831), PlatformTranslationDataSchema 17 (+settings), ServedTranslationDataSchema 16 (apps, books, dashboards, datasets, flows, globalActions, hooks, messages, objects, pages, permissions, picklists, positions, reports, settings, settingsCommon); sourc…
Parked-on: #27377 · dashboards.analytics-exposure-gate-and-measure-aggregate · accuracy — fixtures.requires[2]: stale "'an apiEnabled:false object with a cube over it and an internal:true field' in a scratch app — object names must carry the package namespace (showcase_…), or compile refuses; and stock specimens already exist" → should say: stock boot already carries specimens for the query face: sys_jwks (apiEnabled:false → 404 OBJECT_API_DISABLED via inferred cube / inline dataset) and sys_session.token / sys_api_key.key (internal → 400 INVALID_FIELD); only the configured-cube registration refusal (A2) needs the scratch app, with objects named ‹namespace>_‹name>
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcUoS2G4jgqRskpExS7
W3-UX recorded: the UI/UX browser walkthrough of the 18.3.0 RC at
c4c515ad(Console built in-repo from that commit).Generated by Claude Code