Repository navigation
QA run · surface:cli (21/26) · 580fd4ed · 2026-10-20 · 12 PASS / 9 PARTIAL / 0 FAIL / 0 BLOCKED / 5 NOT-RUN #24786
Description
QA run record for the 18.0 round-3 top-up, server half (2): surface:cli. The anchor is #24579. The maintainer approved this top-up, dispatched from session session_01CfRDy7SuTfUqaTu2AEH2Hi on 2026-10-20. Earlier rounds ran at 5b14b7f3 (round 1, cli area record #24551) and ba4afcc2 (round 2, Tier 1 record #24598). Sibling records from this round: surface:build (filed next) and the walled pass #24783.
Environment fingerprint
- framework:
580fd4ed3c98a1752dfb0041b45cc713644fef7e. The console was NOT built, by dispatch decision./_console/answers 503 "The ObjectStack Console is not built …", and the plugin list showsConsoleNotBuilt. - build:
pnpm install --frozen-lockfile(35 s), thenpnpm build --concurrency=2, 76/76 tasks in 10 m 24 s.check-dev-prereqsis green. - Tier 1: each pin file ran in its own vitest invocation (
npx vitest run --maxWorkers=1 FILEfrom the owning package).*.e2e.test.*files ran withOS_TEST_TIERS=nightly, everything else without it. 61 files, 05:09–05:40 UTC. - Tier 2: two runner agents ran in parallel, driving the built CLI (
node packages/cli/bin/run.js,@objectstack/cli/18.0.0-next.5, node v22.22.0) on scratch copies, 05:09–05:26 UTC.- One runner had boot-free items. The other had boot-needing items: at most one server of its own at a time, each on a random high port with its own file DB, and
OS_PORTexported beside-p. - Seed admin
admin@objectos.ai.
- One runner had boot-free items. The other had boot-needing items: at most one server of its own at a time, each on a random high port with its own file DB, and
- Tier 3: deferred, not run.
checklist-select.mjs surface:cli --jsonresolved 26 runnable items. Revisions are listed below.
Scope (selector surface:cli, 26 items; revision each)
- Tier 1 (16):
ai.mcp-stdio-fail-closedr6 ·automation.flow-authoring-refusals-v18r3 ·cli.migrate-plan-apply-jsonr6 ·cli.verify-verdict-exit-mappingr2 ·cli.datasource-introspect-codegenr6 ·cli.dev-automigrate-policyr3 ·cli.migrate-meta-write-stored-and-allr2 ·cli.organization-ownership-ceremonyr2 ·cli.meta-package-flags-and-explainr2 ·cli.validate-v18-authoring-verdictsr1 ·cli.verify-derived-proof-familiesr2 ·integration-system.connector-stdio-default-denyr2 ·integration-system.connector-descriptor-auditr2 ·integration-system.external-schema-drift-gater3 ·platform-core.v18-boot-refusalsr4 ·platform-core.serve-composition-v18r2 - Tier 2 (6):
cli.dev-boot-contractr5 (P0) ·cli.qa-suite-executionr7 ·cli.migrate-meta-codemodr5 ·cli.doctor-health-reportr4 ·cli.migrate-duplicates-inventoryr8 ·cli.hook-body-extraction-gatesr4 - Tier 3 (4, not run):
cli.flag-command-error-uxr3 ·cli.doctor-deprecation-scanr3 ·cli.lint-severity-exit-contractr1 ·cli.plugin-manifest-build-contractr3 - P0 items (4):
ai.mcp-stdio-fail-closed,cli.dev-boot-contract,cli.organization-ownership-ceremony,platform-core.v18-boot-refusals.
Tier 1: pins (RUNNER rule 6, evidence = the pin output only)
Every named file collected at least one test and reported 0 failed. Coverage is read from the clauses: a pin that is a unit or spec test does not score a clause whose oracle is a live os validate exit, a REST door or a log line, unless the pin itself drives that CLI or door.
ai.mcp-stdio-fail-closed(P0) → PARTIAL.- Pin:
mcp/src/__tests__/plugin.test.ts17 passed. - Covers a[0], a[1], a[7]. Uncovered: a[2]–a[6] (live member-keyed MCP reads, aggregate, FLS gate, revocation).
- Pin:
automation.flow-authoring-refusals-v18→ PARTIAL.- Pins, 9 files, 662 passed:
flow-value-slot-template172,flow-text-slot-template32,flow-builtin-node-config-keys38,flow-builtin-node-config-values55,flow-bound-variable-name115,flow.test139,lint validate-expressions.flow-cel-root80,retry-policy17,anonymous-elevated-flow-gate14. - Covers a[0]. Uncovered: a[1] (
os validateexits and located refusals), a[2] (thePUT /api/v1/meta/flowdoor's 422s), a[3] (controls validate and save). These pins are spec and lint units that run neither the CLI nor the door.
- Pins, 9 files, 662 passed:
cli.migrate-plan-apply-json→ PARTIAL.- Pin:
format.exit-code4 passed. Covers a[2] only, as the ref says. Uncovered: a[0], a[1], a[3]–a[6].
- Pin:
cli.verify-verdict-exit-mapping→ PARTIAL.- Pin:
verify-tenancy-posture7 passed. Covers a[4] only. Uncovered: a[0]–a[3].
- Pin:
cli.datasource-introspect-codegen→ NOT-RUN.- Pins, 3 files:
remote-tables-twin.equivalence10,external-datasource-service42,envelope-unwrap12 passed. - They cover only acceptance[0]'s narrowing half, so no full clause; a[0]–a[5] need the run.
- Pins, 3 files:
cli.dev-automigrate-policy→ PARTIAL.- Pin:
sql-driver-schema-drift13 passed. Covers a[2]. Uncovered: a[0], a[1], a[3]–a[5].
- Pin:
cli.migrate-meta-write-stored-and-all→ PASS.- Pins, 5 files:
test/migrate-meta-write23,meta.report-order21,semantic-relevance22,canonicalize-stored-flow40,refused-shapes46 passed. - The CLI pins drive the command over fixture trees.
- Pins, 5 files:
cli.organization-ownership-ceremony(P0) → PASS.- Pins, 8 files, 168 passed:
apply-flags7,organization-ownership-apply112,occupancy.integration5,dialect19,apply-organization-ownership-gate.integration5,comment-reactions.integration7,host-supplement.integration7,release-refusal6. - Also corroborated live; see "Closed-card verification" (platform-checklist + cli: three findings from the 18.0 QA sweep at 5b14b7f3 — two clauses mis-asserted against documented contracts, and a refusal that prescribes a withdrawn command (family card) #24567 row 3).
- Pins, 8 files, 168 passed:
cli.meta-package-flags-and-explain→ PASS.- Pins, 5 files:
register-package8,delete-reset-carriers29,register-force7,explain-rule-id14,delete-noop-line7 passed.
- Pins, 5 files:
cli.validate-v18-authoring-verdicts→ PARTIAL.- Pins, 7 files:
define-seed-record-keys9,validate-field-existence-spellings31,stack-duplicate-entry138,master-detail-required24,stack-cbp-extension-master12,validate-component-props89,stack-email-sms16 passed. - Covers a[0]. Uncovered: a[1] (each arm fails
os validate, exit ≠ 0, and build refuses) and a[2] (the controls pass). These are spec and lint unit pins and none runs the CLI.
- Pins, 7 files:
cli.verify-derived-proof-families→ PASS.- Pins, 5 files, 3 passed each:
verify-reference-shapes,verify-delete-behaviors,verify-unique-scopes,verify-parent-write-reach,verify-dashboard-windows. They cover a[0] and a[2] (each file's NEGATIVE CONTROL, including "reports a cascade a hook undid … exits 1"). - a[1] was run live, because the pins use their own fixtures, not the showcase.
os verify --reference-shapes --delete-behaviors --unique-scopes --parent-write-reach --dashboard-windows --jsonon a showcase copy gave exit 0,hardFailures: 0, and all five reports present (referenceShapes,deleteBehaviors,uniqueScopes,parentWriteReach,dashboardWindows). uniqueScopes.boot.legs.acrossreadsnot-runonsingle, which is the item's declared posture.
- Pins, 5 files, 3 passed each:
integration-system.connector-stdio-default-deny→ PASS. Pin:mcp-provider19 passed.integration-system.connector-descriptor-audit→ PARTIAL.- Pin:
connector-descriptor-audit9 passed. Covers a[0]. Uncovered: a[1], a[2].
- Pin:
integration-system.external-schema-drift-gate→ PARTIAL.- Pins:
external-validation-plugin17,external-validation-checkonboot13,list-diagnosed-consumer-sweep9 passed. - Covers a[1]–a[6]. Uncovered: a[0] (the live boot-abort arm, as the ref says).
- Pins:
platform-core.v18-boot-refusals(P0) → PASS.- Pins:
organization-ownership-boot-guard22,…boot-guard.kernel9,authz-identity-objects-boot-refusal3 passed.
- Pins:
platform-core.serve-composition-v18→ PASS.- Pins:
serve-config-boot-residual.integration14,serve-organization-record-page.e2e2 (nightly tier),serve-datasource-mapping-before-sync.integration2,datasource-mapping-before-schema-sync3,serve-no-storage-boot-guard.integration5,console.not-built15 passed.
- Pins:
Tier 2: driven by hand
cli.dev-boot-contract (P0) → PARTIAL
Boot: OS_PORT=P pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p P -d file:RUN/dev/data.db.
- a[0] → blocked, environment (the console is not built, by dispatch decision).
- Health answered 200 after about 20 s.
GET /api/v1/ready→{"success":true,"data":{"status":"ready","state":"running"}}./_console/→ 503 "Console is not built", so the console leg could not be consulted.
- a[1] → pass.
- Boot 1: sign-in as admin@objectos.ai / admin123 → 200. A wrong-password control → 401 INVALID_EMAIL_OR_PASSWORD.
- Boot 2 on the same DB with
--admin-password changed99: admin123 → 200, same user id and createdAt; changed99 → 401.
- a[2] → pass. The Database line printed per variant:
-d file→ that file.-d :memory:→:memory:with SqlDriver(better-sqlite3).OS_DATABASE_URLandDATABASE_URL→ their files.- Config-declared default datasource (scratch stack) → its file, and no
.objectstack/datawas created. - Legacy
dev.db→ that file, with the notice. - Nothing chosen →
file:CWD/.objectstack/data/objectstack.db.
- a[3] → pass.
🧪 Fresh OS_HOME: /tmp/objectstack-dev-…, with the DB inside it. The directory was gone after SIGINT.showcase_external.dbside files are the documenteddev --freshclaims the tempdir owns ALL persistent state, but app-declared cwd-relative datasource paths still write into the project tree and survive exit #5594 carve-out.
- a[4] → pass.
↪ server bound to port 47732 (requested 47731), and both ports answered health 200. - a[5] → pass.
- After touching
src/ui/actions/index.ts:⚠ dist/objectstack.json is OLDER than your sources — this boot serves the STALE build., then the newest-source and fix lines. - The server still came up.
- After touching
- a[6] → pass.
- In an empty directory: EXIT=1, stdout
✗ Config file not found in …, stderrRun in a directory with objectstack.config.ts, pass --artifact PATH-OR-URL (angle brackets in the original), or run from the monorepo root.
- In an empty directory: EXIT=1, stdout
- negative[0]–[3] → pass.
- A planted row survived a nothing-chosen restart.
--database-driver memory→ oclif allowlist error, exit 2.OS_DATABASE_DRIVER=memory|mingo|in-memory→ exit 1 before any Database line.-d memory://and-d mingo://→ refused after the Database line, exit 1, naming--freshand:memory:.- With a legacy
dev.dbpresent, no freshobjectstack.dbwas created. - The shifted port was always the one reported.
- steps[8] exit codes: plain dev SIGINT → 0;
--freshSIGINT → 130;--freshSIGTERM → 143; no config → 1.
cli.qa-suite-execution → PASS
Boot: OS_PORT=P pnpm dev -- --fresh -p P.
- a[0] → pass. Bare
os test --url … --token …from examples/app-showcase:Found 1 test suites.✅ … [health-liveness] (42ms)and✅ … [category-create-read-roundtrip] (194ms)SUCCESS: All 2 scenarios passed., EXIT=0, and green again on a second run.- The category list was the same 4 rows before and after both runs.
- a[1] → pass.
- A no-teardown copy passed reading back via
{{categoryId}}. - An independent GET found exactly one created row.
- A GET of the literal
{{categoryId}}→ 404.
- A no-teardown copy passed reading back via
- a[2] → pass.
Assertion failed: data.status expected degraded, got okunderStep Failed: GET health expecting degraded, EXIT=1. - a[3] → pass.
… data.nope cannot be evaluated by 'contains' — expected an array or a string at that path, got undefined … Use 'is_null' … - a[4] → pass.
qa/a-malformed.test.json is not a valid Quality Protocol suite (TestSuiteSchema):/✗ scenarios.0.steps: Invalid input: expected array, received undefined.- No Scenario line followed it; the sibling suites still ran. EXIT=1.
- a[5] → pass. The scenario failed (❌), and the created row was gone after teardown.
- a[6] → pass.
- ✅ api_call, wait, create_record, read_record, update_record, delete_record, query_records.
- ❌
Unsupported action type in HttpAdapter: run_script.
- a[7] → pass. Bare
os testtook 4.9 s;'qa/**/*.test.json'took 4.4 s, with the same suite in sorted order. - negative[0]–[4] → pass.
- Zero match:
Found 0 test suites.…Exiting 0 — an empty match is not a failure., EXIT=0; with--fail-on-empty, EXIT=1. - With no token, health passes (✅) and the roundtrip fails (❌) with HTTP 401.
- Zero match:
cli.migrate-meta-codemod → PASS
Planted on a scratch showcase copy: ui/Dashboard:refreshInterval and data/Object:externalSharingModel.
- Registries: retired-defs 224, retired-keys 273, semantic 483.
- a[0] → pass.
Applied 5 mechanical change(s):includes:dashboards[1].refreshIntervalSeconds: refreshInterval → refreshIntervalSeconds (dashboard-refresh-interval-to-refresh-interval-seconds)objects[13].externalSharingModel: externalSharingModel → (removed) (object-external-sharing-model-removed)
- a[1] → pass. The md5 list of 162 files was identical across 4 no-write runs.
- a[2] → pass.
- The snapshot is migrated, and
✓ Migrated stack is schema-validagrees withschemaValid: true. - A
pollIntervalprobe →⚠ Migrated stack does not yet pass schema validation …withschemaValid: false.
- The snapshot is migrated, and
- a[3] → pass.
- The written tree run
--from 17has no Applied block, EXIT=0. - Identical runs diff empty.
--from 18→⚠ No migration step exists for protocol 18 → 18 … not a finding that the metadata is canonical.
- The written tree run
- a[4] → pass.
--from 15→✗ Cannot migrate from protocol 15: the chain's support floor is 16 (ADR-0087 D3), exit 1; with--json→unsupported_from_major, exit 1. - a[5] → pass. 406
⚠ [protocol N]advisories, separate from the Applied lines. - a[6] → pass.
--jsonexit 0, and--write --jsonexit 0. - a[7] → pass.
Wrote 5 of 5 mechanical change(s) into 3 file(s):then✓ Re-ran the chain over the written sources: no mechanical change remains.diff -rshows only the 5 listed hunks.- A spread plant →
not written [spread].
- negative[0]–[6] → pass.
cli.doctor-health-report → PASS
Run in a scaffold (create-objectstack blank, workspace-linked) and at the monorepo cwd.
- a[0] → pass. The unconditional rows print; there is no
@objectstack/specrow in the scaffold; the NODE_ENV row prints only while NODE_ENV is unset. - a[1] → pass.
.envholdingOS_TENANCY_POSTURE=isolatd→✓ Environment files .env … — OS_TENANCY_POSTURE from .env, plus the posture error row, exit 1. - a[2] → pass.
✗ Tenancy posture OS_TENANCY_POSTURE="isolatd" is not a recognized tenancy posture …; the later sections still print; exit 1, with no "Could not load config". - a[3] → pass. A broken
installed-packages/broken.jsonwith no posture set →⚠ Installed packages 1 installed-package ledger entry could not be read … - a[4] → pass. Under
isolatedwith the broken ledger, no✓ Unique scopeline prints; after removing the file it prints. - a[5] → pass.
- Staged: circular, unused and orphan-view warnings, each naming its offender.
- Clean, with a view over the starter note: the three ✓ rows and
✅ Environment is healthy.
- a[6] → pass. Warnings-only runs exit 0; the posture-error runs exit 1.
- a[7] → pass.
ℹ Test coverage Skipped — no packages/spec/src in this directory (monorepo-only check)and the same for Deprecations.-vadds the→ Looked for …line; at the monorepo cwd the scans run.
- negative[0]–[5] → pass.
cli.migrate-duplicates-inventory → PASS
The fixture is a minimal scratch stack (qadup_ticket and qadup_note), seeded with SQL after one os dev boot (see accuracy finding C2).
- a[0] → pass. Every contract key is present (report
duplicate-identifiers,reportVersion2,globalPartition__global__, the counters, three preflight entries, the summary keys). The contract pin passed. - a[1] → pass. The cross-partition
0001is reported with partitions[__global__, org_…]; the within-partitionDUPXappears nowhere. - a[2] → pass. The sha256 of the row, sequence and sqlite_master dumps is identical before and after every run.
- a[3] → pass.
idx_sys_metadata_overlay_activeis blocked (qa_b_dup_view, rowCount 2), the other two are clear, andos migrate plandoes not see it. - a[4] → pass.
liveConditionsreportsglobalLastValue: 1and an org counter at 4.- With the org counter deleted the list is empty.
- With the sequences table dropped, counters.status is
absentand the duplicates are still reported.
- a[5] → pass.
.filteris null, then{object:qadup_ticket}, then{object:qadup_note}. - a[6] → pass.
OS_DATABASE_URLand--database-urlgive the same database and equal duplicates.- With a dropped table,
.skippednames it with a reason.
- a[7] → pass.
- The null-seam, contract and pre-repair pins: 3 files, 18 tests passed.
--database-url memory://qa→{"error":"boot_failed",…}, EXIT=1.
- negative[0]–[3] → pass.
--json→Nonexistent flag: --json, exit 2 (the declared contract).- stdout is one JSON document, and the boot logs go to stderr.
cli.hook-body-extraction-gates → PASS
FORBIDDEN_PATTERNS holds 14 entries; one hook was authored per entry.
- a[0] → pass.
✗ --strict-body: 14 callable(s) lack a metadata body, with each worded reason (import and fetch → "declare a Connector recipe instead"; the host members each name their in-sandbox alternative).- Exit 1;
--json→{success:false,error:"strict-body: missing body",issues[14]}.
- a[1] → pass.
["api.read"],["api.write"], and the alias gives["api.read"]. - a[2] → pass.
["crypto.uuid"],["log"], and hash gives[]. - a[3] → pass. Declared capabilities are carried verbatim; a retired
@capabilitiescomment is inert. - a[4] → pass. The free identifier is BUNDLED with exit 0;
--strict-bodyexits 1 with the same message. - a[5] → pass.
→ Skipping legacy runtime bundle (all 9 callables are body-only), and no.mjsis left in dist. - a[6] → pass.
⚠ 14 handlers could not be lowered to a metadata body — bundled via the legacy runtime module instead (build still succeeds), with 14 lines, exit 0.--jsonbodyExtractionWarningscarries 14 records.
- negative[0]–[3] → pass. negative[4] is skipped (a scope note).
Tier 3 handover (not run)
cli.flag-command-error-ux · cli.doctor-deprecation-scan · cli.lint-severity-exit-contract · cli.plugin-manifest-build-contract. Also not run: cli.datasource-introspect-codegen, whose pin covers no full clause. A run should drive it against the showcase showcase_external datasource.
Derived item verdicts
- PASS (12): migrate-meta-write-stored-and-all, organization-ownership-ceremony, meta-package-flags-and-explain, verify-derived-proof-families, connector-stdio-default-deny, v18-boot-refusals, serve-composition-v18, qa-suite-execution, migrate-meta-codemod, doctor-health-report, migrate-duplicates-inventory, hook-body-extraction-gates.
- PARTIAL (9): mcp-stdio-fail-closed, flow-authoring-refusals-v18, migrate-plan-apply-json, verify-verdict-exit-mapping, dev-automigrate-policy, validate-v18-authoring-verdicts, connector-descriptor-audit, external-schema-drift-gate, dev-boot-contract.
- FAIL (0). BLOCKED (0).
- NOT-RUN (5): datasource-introspect-codegen and the four Tier 3 items.
- No
fail, so no reproduction rule is owed. No authentication or authorization finding on this surface.
Change against round 2 (ba4afcc)
There is no PASS → FAIL. The changes are coverage readings or environment:
automation.flow-authoring-refusals-v18andcli.validate-v18-authoring-verdicts: PASS in QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598, PARTIAL here.- Their non-test clauses have a CLI or REST oracle, and the pins are spec and lint units that drive neither. QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598 scored them as covered.
- This is a reading of coverage, not a product change: every pin still passes.
cli.dev-boot-contract: PASS in round 1 (QA run · cli (18/22) · 5b14b7f3 · 2026-10-19 · 17 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 4 NOT-RUN #24551; round 2 did not rerun it), PARTIAL here. The cause is a[0]'s console leg on a tree without a console build, which this round chose not to build.cli.verify-derived-proof-families: PASS both times. This round adds the showcase live leg for a[1].cli.organization-ownership-ceremony: PASS both times. The pin count is now 8 files and 168 tests (7 files and 162 tests in QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598).- Every other Tier 1 item: same verdict as QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598.
- Tier 2 items not rerun in round 2: the same PASS as round 1, except dev-boot-contract.
Closed-card verification (fixes from earlier rounds, re-measured at 580fd4e)
- A list view bound to an object outside the writing package's dependency closure skips the field-reference check: unknown
columnsfields are accepted (200 active, draft → publish) where the same body is refused 422list-view-field-unknown#24563, list view outside the writing package's closure: the fix holds. Measured on asingleshowcase boot (scratch copy,os dev --seed-admin, own DB).POST /api/v1/packagescreatescom.qa.vfy3(no dependencies).PUT /api/v1/meta/view/showcase_task.qavfy_r1?package=com.qa.vfy3with columnstitleandzzz_nope→ 422 INVALID_METADATAlist-view-object-outside-closureatviews[0].data.object.- The draft save is 200, then
POST /packages/com.qa.vfy3/publish-drafts→outcome: "refused", failedCount 1, with the same rule. - Binding
nosuch_obj→ the same 422. - Controls: the overlay (no
?package) → 422list-view-field-unknownatviews[0].columns[1].field. A package declaringdependencies: {"com.example.showcase": "*"}→ the same 422list-view-field-unknown, and a known field → 200. The GET of the refused view → 404.
- platform-checklist + cli: three findings from the 18.0 QA sweep at 5b14b7f3 — two clauses mis-asserted against documented contracts, and a refusal that prescribes a withdrawn command (family card) #24567, three CLI-sweep findings: all three rows hold.
- Row 1:
platform-core.v18-boot-refusalsis at r4, and acceptance[2] reads "the refused boot wrote no row and ran no D10 step …". - Row 2:
access-security.security-catalog-one-holder-and-boot-reportis at r2, and acceptance[1] reads "… 422 PLUGIN_REGISTER_FAILED whose message names each conflicting name and its holder". - Row 3, measured live on a v17-shaped SQLite: a v18 DB from
os migrate apply --yes --json, thenALTER TABLE sys_platform_setting ADD COLUMN organization_id TEXT.os migrate apply --allow-destructive --yes→ exit 1,✗ Refusing this --allow-destructive run: it would drop organization_id from sys_platform_setting, a drop the organization-ownership ceremony owns … 18.0 supports fresh installs only and does not upgrade a v17 database: keep a v17 database on a 17.x release until the 18.x release that carries the upgrade path, whose ceremony drops these columns itself … Nothing in this run was applied.--json→message: refused_organization_ownership_unmigrated,tables: ["sys_platform_setting"].- The output no longer names
os migrate organization-ownership --outor--plan-file.os migrate organization-ownership --helpEXAMPLES now show the 18.0 refusal.
- Row 1:
Checklist-accuracy findings / fixture gaps (for the anchor #24579, not extracted)
- C1
cli.migrate-duplicates-inventoryacceptance[3] verify: plan's[Registry] Registered view: …lines are on stderr at 580fd4e, not stdout; stdout is pure JSON. The conclusion still holds. - C2
cli.migrate-duplicates-inventoryfixture: stock showcase declares one org-scoped identifier (showcase_field_zoo.f_autonumber). The within-partition repeat needs a second one, and seeding it needs the partitioned unique index (uniq_OBJ_organization_id_FIELD) dropped first, after whichos migrate planreports the drop asindex_mismatch. requires[1] should say both. - C3
cli.dev-boot-contractacceptance[0]: the console leg needspnpm objectui:build. State it in requires or knownGaps; on an unbuilt tree/_console/answers 503 "Console is not built". - C4
cli.dev-boot-contract, config-default-datasource variant: the scratch stack's object must declaresharingModel, or compile fails onsecurity-owd-unsetand the boot exits 1. - C5
cli.migrate-meta-codemodsteps[6]: the warning now reads⚠ Migrated stack does not yet pass schema validation — 1 refusal left after the chain. Resolve them, then run \os validate`:`. - C6
cli.doctor-health-reportacceptance[0]: a seventh unconditional row,Package-authored scheduled work(ON or OFF), always prints, and the config block also prints aPlatform protocolrow. The clause names six. - C7
cli.hook-body-extraction-gatesacceptance[6] verify still says "the forbidden seven"; steps[0] and acceptance[0] say fourteen, and 14 is measured. - C8 Tier 1 refs that over-claim:
automation.flow-authoring-refusals-v18andcli.validate-v18-authoring-verdictslist unit pins with no clause qualifier, though their build and api clauses need the CLI or door run.cli.verify-derived-proof-familiespins use their own fixtures, so acceptance[1]'s "on the showcase" needs the live run. The same class as QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598's "Bare file-list refs over-claim". - C9
cli.qa-suite-executionrequires[0]:pnpm dev -- --fresh -p PORTboots without a console build (check:console-shaskips with "No console dist").
Observations (no clause, not filed)
- The runtime bundle filename hash (
objectstack-runtime.HASH.mjs) differed across back-to-back builds of an unchanged config: three consecutive builds of the 14-forbidden-hooks config gave three hashes. os migrate duplicates --object Xstill lists another object'sliveConditions. The command documents that--objectdoes not narrow the preflight, but says nothing onliveConditions.os testprints each failure asError: Error: ….
Times
- Environment preparation: about 12 min (install 35 s, build 10 m 24 s, prerequisite check).
- Tier 1 pins: 05:09–05:40, sequential, sharing the container with the other runs.
- Tier 2: 05:09–05:26, two runners in parallel.
- Closed-card checks: 05:30–05:33.
Activity
docs(qa): round 12 — automation: trigger-status-contract's INVALID_SI…
objectstack-fleet commentedon Oct 20, 2026
Closure complete (checklist-test §5): this record has no FAIL and extracts no card.
Parked-on: #24579 · checklist-accuracy findings C1–C9, the partial coverage and the Tier 3 not-run handover of this record (rolled up in #24579 comment 6284472874)
Closed by: the 18.0 QA wave dispatch session
session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's standing instruction there (2026-10-19, verbatim 「qa-run的卡片处理完的是不是可以关闭」), at 2026-10-20T13:10Z, after 18.0.0 was published.Generated by Claude Code