Repository navigation
QA run · surface:cli (18/18) · 251a7dd4 · 2026-10-04 · 10 PASS / 2 PARTIAL / 6 FAIL / 0 BLOCKED / 0 NOT-RUN #21721
Description
17.7 pre-release verification, non-browser half: every runnable surface:cli item against origin/main at the run's start. Sibling records for the same subject cover surface:api and surface:build. Text only; the durable truth stays in docs/qa/platform-checklist/areas/.
Environment fingerprint
- Framework (subject):
251a7dd4(fix(organizations)!: … (#21666) (#21680)), dedicated detached worktree,pnpm install --frozen-lockfile && pnpm build→ exit 0. CLI driven from the subject tree's builtpackages/clibin. - Console: not built (
.objectui-sha=ab187972); browser halves arenot-run (frontend deferred, #21696). - Scratch projects: showcase copies and
create-objectstack -t blank --skip-installscaffolds under/tmp/qa1770/{lane}(node_modulessymlinked to the subject showcase's), never inside a checkout. Boots on lane ports 43101–43209. - Execution: lanes L3 (one item), L11, L12 + verifiers V5, V6 (RUNNER rule 7), Claude Code session
session_018zT8d8NpiQ1ExhuNd5TxY6, 2026-10-04 08:10–11:10Z. Load notes as in the API record: pins that were SIGKILLed or timed out were re-run alone; every verdict rests on the clean re-run.
Scope
node scripts/checklist-select.mjs surface:cli --json → 18 runnable items, none hidden.
| item | rev | verdict | evidence (server truth / pin) |
|---|---|---|---|
| ai.mcp-stdio-fail-closed | 4 | PASS | mcp plugin.test in 37/37; no key / bad key refuse to start; principal-bound RLS + FLS; revoked key dies |
| cli.dev-boot-contract | 4 | PARTIAL | A1 /_console half not-run (frontend deferred); DB resolution order, fresh OS_HOME, port shift, stale-build warning all pass |
| cli.migrate-plan-apply-json | 2 | FAIL | A1 os migrate plan/apply cannot boot the stock showcase or a blank scaffold — product defect; A5 in_sync_partial (stale clause); format.exit-code 4/4 |
| cli.verify-verdict-exit-mapping | 1 | PASS | verify-tenancy-posture green; six-status union, exit mapping both ways, --rls 38 PROVEN · 0 HOLES |
| cli.qa-suite-execution | 6 | PASS | 7 of 8 action types; interpolation, located malformed-suite error, teardown |
| cli.flag-command-error-ux | 2 | PARTIAL | A4 not-run: the registered surface is 33 commands/topics vs the 30 the clause pins; A1–A3 pass |
| cli.migrate-meta-codemod | 3 | FAIL | A4 empty-range answer changed by fb39b385f1 (#17462, fixes #17134) — stale clause; A1–A3, A5–A8 pass |
| cli.doctor-health-report | 2 | PASS | 11 doctor-* pins green; posture error exits 1, warnings exit 0 |
| cli.doctor-deprecation-scan | 3 | PASS | doctor-deprecation-hint-commands green; 9 rows at the seeded lines |
| cli.migrate-duplicates-inventory | 4 | FAIL | A3 md5 differs (SQLite header bytes only; rows identical) — assertion defect; A4 blocked(product-bug: the migrate-plan defect); null-seam 11/11 · contract + pre-repair 7/7 |
| cli.datasource-introspect-codegen | 2 | FAIL | A6 validate on an unknown name exits 0 (vacuous ok by design, e634ecf6a) — assertion defect; A1 blocked(fixture: SQLite tables carry no schema) |
| cli.hook-body-extraction-gates | 2 | PASS | lower-callables green; seven forbidden reasons verbatim, capability inference, legacy bundle skipped |
| cli.lint-severity-exit-contract | 1 | PASS | severity groups, exit 1 on errors only, JSON reconciles, lint ⇔ build parity |
| cli.plugin-manifest-build-contract | 1 | FAIL | A2 id: "" is refused by the Zod reverse-domain rule (097d26859, #18319) — stale clause |
| cli.dev-automigrate-policy | 1 | FAIL | A6 a plain os dev (standalone stack) does not run autoMigrate:'safe' — product defect; sql-driver schema-drift 13/13 · unique-tenancy 23/23 |
| integration-system.connector-stdio-default-deny | 2 | PASS | mcp-provider 13/13; stdio denied by default and off-allowlist, boot aborts, no process spawned |
| integration-system.connector-descriptor-audit | 2 | PASS | connector-descriptor-audit 9/9; loud warning, quiet carve-outs, live re-audit on reload |
| integration-system.external-schema-drift-gate | 2 | PASS | runtime pins 39/39; fail / warn / ignore / checkOnBoot:false / armed interval |
Totals: 10 PASS / 2 PARTIAL / 6 FAIL / 0 BLOCKED / 0 NOT-RUN. The 6 failing items carry 2 product defects and 5 checklist-clause fails (one item carries both). Every fail re-derived by V5 / V6.
Fails — reproduction rules and dispositions
Product defects
cli.migrate-plan-apply-json A1 — in examples/app-showcase (or a fresh create-objectstack qa -t blank scaffold), os migrate plan --database-url file:{any}.db. Expected the plan; actual exit 1 [Kernel] Dependency 'com.objectstack.service-automation' not found for plugin 'com.objectstack.connector.openapi' (connector.rest on the scaffold); os migrate apply --json --yes → {"error":"[Kernel] Dependency …"}, exit 1. The config requests automation through requires: ['automation'], which serve resolves but the schema-migration stack never reads, while the connectors hard-depend on it. Adding AutomationServicePlugin to a scratch config makes the plan exit 0. Verifier V5: CONFIRMED, severity high — every new blank app and the showcase. Also blocks cli.migrate-duplicates-inventory A4's matched control.
cli.dev-automigrate-policy A6 — blank scaffold with one org-scoped unique:true field and no datasources; os dev -d file:A.db, stop; replace the NULL-safe index with CREATE UNIQUE INDEX uniq_scaf_item_organization_id_qa_code ON scaf_item (organization_id, qa_code); os migrate plan lists [recreate_index] … (auto-applied at boot under dev autoMigrate: 'safe'); os dev --no-watch -d file:A.db. Expected auto-reconciled recreate_index and a COALESCE index; actual the warning only, index stays bare (twice). Host configs (the showcase) and OS_MODE=off boots do self-heal; the standalone default path builds its SQLite datasource without autoMigrate. Verifier V6: CONFIRMED, medium.
Checklist clauses (no product defect)
| item · clause | disposition | what holds instead | source |
|---|---|---|---|
| cli.migrate-plan-apply-json A5 | stale clause | an in-sync showcase DB answers in_sync_partial (2 federated objects unexamined); measured on a config with the A1 workaround |
6c6157af05 (#13057, #13028) |
| cli.migrate-meta-codemod A4 | stale clause | an empty range prints ⚠ No migration step exists for protocol N → N …; "Nothing to migrate" is for a non-empty range with no changes; default --to is now 18 |
fb39b385f1 (#17462, fixes #17134) |
| cli.migrate-duplicates-inventory A3 | assertion defect | rows and _objectstack_sequences are byte-identical (what the command declares); the whole-file md5 moves on two SQLite header bytes (change counter) |
duplicates.ts:61-66; driver connect pragma (low card below) |
| cli.datasource-introspect-codegen A6 | assertion defect | datasource validate {unknown} answers a vacuous ok by design; list-tables / introspect do exit 2 |
e634ecf6a (#10537 / #10960) |
| cli.plugin-manifest-build-contract A2 | stale clause | id: "" fails the Zod reverse-domain rule with a located error; the build.ts post-parse guard is unreachable |
097d26859 (#18319) |
Partial-coverage gaps
cli.dev-boot-contractA1/_consolehalf — deferred to the post-chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696 run.cli.flag-command-error-uxA4 — the clause pins 30 variants; the registered surface is now 20 commands + 12 topics (+g), all 33 exit 0 with a USAGE block, but that count is the runner's, not the item's.cli.datasource-introspect-codegenA1 narrowing half — SQLite tables carry no schema to filter on.
Close-out follows in a comment.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 4, 2026
Close-out
os migrate plan/applyunusable on every new blank app and the showcaseBoth product defects predate 17.6.0 (#21732 since
fc8a33935c, #12952).Candidate observations — not verified, not extracted
os dev -d memory://refusal saysOS_DATABASE_URL "memory://" selects …although the user passed-d.os migrate planprints "1 table(s) to create, 1 column(s) to add" then "0 change(s)";applythen "Applied 0 change(s)" after creating them.os migrate metasays "… change(s) for this stack" while listing every semantic entry in range regardless of the stack.os dev --no-restartsays the server keeps its booted build, but the artifact watcher reloads it.migrate duplicates --object Xdoes not narrowliveConditions.afterInserthook that throws is answered 400, not 5xx;os verifylogs "Port 0 is in use";os testprintsError: Error:and stacks for plain assertion failures.Checklist-accuracy findings
g);secret,storageare new.--todefault 18).os devlogs no requests).requiredcreates no NOT NULL;relax_not_nullisneeds_confirm);widen_varcharnever fires on SQLite; a working safe op is the legacy bare-unique → NULL-safe recreate;os migrate plandoes not examine a config-declared non-default datasource.FORBIDDEN_PATTERNShas 9 entries; implicit-return arrows lower asreturn (expr);with noisExpressionkey.manifest.integritydeclares per-file artifact digests the spec says the runtime re-verifies at unpack — nothing computes them and nothing checks them #11331)" is stale for publish; the compiled manifest carries schema defaults.--jsonalso carriesstrict,failing,conversions; the "no staged suggestion fixture" knownGap can close (an expression approver withoutonEmptyApprovers).kernel:readyseed needsidx_sys_view_def_activedropped.Generated by Claude Code
objectstack-fleet commentedon Oct 6, 2026
Close-out complete: the blocked partial gaps are parked. The record closes
completedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T17:08Z. The maintainer approved clearing the openqa-runrecords' close-out debt: 「同意,动手」. ⛔ No verdict on this record is changed.Parked-on: #22017 · cli.flag-command-error-ux · A4 the clause pins 30 variants, the surface is 33
Parked-on: #22017 · cli.datasource-introspect-codegen · A1 narrowing half blocked(fixture)
cli.dev-boot-contractA1 (the/_consolehalf, deferred past chore(objectui): bump the console pin to objectui main (past 973fc20f) before the 17.7 checklist run — carries objectui#11574, #11578, #11581 and the V1 declared-node slot #21696) isnot-run. It stays on this record's handoff list (§4), and the next release-candidate Tier 1 run re-selects it.fix(driver-sql): connect reads PRAGMA auto_vacuum first and sets it o…
docs(qa): park the 24 partial-coverage gaps of the 17.7 pre-release r…