Repository navigation
QA run · area:platform-core (30/30) · 94114c1f · 2026-10-16 · 27 PASS / 1 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #23939
Copy link
Copy link
Closed
Labels
Description
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 allat that sha → 272 runnable · 2 blocked hidden · 1 planned .objectui-sha:daeb77fc84dd824e74c95b87cdede85afdb248e7. ⚠pnpm objectui:buildFAILS 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/specfroma35f7a67^(the commit before the deletion), served from a linked worktree at94114c1fwith identical framework dists.check:console-shamatches.- 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-healthr7 · P0 · mixed → passplatform-core.seed-integrityr3 · P0 · api → passplatform-core.console-loginr4 · P0 · browser → passplatform-core.nav-surfaces-renderr6 · P0 · browser → passplatform-core.metadata-registry-servingr2 · P1 · api → passplatform-core.metadata-authoring-roundtripr2 · P1 · mixed → passplatform-core.builtin-apps-nav-renderr5 · P0 · browser → passplatform-core.settings-hub-roundtripr3 · P1 · mixed → passplatform-core.package-lifecycle-enable-disabler1 · P1 · mixed → passplatform-core.notification-centerr1 · P1 · mixed → passplatform-core.shell-nav-personalizationr2 · P2 · browser → failplatform-core.app-management-toggler2 · P2 · mixed → passplatform-core.docs-audience-gater1 · P1 · api → passplatform-core.interrupted-migration-boot-reportr2 · P2 · mixed → passplatform-core.manifest-install-contractr2 · P1 · api → passplatform-core.activation-ledger-registration-homer4 · P1 · api → passplatform-core.activation-ledger-row-contractr2 · P2 · api → failplatform-core.packaged-object-extend-onlyr1 · P2 · api → passplatform-core.marketplace-install-local-lifecycler3 · P1 · api → passplatform-core.marketplace-console-honestyr4 · P2 · browser → passplatform-core.runtime-config-boot-readr1 · P1 · api → passplatform-core.docs-portal-renderr2 · P1 · browser → passplatform-core.url-overlay-contractr1 · P1 · browser → passplatform-core.keyboard-shortcut-surfacer3 · P2 · browser → partialplatform-core.home-admin-cluster-linksr3 · P1 · browser → passplatform-core.lifecycle-retention-sweepr3 · P1 · mixed → passplatform-core.seed-mode-matrixr1 · P1 · api → passplatform-core.theme-mode-persistencer2 · P2 · browser → passplatform-core.console-installability-indicatorsr1 · P2 · browser → passplatform-core.settings-audit-secret-fingerprintr1 · 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-personalizationclause 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-contractclause 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 failedplatform-core.metadata-registry-serving: packages/qa/dogfood: vitest run meta-types-create-seed + package-first-authoring --maxWorkers=1 -> 2 files, 11 passed / 0 failedplatform-core.metadata-authoring-roundtrip: package-first-authoring.dogfood.test.ts in the dogfood batch above -> greenplatform-core.settings-hub-roundtrip: packages/services/service-settings: vitest run src/settings-routes.test.ts --maxWorkers=1 -> 31 passed / 0 failedplatform-core.docs-audience-gate: packages/spec: vitest run src/system/book.test.ts --maxWorkers=1 -> 40 passed / 0 failedplatform-core.interrupted-migration-boot-report: packages/runtime: vitest run src/migration-recovery-plugin.test.ts --maxWorkers=1 -> 11 passed / 0 failedplatform-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/0platform-core.activation-ledger-row-contract: objectql action-activation.test.ts + lifecycle (132 passed/0); service-automation flow-activation-ledger 49/0; dogfood 11/0platform-core.lifecycle-retention-sweep: objectql lifecycle-service.test.ts + action-activation.test.ts 132 passed/0platform-core.settings-audit-secret-fingerprint: service-settings settings-audit-secret-digest.test.ts 7 passed/0
Fixture gaps
platform-core.docs-audience-gateclause 1: stock showcase authors no permissionSet-audience book; filled this run by runtime-authored books in a writable package (torn down)platform-core.notification-centerclause 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 freshmaintree/_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.jsonwas 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/, andgit statusis 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, butDELETEremoves it from the live server. - Doc-to-doc links render
href="/docs/NAME"without the/_consolebase. Open-in-new-tab or a copied link answers 404ENDPOINT_NOT_FOUND.
Checklist-accuracy findings from this area close out on the wave anchor #23878; they are not extracted.
Reactions are currently unavailable
Activity
objectstack-fleet commentedon Oct 16, 2026
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: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:
installedAdditiveNote) and Docs portal: doc-to-doc links render href="/docs/NAME" without the /_console base, so open-in-new-tab or a copied link answers 404 ENDPOINT_NOT_FOUND objectui#12686 (doc-to-doc links lack the/_consolebase).all, 272 items) and extract every new failure into its own card #23878.Closed by the
domain:devxseat 1 PM (seat post #6023) ·os-sales·session_014eFvbvGK4FjXvscggDNTD4, as part of the paced close-out of the #23878 wave.Generated by Claude Code