Skip to content

QA run · area:platform-core (30/30) · 94114c1f · 2026-10-16 · 27 PASS / 1 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #23939

Closed

Description

@objectstack-fleet

Run record for the full-checklist wave anchored on #23878 (selector all, run per area). Runner session session_01K3qUoyh1xFGoWzAACPMbXJ, dispatched by the domain:devx seat 1 PM. Protocol: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md.

Environment fingerprint

  • framework: 94114c1f269f6b3d885f24b6f4689dce29504574 (origin/main at run start; pnpm install --frozen-lockfile && pnpm build, 75/75 green)
  • resolver: node scripts/checklist-select.mjs all at that sha → 272 runnable · 2 blocked hidden · 1 planned
  • .objectui-sha: daeb77fc84dd824e74c95b87cdede85afdb248e7. ⚠ pnpm objectui:build FAILS on this sha (Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908). Browser/mixed verdicts ran on a console built at that same pin against @objectstack/spec from a35f7a67^ (the commit before the deletion), served from a linked worktree at 94114c1f with identical framework dists. check:console-sha matches.
  • app: showcase · boot OS_PORT=P objectstack dev --ui --seed-admin -p P -d file:…/data.db · per-runner port and DB · seeded admin + demo personas
  • browser: Playwright 1.63 on /opt/pw-browsers/chromium (Chromium 141), one context per persona
  • timestamp: 2026-10-16 (UTC) · runners:
  • G13 platform-core-1: ports [41240,41241,41242] · sequential · env 15 min / test 43 min
  • G14 platform-core-2: ports [41260,41261,41262,41263] · sequential · env 14 min / test 50 min

Scope

Selector area:platform-core (from the all resolution) · 30 runnable item(s):

  • platform-core.boot-health r7 · P0 · mixed → pass
  • platform-core.seed-integrity r3 · P0 · api → pass
  • platform-core.console-login r4 · P0 · browser → pass
  • platform-core.nav-surfaces-render r6 · P0 · browser → pass
  • platform-core.metadata-registry-serving r2 · P1 · api → pass
  • platform-core.metadata-authoring-roundtrip r2 · P1 · mixed → pass
  • platform-core.builtin-apps-nav-render r5 · P0 · browser → pass
  • platform-core.settings-hub-roundtrip r3 · P1 · mixed → pass
  • platform-core.package-lifecycle-enable-disable r1 · P1 · mixed → pass
  • platform-core.notification-center r1 · P1 · mixed → pass
  • platform-core.shell-nav-personalization r2 · P2 · browser → fail
  • platform-core.app-management-toggle r2 · P2 · mixed → pass
  • platform-core.docs-audience-gate r1 · P1 · api → pass
  • platform-core.interrupted-migration-boot-report r2 · P2 · mixed → pass
  • platform-core.manifest-install-contract r2 · P1 · api → pass
  • platform-core.activation-ledger-registration-home r4 · P1 · api → pass
  • platform-core.activation-ledger-row-contract r2 · P2 · api → fail
  • platform-core.packaged-object-extend-only r1 · P2 · api → pass
  • platform-core.marketplace-install-local-lifecycle r3 · P1 · api → pass
  • platform-core.marketplace-console-honesty r4 · P2 · browser → pass
  • platform-core.runtime-config-boot-read r1 · P1 · api → pass
  • platform-core.docs-portal-render r2 · P1 · browser → pass
  • platform-core.url-overlay-contract r1 · P1 · browser → pass
  • platform-core.keyboard-shortcut-surface r3 · P2 · browser → partial
  • platform-core.home-admin-cluster-links r3 · P1 · browser → pass
  • platform-core.lifecycle-retention-sweep r3 · P1 · mixed → pass
  • platform-core.seed-mode-matrix r1 · P1 · api → pass
  • platform-core.theme-mode-persistence r2 · P2 · browser → pass
  • platform-core.console-installability-indicators r1 · P2 · browser → pass
  • platform-core.settings-audit-secret-fingerprint r1 · P1 · api → pass

Per-clause verdicts

item # clause (short) verdict evidence
platform-core.boot-health (r7, item pass) 0 health 200 in boot window pass GET /api/v1/health 200 after 16.4s (fresh DB, port 41240); restart 13.3s
platform-core.boot-health (r7, item pass) 1 ready 200 pass GET /api/v1/ready 200 {"status":"ready","state":"running"}
platform-core.boot-health (r7, item pass) 2 no misauthored Flows warning, no ERROR in boot window pass Flows banner: 32 flows/20 bound; only 2 info lines (time_relative+schedule NOT bound, deployment policy); 0 ERROR lines in the 54-line boot window
platform-core.boot-health (r7, item pass) 3 console shell served + merged app metadata pass GET /_console/ 200 text/html; GET /meta/app?id=showcase_app 200 keys name,label,navigation,_packageId,...
platform-core.boot-health (r7, item pass) 4 served grp_data nav matches authored pass grp_data 12 object entries; diff vs src/ui/apps/index.ts: missing [] extra []
platform-core.seed-integrity (r3, item pass) 0 row counts equal authored seed pass 19 seeded objects, 0 mismatches (account 14, contact 32, project 5, task 10, invoice 12, invoice_line 5, expense_report 4, expense_line 13, field_zoo 2, ...), total 132
platform-core.seed-integrity (r3, item pass) 1 Specimen Full values verbatim pass multiselect {red,green}, f_lookup=Northwind id, f_lookups={Northwind,Contoso} ids, f_master_detail=Website Relaunch id, f_json structural match, f_vector exact
platform-core.seed-integrity (r3, item pass) 2 boot log reports seed success pass banner "Seeds: com.example.showcase 132 rows" plain, no warning sign, no [Seeder] dropped/reject line (both boots)
platform-core.seed-integrity (r3, item pass) 3 replay idempotent pass restart on same DB: count sweep diff empty (19/19 identical)
platform-core.seed-integrity (r3, item pass) 4 deliberately-unseeded fields absent pass f_user null, f_users null, f_secret null, task.cover null on all 10 tasks (expected-absent)
platform-core.console-login (r4, item pass) 0 login lands in shell /_console/home pass post-login URL /_console/home; header present, launcher with Showcase/Setup, no sidebar (by design); 0 pageerrors
platform-core.console-login (r4, item pass) 1 session survives reload pass after reload, GET /meta/app?id=showcase_app 200 items=1; get-session 200, no redirect
platform-core.console-login (r4, item pass) 2 server answers 401 after server-side sign-out pass POST /auth/sign-out 200, then same bearer GET /meta/app 401 (token still in localStorage)
platform-core.console-login (r4, item pass) 3 console returns user to login pass navigation after expiry -> /_console/login?redirect=%2Fapps%2Fcom.example.showcase%2Fshowcase_task, login form rendered
platform-core.console-login (r4, item pass) 4 re-auth restores session pass re-login lands back on showcase_task route; GET /data/showcase_task 200 total=10; wrong password -> 401 INVALID_EMAIL_OR_PASSWORD, visible error text, no cookie, no token
platform-core.nav-surfaces-render (r6, item pass) 0 smoke suite green pass showcase-smoke.spec.ts: 49 passed (3.2m), SMOKE_API_URL=localhost:41240, chromium /opt/pw-browsers/chromium
platform-core.nav-surfaces-render (r6, item pass) 1 smoke coverage current pass 49 served non-separator nav leaves in meta/app?id=showcase_app; 49 SURFACES entries; 0 uncovered by target
platform-core.nav-surfaces-render (r6, item pass) 2 bad route named state in shell pass /object_that_does_not_exist -> "Object Not Found" in main, header+sidebar alive; /page/no_such_page -> "Page Not Found"
platform-core.nav-surfaces-render (r6, item pass) 3 failures surface ErrorBoundary pass none encountered: 0 failing surfaces in suite + hand walks, so no boundary to observe (recorded explicitly)
platform-core.metadata-registry-serving (r2, item pass) 0 GET /meta lists registered types pass 200 {types,entries}; 34 entries; all 19 listed kinds present; anon GET /meta 401
platform-core.metadata-registry-serving (r2, item pass) 1 spec-derived create seeds pass dogfood meta-types-create-seed: green (dashboard seed widgets:[], action script js body, report no seed seen live too)
platform-core.metadata-registry-serving (r2, item pass) 2 GET /meta/types served pass 200 {types,entries} 34 entries with createSeed
platform-core.metadata-registry-serving (r2, item pass) 3 view/showcase_task authored shape pass listViews incl in_progress/board/gantt (14), formViews tabbed/wizard/split/quick
platform-core.metadata-registry-serving (r2, item pass) 4 GET /meta/view enumerates showcase views pass 36 views: task, project, contact, field_zoo, business_unit, inquiry families present
platform-core.metadata-registry-serving (r2, item pass) 5 object extension merged pass showcase_account: loyalty_tier select [bronze,silver,gold,platinum], linkedin_url url, csat_score number 0-100
platform-core.metadata-registry-serving (r2, item pass) 6 overlay fields are real columns + render pass PATCH {loyalty_tier:gold,csat_score:88} 200, GET readback gold/88; edit form shows Loyalty Tier/LinkedIn URL/CSAT Score
platform-core.metadata-authoring-roundtrip (r2, item pass) 0 draft PUT persists and is listed pass PUT /meta/view/showcase_task.os_qa_view_g13b?package=com.example.qa-g13-pkg&mode=draft 200 state=draft; GET /meta/_drafts lists it
platform-core.metadata-authoring-roundtrip (r2, item pass) 1 publish-drafts promotes; console renders pass publish-drafts 200 publishedCount 1 commitId cmt_b11e...; /published 200 authored body (was 404); Tasks view switcher shows "QA G13 Draft View"
platform-core.metadata-authoring-roundtrip (r2, item pass) 2 Studio authoring issues PUT /meta/page pass by hand at /_console/apps/showcase_app/metadata/page/new: PUT /meta/page/qa_g13_record_page?mode=draft 200, object qag13_probe, type record, regions seeded (page:header, record:highlights, page:tabs)
platform-core.metadata-authoring-roundtrip (r2, item pass) 3 deny: read-only package create refused pass PUT /meta/object/qag13_widget?package=com.example.showcase -> 422 WRITABLE_PACKAGE_REQUIRED; dogfood pin green
platform-core.metadata-authoring-roundtrip (r2, item pass) 4 deny: overlay on object 403 not_overridable pass PUT /meta/object/showcase_account -> 403 NOT_OVERRIDABLE; view overlay PUT succeeded 200
platform-core.metadata-authoring-roundtrip (r2, item pass) 5 malformed body refused, not stored pass PUT view with config.columns:42 -> 422 INVALID_METADATA (config.columns invalid_union); GET -> 404
platform-core.builtin-apps-nav-render (r5, item pass) 0 every Setup/Account destination renders for admin pass Setup 45/45 + Account 8/8 hand-walked, screenshots first; 0 pageerror/blank/placeholder; Browse Marketplace shows named "Failed to load marketplace - fetch failed" (knownGap egress)
platform-core.builtin-apps-nav-render (r5, item pass) 1 served nav matches authored shell + contributions pass setup: 9 group anchors (overview..advanced), 45 leaves; account: profile + inbox/security/developer groups, 8 leaves; stock list [showcase_app,setup,account]; ?id=studio {"items":[]}
platform-core.builtin-apps-nav-render (r5, item pass) 2 member: Setup refuses named, Account opens pass Mei: /apps/com.objectstack.setup -> "You don't have access to this app"; /apps/setup/system/settings/localization -> "Access denied ... requires setup.access"; Account profile renders
platform-core.builtin-apps-nav-render (r5, item pass) 3 forged member meta/app?id=setup denied at server pass Mei bearer GET /meta/app?id=setup -> 200 {"items":[]}; member app list [showcase_app, account]
platform-core.builtin-apps-nav-render (r5, item pass) 4 entry-level gate enforced as whole-app refusal pass member ?id=setup empty so nav_api_keys/settings URLs unreachable; control: account nav 8 vs 8 admin/member (presence gates only)
platform-core.builtin-apps-nav-render (r5, item pass) 5 service/object-gated entries absent not erroring pass nav_organizations absent (single-org), nav_jwks absent, nav_business_units present (sys_business_unit registered)
platform-core.builtin-apps-nav-render (r5, item pass) 6 off-capability destinations pruned pass no SSO Providers / sys_verification / sys_device_code entries in served nav, none rendered
platform-core.settings-hub-roundtrip (r3, item pass) 0 value round-trips, source = scope pass PUT localization {timezone:Asia/Tokyo} 200; GET value Asia/Tokyo source tenant (pre-PUT source was already tenant: dev seed writes host zone)
platform-core.settings-hub-roundtrip (r3, item pass) 1 effect reaches consumer pass me/localization tz UTC->Pacific/Auckland; Field Zoo f_datetime rendered 6/17/2026 2:30 pm -> 6/18/2026 2:30 am (+12h exactly)
platform-core.settings-hub-roundtrip (r3, item pass) 2 sys_setting_audit row per write pass rows localization.timezone scope tenant action set source api actor_id=admin id new_hash fnv32:...
platform-core.settings-hub-roundtrip (r3, item pass) 3 console source badge flips pass default_country: no badge -> "Overrides Default / Tenant" after save (timezone already tenant pre-run)
platform-core.settings-hub-roundtrip (r3, item pass) 4 env-pinned key locked server-side pass OS_LOCALIZATION_TIMEZONE=Europe/Paris: source env locked lockedReason "Set via env: OS_LOCALIZATION_TIMEZONE"; PUT -> 409 SETTINGS_LOCKED
platform-core.settings-hub-roundtrip (r3, item pass) 5 EnvLockBadge + non-editable pass "Locked by env" badge on Default timezone; control disabled=true
platform-core.settings-hub-roundtrip (r3, item pass) 6 test action does not fake success pass POST /api/settings/mail/test -> 400 SETTINGS_ACTION_FAILED ok:false "No delivery transport is active - the message was only logged"
platform-core.settings-hub-roundtrip (r3, item pass) 7 encrypted value stored as sec_ handle pass sys_secret sec_bcc1..., sec_3d4a... ciphertext v2:...; value_enc=handle, value null (row in sys_platform_setting, global scope)
platform-core.settings-hub-roundtrip (r3, item pass) 8 masked read positive contract pass set secrets value and cascadeChain = 8 bullets; unset ai.openai_api_key null; body has 0 plaintext; both flavours (smtp_password password, api_key encrypted:true)
platform-core.settings-hub-roundtrip (r3, item pass) 9 redaction metadata-preserving pass env-pinned OS_MAIL_SMTP_PASSWORD/OS_MAIL_API_KEY: value mask, source env, locked, lockedReason names var; PUT -> 409 SETTINGS_LOCKED
platform-core.settings-hub-roundtrip (r3, item pass) 10 echoed mask is a no-op pass flat + envelope mask PUT 200 values {}; sys_secret inventory byte-identical; new secret PUT response masked, new sec_ row; non-secret from_name stores mask literally; pin "in-process consumers still receive REAL plaintext" green
platform-core.settings-hub-roundtrip (r3, item pass) 11 anonymous denied, no enumeration pass anon GET /api/settings/localization 401 UNAUTHENTICATED; anon GET /api/settings 401 (zero namespaces enumerated)
platform-core.settings-hub-roundtrip (r3, item pass) 12 all 11 namespaces resolve pass localization, company, branding, auth, mail, sms, storage, ai, knowledge, feature_flags, lifecycle each 200 with manifest+values
platform-core.package-lifecycle-enable-disable (r1, item pass) 0 disable stops serving pass PATCH /packages/com.example.qa-g13-pkg/disable 200; GET /data/qag13_probe 200 -> 404; meta/app?id=qag13_app items [] ; meta/object list drops probe
platform-core.package-lifecycle-enable-disable (r1, item pass) 1 enable restores pass PATCH enable 200; data 200, app nav back, object listed
platform-core.package-lifecycle-enable-disable (r1, item pass) 2 uninstall de-registers pass DELETE 200; GET /packages/id 404, not in /packages, meta/object/qag13_probe 404, books/views/app gone, 0 sys_metadata rows
platform-core.package-lifecycle-enable-disable (r1, item pass) 3 commits grow per publish pass commits 1 -> 2 -> 3 across successive publish-drafts
platform-core.package-lifecycle-enable-disable (r1, item pass) 4 revert restores prior shape pass fields [title] -> publish [title,extra] -> POST commits/cmt_2687.../revert 200 -> /published fields [title]
platform-core.package-lifecycle-enable-disable (r1, item pass) 5 console: nav gone, stale deep-link named pass home "Your apps 2" without QA app; stale object link "Object Not Found" in shell; stale app link "App not available" named page
platform-core.package-lifecycle-enable-disable (r1, item pass) 6 deny on read-only package pass PATCH disable + DELETE on com.example.showcase and com.objectstack.setup -> 422 WRITABLE_PACKAGE_REQUIRED
platform-core.package-lifecycle-enable-disable (r1, item pass) 7 rows survive toggle pass 2 rows before disable, 2 rows after enable
platform-core.notification-center (r1, item pass) 0 badge = distinct topics + approvals pass payload 3 unread rows, 1 (topic,title) group + 3 pending approvals; badge 4
platform-core.notification-center (r1, item pass) 1 three tabs pass tabs: Notifications 1 / Approvals 3 / Activity feed
platform-core.notification-center (r1, item pass) 2 repeats coalesce with xN pill pass "Approval requested x3" group; expand shows 3 members
platform-core.notification-center (r1, item pass) 3 group mark-read single request pass one POST /notifications/read {"ids":[3 ids]} 200; badge 4 -> 3
platform-core.notification-center (r1, item pass) 4 mark-all-read pass after 2 new task.assigned rows badge 5; POST /notifications/read/all 200; badge 3 (approvals only)
platform-core.notification-center (r1, item pass) 5 Approvals tab + count pass tab: "3 pending approvals / View approvals"; sys_approval_request pending total 3
platform-core.notification-center (r1, item pass) 6 read-state persists across reload pass after reload all 3 rows read:true, unreadCount 0; second reload unread 0
platform-core.shell-nav-personalization (r2, item fail) 0 collapse navigates + persists pass data-state collapsed/icon; icon click routed to /showcase_account; cookie sidebar_state=false; collapsed after reload
platform-core.shell-nav-personalization (r2, item fail) 1 pin/unpin persists pass Favorites [Projects,Tasks,Accounts] pre and post reload; unpin Accounts -> [Tasks,Projects] after reload
platform-core.shell-nav-personalization (r2, item fail) 2 pinned order drag/keyboard/escape/reload pass pointer drag [P,T,A]->[A,P,T] (drop indicator seen); keyboard ->[A,T,P]; Escape unchanged; reload unchanged; pinned links cursor-grab, 0 grips
platform-core.shell-nav-personalization (r2, item fail) 3 favorites star persists pass record More actions > Add to favorites: Globex in Favorites, kept after reload; removed after unstar+reload
platform-core.shell-nav-personalization (r2, item fail) 4 recents rail survives reload pass Recent after reload: Globex, Accounts, Contacts, Delivery Operations, Invoices (top 5)
platform-core.shell-nav-personalization (r2, item fail) 5 record breadcrumbs render + navigate fail record route header has no crumb after the app pill (header text: Toggle sidebar, Showcase, PREVIEW, Search); objectui AppHeader removed object-route crumbs (objectui#12461)
platform-core.shell-nav-personalization (r2, item fail) 6 authored menu not reorderable pass 0 sortable, 14 menu links 0 cursor-grab 0 nav-pinned; planted objectui-nav-order-showcase_app reversed -> order unchanged; phone 390px: 0 sortable/grab
platform-core.app-management-toggle (r2, item pass) 0 switcher = active non-hidden apps pass admin switcher: Showcase, Setup (+QA G13 App when active); Account absent (hidden) and reachable via avatar Profile
platform-core.app-management-toggle (r2, item pass) 1 active:false removes from launcher pass writable overlay active:false -> switcher drops QA G13 App; active:true -> returns
platform-core.app-management-toggle (r2, item pass) 2 isDefault drives landing pass no default: login -> /_console/home; qag13_app isDefault -> login lands /_console/apps/qag13_app/qag13_probe
platform-core.app-management-toggle (r2, item pass) 3 member switcher accessible only pass Mei switcher: Showcase, All apps (Setup absent)
platform-core.app-management-toggle (r2, item pass) 4 AppManagementPage renders pass Applications list with Active/Default badges; per-row Open/Edit/Disable/Set default/Delete
platform-core.app-management-toggle (r2, item pass) 5 honest reporting on code-package app pass Disable/Set-default PUT -> 403 ITEM_LOCKED + error toasts; Delete (click twice) -> 200 reset:false + info toast "Nothing to delete for Showcase"; meta unchanged; writable app Disable PUT 200 takes effect
platform-core.docs-audience-gate (r1, item pass) 0 refusal distinction 401 vs 403 pass gated book anon 401 UNAUTHENTICATED; non-holder Mei 403 PERMISSION_DENIED; holder admin 200
platform-core.docs-audience-gate (r1, item pass) 1 audience vocabulary 3 ways pass public showcase_manual/qag13_pub anon 200; org (implicit pkg book) anon 401, member 200; permissionSet showcase_manager holder 200 / non-holder 403
platform-core.docs-audience-gate (r1, item pass) 2 permissionSet fails closed pass spec book.test.ts "permission-set gate FAILS CLOSED when holdings are unknown" green; unknown shape returns false in book.zod.ts:461 (no dedicated test case)
platform-core.docs-audience-gate (r1, item pass) 3 two-layer entry filter pass Mei public-book tree omits qag13_mgr_doc (admin sees it); every Mei entry fetch 200; anon public entries all 200
platform-core.docs-audience-gate (r1, item pass) 4 orphan never via public book pass anon qag13_pub tree has only qag13_open_doc; orphan qag13_orphan_doc and setup_overview direct anon fetch 401
platform-core.docs-audience-gate (r1, item pass) 5 unknown book -> implicit org book pass com.objectstack.setup / com.example.showcase tree: member 200, anon 401
platform-core.docs-audience-gate (r1, item pass) 6 locale on tree; book inline translations refused pass Accept-Language zh-CN -> showcase_index label "Showcase 示例"; repeated ?package -> 400; book.test.ts book-level translations refusal names doc.translations (green)
platform-core.interrupted-migration-boot-report (r2, item pass) 0 boot warns per interrupted run + summary pass WARN "Interrupted migration run qa-interrupted-1 (plan qa_plan ...) 1 chunk(s) with UNKNOWN outcome (0) ... No loaded plugin registers plan qa_plan ... os migrate resume --run qa-interrupted-1" + "NOT resumed automatically" line
platform-core.interrupted-migration-boot-report (r2, item pass) 1 boot proceeds, journal untouched pass health 200 ready 200 after warning; journal rows 2 before, 2 after, row diff empty; os migrate resume list wrote nothing (2 rows) and printed the same text
platform-core.interrupted-migration-boot-report (r2, item pass) 2 silence when nothing to find (arm proven) pass grep counts boot1=0, boot2=2, boot3 (after run_done)=0, same composition and DB
platform-core.interrupted-migration-boot-report (r2, item pass) 3 no journal object -> silent pass pin "skips silently when sys_migration_journal is not registered" green
platform-core.interrupted-migration-boot-report (r2, item pass) 4 throwing scan reported pass pin "reports a scan FAILURE rather than reading it as nothing found" green
platform-core.manifest-install-contract (r2, item pass) 0 incompatible refused before write pass probe-old engines.protocol ^17 -> 422 OS_PROTOCOL_INCOMPATIBLE; GET /packages/id 404; not in GET /packages
platform-core.manifest-install-contract (r2, item pass) 1 structured diagnostic pass details requiredRange ^17, rangeSource engines.protocol, protocolVersion 18.0.0, targetMajor 17, migrateCommand "objectstack migrate meta --from 17"
platform-core.manifest-install-contract (r2, item pass) 2 protocol-first precedence, 3 rungs pass prec-ok (protocol ^18, platform ^17) 201; prec-no 422 rangeSource engines.protocol; legacy engine.objectstack ^17.0.0 422 rangeSource engine.objectstack; ^18.0.0 201
platform-core.manifest-install-contract (r2, item pass) 3 no-range and unparsed admit with warning pass norange 201 + "[protocol] ... declares no engines.protocol range"; workspace:* 201 + "declares an unrecognized engines.protocol range"; both GET 200
platform-core.manifest-install-contract (r2, item pass) 4 namespace ownership 3 legs pass probe-b qa_mfp -> 422 NAMESPACE_CONFLICT naming namespace qa_mfp, owner probe-a, incoming probe-b; probe-a reinstall ?overwrite=true 201; namespace sys/base 201
platform-core.manifest-install-contract (r2, item pass) 5 namespace derived from id pass com.example.leave read-back namespace "leave" (API + sys_packages); com.example.holiday keeps "timeoff"
platform-core.activation-ledger-registration-home 0 no-automation composition serves the ledger (200, one row, 409 dispatch, update-not-delete) pass dogfood describe '#12359 — actions and NO automation service': 5/5 green incl. anti-vacuity 'automation service really is absent'
platform-core.activation-ledger-registration-home 1 with-automation: action flip + flow toggle share one table pass live: action flip 200, dispatch 409 ACTION_DISABLED, flow toggle 200; ledger rows action/showcase_mark_done + flow/showcase_task_completed, key sets carry no organization_id; dogfood 'share ONE table' green
platform-core.activation-ledger-registration-home 2 exactly one owner com.objectstack.platform-objects.activation-ledger (MOVE) pass dogfood 'exactly ONE owner' green; activation-ledger-registration.test.ts 2/2; platform-objects plugin.test.ts 'registers SysMetadataActivation under its OWN manifest' green; stock boot green
platform-core.activation-ledger-registration-home 3 datasource binding carried by registrar pass dogfood 'keeps the datasource binding' green (ledger resolves undefined, sys_automation_run same); manifest triple pinned in plugin.test.ts 22/22
platform-core.activation-ledger-registration-home 4 spec receipt: only platform-objects array lists sys_metadata_activation pass grep platform-object-names.ts: 1 occurrence (line 62) inside 'platform-objects' array (starts line 46)
platform-core.activation-ledger-row-contract 0 reads open, generic writes 405 pass GET 200; POST/PATCH/DELETE each 405 OBJECT_API_METHOD_NOT_ALLOWED naming op, allowed [get,list,aggregate,search,export]; re-read byte-identical
platform-core.activation-ledger-row-contract 1 one row per (metadata_type,name); duplicate refused by unique index pass sqlite: UNIQUE constraint failed: sys_metadata_activation.metadata_type, sys_metadata_activation.name; index uniq_..._metadata_type_name over exactly the two columns
platform-core.activation-ledger-row-contract 2 no tenant column; INSERT naming organization_id refused, control lands pass PRAGMA cols id,created_at,updated_at,created_by,updated_by,metadata_type,name,package_id,active,__search; INSERT -› 'has no column named organization_id'; control INSERT landed 1 row, deleted
platform-core.activation-ledger-row-contract 3 re-enable updates, never deletes pass after re-enable both rows same ids (fyc9Y7…, cOZTam…), count 2 unchanged, active true, updated_at bumped
platform-core.activation-ledger-row-contract 4 scope wall: rows only for flow/action fail stock shipped switch POST /api/v1/security/_activation/position/legal {enabled:false} -› 200 and writes a metadata_type 'position' row; tree has legit position/permission writer (catalog-activation.ts, ADR-0131 D3/D6)
platform-core.activation-ledger-row-contract 5 durability: no lifecycle block, rows survive restart pass object has no lifecycle block (sys-metadata-activation.object.ts:48); ledger read before stop vs after restart byte-identical
platform-core.packaged-object-extend-only 0 additive half: extension fields merged and writable pass GET /meta/object/showcase_account: loyalty_tier select[bronze..platinum], linkedin_url url, csat_score number; PATCH {loyalty_tier:gold,csat_score:87} 200, GET reads gold 87 (driven here, not cross-cited)
platform-core.packaged-object-extend-only 1 in-place add refused at both doors pass PUT no ?package= -› 403 NOT_OVERRIDABLE; PUT ?package=com.example.showcase -› 403 ITEM_LOCKED
platform-core.packaged-object-extend-only 2 refusal changes nothing pass post-refusal GET /meta/object/showcase_account byte-identical to before image; qa_inplace_probe_g14 absent
platform-core.marketplace-install-local-lifecycle 0 wiring matrix both boots pass boot A: install-local 200, /marketplace/packages 502 MARKETPLACE_PROXY_FAILED (mounted passthrough), cloud-connection/status 200; boot B (off): install-local 200, packages 404, cloud-connection 404
platform-core.marketplace-install-local-lifecycle 1 runtime-config flags agree with routes pass A: installLocal:true marketplace:true; B: installLocal:true marketplace:false — all four cells agree with route probes
platform-core.marketplace-install-local-lifecycle 2 air-gapped inline install works pass CLI 'Package installed into the running kernel' com.example.crm 4.0.0; /meta/app lists crm_app; crm_account read 3 rows; manifest cached in scratch copy .objectstack/installed-packages
platform-core.marketplace-install-local-lifecycle 3 listing per-principal pass admin entry has installedBy (+ envelope storageDir); member 200 entry listed without installedBy/storageDir; anon 401 UNAUTHENTICATED
platform-core.marketplace-install-local-lifecycle 4 purge exact + durable; reseed restores pass purge {deleted:28,skipped:0}; user row 'QA User Row G14' survives; re-purge {deleted:0,skipped:28}; restart: still 0 seed rows, sampleDataPurged:true; reseed inserted 28, flag false
platform-core.marketplace-install-local-lifecycle 5 mutating doors manage_metadata both sides pass member POST install/DELETE/reseed/purge each 403 FORBIDDEN naming manage_metadata; anon each 401; admin calls 200
platform-core.marketplace-install-local-lifecycle 6 DELETE hot-withdraws, restart keeps it gone pass DELETE 200 note 'withdrawn from the running kernel', cleanups no failed registry.uninstallPackage; crm_account 404 OBJECT_NOT_FOUND and crm_app gone pre-restart; after restart still gone, listing empty
platform-core.marketplace-console-honesty 0 nav ownership per boot pass /meta/app?id=setup group_apps: boot B = packages, packaged_automation, marketplace_installed; boot A adds marketplace_browse + cloud_connection; rendered sidebars match
platform-core.marketplace-console-honesty 1 disabled state is a configuration conclusion pass boot B /apps/setup/system/marketplace: screenshot shows muted 'App Marketplace is turned off' card with OS_CLOUD_URL hint + Back to home; data-testid marketplace-disabled present; features.marketplace false
platform-core.marketplace-console-honesty 2 Installed Apps drives same-origin reseed/purge pass Installed Apps -› Details -› More install options menu: POST /api/v1/marketplace/install-local/com.example.crm/purge-sample-data 200, .../reseed-sample-data 200
platform-core.marketplace-console-honesty 3 member: AccessDenied on enabled boot, Disabled on off boot pass boot A member: 'App Marketplace is admin-only' card, package page 0 marketplace/cloud requests; boot B member: marketplace-disabled card on both URLs
platform-core.marketplace-console-honesty 4 no transient failure flash on reload pass 4 fresh loads boot B sampled every 40ms for 5s: never 'Failed to load', settles to marketplace-disabled
platform-core.runtime-config-boot-read 0 anonymous 200 with payload pass no-session GET /api/v1/runtime/config 200: cloudUrl '', features{installLocal,marketplace,aiStudio,autoPublishAiBuilds}, branding{productName,…,pwaThemeColor}, telemetry{}
platform-core.runtime-config-boot-read 1 legacy alias byte-identical pass GET /api/v1/studio/runtime-config 200, cmp byte-identical on boot A and boot B
platform-core.runtime-config-boot-read 2 served on both boot shapes pass boot A 200 anon (marketplace:true); boot B OS_CLOUD_URL=off 200 anon (marketplace:false)
platform-core.runtime-config-boot-read 3 nothing credential-shaped pass body has no token/secret/Authorization; telemetry {} (no DSN); admin-session read byte-identical to anonymous on both boots
platform-core.docs-portal-render 0 index renders corpus equal to API pass /docs: Showcase Manual (8 articles) + Setup (1); trees list 9 docs = API /meta/doc 9 (book showcase_manual + implicit setup book)
platform-core.docs-portal-render 1 doc body renders, intra-corpus links work pass manual/showcase_index renders; clicking 'documentation guide' and 'Data' lands on /docs/manual/showcase_docs_guide and showcase_tour_data in-portal
platform-core.docs-portal-render 2 flat-doc URL redirects to canonical pass cold GET /_console/docs/showcase_tour_ui -› /_console/docs/manual/showcase_tour_ui, h1 'Guided tour — UI'
platform-core.docs-portal-render 3 per-app index scoped pass /apps/com.example.showcase/docs tree = exactly the 8 showcase_* docs; /apps/com.objectstack.setup/docs = setup_overview only; entry opened
platform-core.docs-portal-render 4 Help menu entry + member tree = member API pass member Help menu 'All documentation' -› /docs; rendered 9 entries = member API 9; all 9 open, 0 401/403
platform-core.docs-portal-render 5 no blank region pass screenshots of index, book, reader, app-scoped index all show content
platform-core.url-overlay-contract 0 drawer and form overlays push; Back closes pass review-queue ?recordId= push (history 4-›5), Back closes; task list ?form=new push, Back closes; project ?form=ID push (5-›6), Back closes
platform-core.url-overlay-contract 1 tabs/palette/shortcuts replace pass 5 tab switches: history 6-›6; palette=1 and shortcuts=1 open/close; one Back -› project list
platform-core.url-overlay-contract 2 ?tab cold-loads pass fresh tab on ...?tab=related -› Related tab active
platform-core.url-overlay-contract 3 formObject/formLink pre-link, refresh-safe pass account Invoices New -› ?form=new&formObject=showcase_invoice&formLink=account:ID; Account field 'Contoso'; reload keeps both
platform-core.url-overlay-contract 4 from trail clickable pass drill project-›Contoso carries from=; '‹ Data Platform' crumb renders, click lands on project record
platform-core.url-overlay-contract 5 recordObject mismatch fails closed pass /forms/showcase_task.form?recordId=X&recordObject=showcase_project: refusal text, 0 /data/showcase_* reads, no submit; Showcase_task (case) refused same; control loads GET /data/showcase_task/X
platform-core.keyboard-shortcut-surface 0 ? opens, ?shortcuts=1 deep-links, Esc closes, input guard pass ? -› overlay:keyboard-shortcuts count 1 + ?shortcuts=1; Esc -› 0, param cleared; cold ?shortcuts=1 -› 1; typing ? in palette input puts '?' in value, no dialog
platform-core.keyboard-shortcut-surface 1 wired accelerators fire pass Ctrl+K and Meta+K -› ?palette=1 command dialog; Meta+B/Ctrl+B toggle sidebar (data-state expanded‹-›collapsed)
platform-core.keyboard-shortcut-surface 2 sidebar displayed chord equals binding pass dialog lists Toggle sidebar '⌘ B', no bare-B row; bare b leaves state expanded; Meta+B and Ctrl+B each flip
platform-core.keyboard-shortcut-surface 3 advertised set equals wired set; five dead keys unlisted and inert pass dialog = Esc, ⌘K, ?, ⌘B only; ⌘/, N, R, ⌘E, ⌘D (Meta and Ctrl): no focus change, no URL change, no theme class change, no list refetch — 2 fresh loads
platform-core.keyboard-shortcut-surface 4 AI-chat pair listed only on its page blocked(environment) off-page half holds (no AI-chat group; Meta/Ctrl+Shift+O/S do nothing); on-page half needs an agent server, absent on the open stock boot
platform-core.home-admin-cluster-links 0 9 admin target URLs resolve pass UnifiedSidebar adminItems at pin = 9 URLs (diffed); each lands on a real page (Settings, Applications, App Marketplace, Object, Datasources, sys_user, sys_organization, Position, Settings); none hit RouteNotFound / No Apps / record 'system'
platform-core.home-admin-cluster-links 1 /system redirects once to settings; every hub entry resolves pass /apps/setup/system -› /system/settings; all 11 hub cards (/api/settings 11 manifests) open a live settings page
platform-core.home-admin-cluster-links 2 five legacy URLs redirect pass users-›/apps/setup/sys_user; organizations-›/sys_organization; roles and positions-›/metadata/position?scope=environment; permissions-›/metadata/permission?scope=environment; all render
platform-core.home-admin-cluster-links 3 member shell offers no Administration entry pass member /home: no sidebar, no admin entry; showcase app shell: no admin entry; Help menu = docs/shortcuts entries only
platform-core.lifecycle-retention-sweep 0 retention reaps on the real timer pass control boot (info): '[lifecycle] sweep: 18 policy(ies) applied, ~4 rows reaped' ~57s after boot; 3 completed 40d rows + 100d inbox row gone, no API traffic
platform-core.lifecycle-retention-sweep 1 onlyWhen spares non-terminal rows pass survivors qa_run_paused, qa_run_running (+ 5d completed control) = seeded non-terminal set
platform-core.lifecycle-retention-sweep 2 archive-declaring object never hot-deleted pass 100d qa_audit_old survives both sweeps; pin 'retains everything and reports archive-pending when the archive datasource is missing' green (report not visible in live log)
platform-core.lifecycle-retention-sweep 3 reap bounded and per-id pass pin '#5194 bounds the FIRST sweep over a large backlog' + guarded per-id cases green; live reaped count ~4 = seeded expired set
platform-core.lifecycle-retention-sweep 4 OS_LIFECYCLE_DISABLED=1 disarms pass same DB + info level: 0 sweep lines after 95s, qa_run_killswitch (40d completed) survives; armed control and idle heartbeat ('~0 rows reaped') bracket it
platform-core.lifecycle-retention-sweep 5 class vocabulary matches spec pass LifecycleClassSchema = record/audit/telemetry/transient/event (object.zod.ts:879); SYSTEM_LEDGER_LIFECYCLE_CLASSES = audit,telemetry,event (engine.ts:10714)
platform-core.seed-mode-matrix 0 upsert create/update/skip pass publish1 inserted 2; publish2 inserted 1 updated 1: A skipped (updated_at and runtime note kept), B updated same id, C new
platform-core.seed-mode-matrix 1 update only updates pass update {A,D}: inserted 0 updated 1; D absent, count 3 unchanged
platform-core.seed-mode-matrix 2 ignore only fills gaps pass ignore {A:a3,E}: inserted 1 updated 0; A keeps a2, E present
platform-core.seed-mode-matrix 3 insert never matches pass insert {A}: second A-named row (unconstrained scratch object) — duplication shape
platform-core.seed-mode-matrix 4 replace posture: bare insert, nothing cleared pass hand-row F survives replace publish declaring G; G inserted; seed-loader.ts replace arm 'just insert (caller should have cleared the table)'
platform-core.seed-mode-matrix 5 mode vocabulary five; one loader pass SeedMode enum insert/update/upsert/replace/ignore; mode = dataset.mode // config.defaultMode (seed-loader.ts:955); runtime/src/seed-loader.ts re-exports SeedLoaderService
platform-core.theme-mode-persistence 0 dark/light apply immediately and persist pass Dark: class dark + ls 'dark' within 150ms, kept after reload; Light: class light + ls 'light', kept after reload
platform-core.theme-mode-persistence 1 system/auto resolve OS preference at load pass system+emu dark -› dark; system+emu light (reload) -› light; stored 'auto' -› dark/light by emulation, never 'auto' class; live flip without reload not tracked (expected)
platform-core.theme-mode-persistence 2 no half-themed surface pass dark screenshots of capability map and task list (header, sidebar, grid) coherent; light likewise
platform-core.console-installability-indicators 0 manifest is a branded blob replacing the static link pass one link[rel=manifest] blob:; static ./manifest.json gone; boot B with OS_PRODUCT_NAME='QA Brand G14', OS_PWA_THEME_COLOR=#123456 -› blob name/short_name/description/theme_color match runtime config
platform-core.console-installability-indicators 1 offline pill both ways pass ctx offline -› 'Offline' pill 1, navigator.onLine false; restore -› 0
platform-core.console-installability-indicators 2 connection chip honest pass 'Connected' visible 0.8–2.5s after load then hidden; after backend killed -› 'Reconnecting…' from ~6.6s, persisted 20s
platform-core.console-installability-indicators 3 no service worker on stock pass navigator.serviceWorker.getRegistrations() -› 0
platform-core.settings-audit-secret-fingerprint 0 keyed digest on both ledgers, no value pass sys_setting_audit new_hash hmac-sha256:4cad5c…(64 hex), encrypted true; sys_audit_log new_value digest '‹encrypted:hmac-sha256:4cad5c…›'; V1 absent everywhere
platform-core.settings-audit-secret-fingerprint 1 no offline-reproducible fingerprint pass sha256(V1), sha256:+, sha256(JSON), fnv32(V1/JSON) -› 0 hits on both ledgers; control fnv32('"ops@example.com"')=fnv32:6d1d9810 matches from_email row
platform-core.settings-audit-secret-fingerprint 2 equal values equal fingerprint pass writes V1,V1,V2,V1 -› 4cad5c,4cad5c,122d23,4cad5c on both ledgers
platform-core.settings-audit-secret-fingerprint 3 reset records no fingerprint pass reset row action reset new_hash null; config_change new_value null, metadata event settings.reset
platform-core.settings-audit-secret-fingerprint 4 non-secret keeps unkeyed digest of canonical JSON pass mail.from_email new_hash fnv32:6d1d9810 = offline FNV-1a of the quoted JSON, on both ledgers (algorithm is FNV-1a, not SHA-256 as item says)
platform-core.settings-audit-secret-fingerprint 5 no-keyed-digest arm pass pin: 'legacy inline-adapter path with no provider…' and 'a provider that refuses a keyed digest…' green (7/7)

Reproduction rules (fails)

  • platform-core.shell-nav-personalization clause 5 (stale-spec): Checklist shell-nav-personalization clause 5 expects record-trail breadcrumbs that objectui#12461 removed from object routes
    • repro: 1) Boot showcase (os dev --ui --seed-admin), sign in as admin@objectos.ai. 2) Open /_console/apps/com.example.showcase/showcase_account/record/ID for any account. 3) Read the header. Expected (clause): app/section/record crumbs, each navigable. Actual: header shows only the app pill (Showcase), PREVIEW chip, search, inbox and avatar. No crumb links. Deterministic over 2 loads.
    • mechanism: objectui packages/app-shell/src/layout/AppHeader.tsx (pin daeb77fc), header doc and lines ~383-394: "An object route (its list, a view, a record) draws no crumb after the pill (objectui#12461)"; report and system routes still draw crumbs.
  • platform-core.activation-ledger-row-contract clause 4 (stale-spec): checklist: activation-ledger-row-contract scope wall still says only flow|action rows, but the security catalog activation door writes position/permission rows
    • repro: Fresh stock showcase boot. As admin: POST /api/v1/security/_activation/position/legal {"enabled":false} -> 200. GET /api/v1/data/sys_metadata_activation -> a row metadata_type 'position', name 'legal', active false. Expected by item r2 (acceptance[4], steps[2]): only 'flow'/'action'. Actual: legitimate third type, written by a shipped door.
    • mechanism: packages/runtime/src/domains/catalog-activation.ts (POST /security/_activation/:type/:name, type position|permission; header cites ADR-0126 §3 regime C as ADR-0131 D6 amends it and ADR-0131 D3 moving the switch into the ledger). Item's knownGaps/N4 ask for a revision when a third writer ships; its cited Ledger convergence: registration home + one store implementation + permission-set convergence (ADR-0126 §4/§8, maintainer-ruled bundle) #12159 'permission rides its own active field' ruling is superseded.

Derived item verdicts

27 pass · 1 partial · 2 fail · 0 blocked · 0 not-run (of 30).

Pin runs (Tier 1, RUNNER rule 6):

  • platform-core.nav-surfaces-render: cd g13/app (scratch copy of showcase) && SMOKE_API_URL=http://localhost:41240 OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium pnpm exec playwright test e2e/showcase-smoke.spec.ts -> 49 passed / 0 failed
  • platform-core.metadata-registry-serving: packages/qa/dogfood: vitest run meta-types-create-seed + package-first-authoring --maxWorkers=1 -> 2 files, 11 passed / 0 failed
  • platform-core.metadata-authoring-roundtrip: package-first-authoring.dogfood.test.ts in the dogfood batch above -> green
  • platform-core.settings-hub-roundtrip: packages/services/service-settings: vitest run src/settings-routes.test.ts --maxWorkers=1 -> 31 passed / 0 failed
  • platform-core.docs-audience-gate: packages/spec: vitest run src/system/book.test.ts --maxWorkers=1 -> 40 passed / 0 failed
  • platform-core.interrupted-migration-boot-report: packages/runtime: vitest run src/migration-recovery-plugin.test.ts --maxWorkers=1 -> 11 passed / 0 failed
  • platform-core.activation-ledger-registration-home: dogfood packaged-activation-ledger-reach 11 passed/0 failed; service-automation (registration+flow-ledger) 49/0; platform-objects plugin.test.ts 22/0
  • platform-core.activation-ledger-row-contract: objectql action-activation.test.ts + lifecycle (132 passed/0); service-automation flow-activation-ledger 49/0; dogfood 11/0
  • platform-core.lifecycle-retention-sweep: objectql lifecycle-service.test.ts + action-activation.test.ts 132 passed/0
  • platform-core.settings-audit-secret-fingerprint: service-settings settings-audit-secret-digest.test.ts 7 passed/0

Fixture gaps

  • platform-core.docs-audience-gate clause 1: stock showcase authors no permissionSet-audience book; filled this run by runtime-authored books in a writable package (torn down)
  • platform-core.notification-center clause 0: showcase_scheduled_digest fixture is off by deployment policy (OS_AUTOMATION_SCHEDULED_WORK_ENABLED unset); coalescing used the 3 seeded approval.requested rows instead

Environment notes

  • platform-core.boot-health: on a fresh main tree /_console/ is unavailable, because the console build at the pin fails (Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908). The console-mount clauses were scored on the workaround bundle named in the fingerprint.
  • The linked QA worktree's dist/objectstack.json was copied from the primary tree, so its marketplace install-local ledger dir resolved into the primary tree. Every install ran from a scratch copy of the app with a recompiled artifact. After the run neither tree holds .objectstack/installed-packages/, and git status is clean.

Observations for objectstack-ai/objectui (not clause fails; handed to the seat via the #23878 close-out)

  • Installed Apps note (installedAdditiveNote): it still says uninstall leaves the app registered until restart, but DELETE removes it from the live server.
  • Doc-to-doc links render href="/docs/NAME" without the /_console base. Open-in-new-tab or a copied link answers 404 ENDPOINT_NOT_FOUND.

Checklist-accuracy findings from this area close out on the wave anchor #23878; they are not extracted.

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out for this record (checklist-test §5), 2026-10-16T19:19Z. 27 pass · 1 partial · 2 fail of 30. Both fails are stale specs: the product holds and the items pin pre-ruling shapes. They are extracted to the re-point family card:

    Extracted: #23950 · platform-core.shell-nav-personalization · clause 5
    Extracted: #23950 · platform-core.activation-ledger-row-contract · clause 4
    Parked-on: #23878 · platform-core.keyboard-shortcut-surface · clause 4 blocked(environment) — the on-page AI-chat half needs an agent server, absent on the open stock boot; the off-page half holds
    

    PR #24000 (merged 2026-10-16T18:02Z) re-pointed both clauses and closed #23950. The re-run records #23998 and #23999 pass the re-pointed clauses. #23998 also failed clause 0 of shell-nav-personalization (icon-mode navigation) on a console defect, now objectstack-ai/objectui#12744.

    Other dispositions in this record:

    Closed by the domain:devx seat 1 PM (seat post #6023) · os-sales · session_014eFvbvGK4FjXvscggDNTD4, as part of the paced close-out of the #23878 wave.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions