Repository navigation
QA run · area:cli (17/17) · 94114c1f · 2026-10-16 · 16 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #23921
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:
- G9 (cli): ports [41180,41181,41182,41183,41184,41185,41186,41187,41188] · sequential · env 22 min / test 54 min
Scope
Selector area:cli (from the all resolution) · 17 runnable item(s):
cli.dev-boot-contractr4 · P0 · cli → passcli.build-own-contractr4 · P1 · build → passcli.migrate-plan-apply-jsonr4 · P1 · cli → passcli.verify-verdict-exit-mappingr1 · P1 · cli → passcli.scaffold-first-runr4 · P1 · mixed → passcli.qa-suite-executionr6 · P1 · cli → passcli.flag-command-error-uxr3 · P2 · cli → passcli.migrate-meta-codemodr4 · P1 · cli → failcli.scaffold-console-first-paintr3 · P1 · mixed → passcli.doctor-health-reportr2 · P1 · cli → passcli.doctor-deprecation-scanr3 · P2 · cli → passcli.migrate-duplicates-inventoryr6 · P1 · cli → passcli.datasource-introspect-codegenr4 · P2 · cli → passcli.hook-body-extraction-gatesr2 · P1 · cli → passcli.lint-severity-exit-contractr1 · P2 · cli → passcli.plugin-manifest-build-contractr3 · P2 · cli → passcli.dev-automigrate-policyr1 · P1 · cli → pass
Per-clause verdicts
| item | # | clause (short) | verdict | evidence |
|---|---|---|---|---|
| cli.dev-boot-contract | 0 | boot reaches health/ready; console served with --ui | pass | health 200 ~18s, /ready {"status":"ready"}; worktree boot :41184 /_console/ 200, login form screenshot, form sign-in -) /_console/home, get-session 200, LS token + better-auth cookie |
| cli.dev-boot-contract | 1 | --seed-admin fixed admin, idempotent seed | pass | restart same DB with --admin-password changed99: sign-in admin123 -) 200, changed99 -) 401 |
| cli.dev-boot-contract | 2 | DB selection follows shared matrix, persistent unified default | pass | none chosen: file:(cwd)/.objectstack/data/objectstack.db (persists after exit); env OS_DATABASE_URL honored; -d :memory: ok; datasourceMapping default -) declared file; legacy dev.db read with notice, no objectstack.db created |
| cli.dev-boot-contract | 3 | --fresh isolates OS_HOME tempdir, auto-deleted | pass | 🧪 Fresh OS_HOME: /tmp/objectstack-dev-WgrKzE, DB same filename under it; dir gone after SIGINT (exit 130); showcase_external.db survives = documented #5594 carve-out |
| cli.dev-boot-contract | 4 | busy port auto-shifts and is reported | pass | B: "⚠ Port 41180 is in use — serving on 41181 instead." + "↪ server bound to port 41181 (requested 41180)"; health :41181 200 |
| cli.dev-boot-contract | 5 | stale artifact warned, still boots | pass | "⚠ dist/objectstack.json is OLDER than your sources" newest source src/ui/actions/index.ts + fix line; health 200 |
| cli.dev-boot-contract | 6 | no config, no artifact: exit 1 with remedy | pass | exit 1; "✗ Config file not found …" + "Run in a directory with objectstack.config.ts, pass --artifact (path/url), or run from the monorepo root." |
| cli.build-own-contract | 0 | success exit 0, artifact + stats; --json keys | pass | exit 0, dist/objectstack.json 715.5 KB parses, Data/UI/Logic stats; --json has success,output,size,stats,warnings,conversions,duration (+bodyExtractionWarnings etc) |
| cli.build-own-contract | 1 | schema violation located; exit 1 json / 2 human | pass | "✗ objects.4.fields.color.type: Invalid field type ''" ; human exit 2, --json exit 1 {success:false,error,code:STACK_SCHEMA_INVALID} |
| cli.build-own-contract | 2 | author-time rules exit 1, all at once, where/message/hint/rule/path | pass | "✗ Author-time rules failed (2 issues)" both broken approvers; exit 1 both paths; issues[] carry rule approval-expression-invalid, where, path, hint, message |
| cli.build-own-contract | 3 | --json failure/advisory parity with validate | pass | schema-fail payload build {success,error,code,warnings,conversions} vs validate {valid,error,code,warnings,conversions,duration}; undeclared-key advisory string identical in build --json and validate --json warnings |
| cli.build-own-contract | 4 | #4873 exit is a status, stable on repeat | pass | success 0/0 (human, json, x2 each); load throw human 2/2, json 1/1; build == compile on same input |
| cli.build-own-contract | 5 | advisory never flips exit | pass | nested undeclared key (visibleWhen.zzzQaUndeclaredKey, strict:false): "⚠ Undeclared authoring keys (1) — dropped at load; reported here, never refused", exit 0, artifact written |
| cli.migrate-plan-apply-json | 0 | bare migrate is read-only plan, identical twice | pass | two bare runs: same plan (+ showcase_category [add_columns: qa_note] + 7 create_table); schema/rows/seq md5 unchanged across both |
| cli.migrate-plan-apply-json | 1 | plan --json shape, exit 0 | pass | keys database,managedTables(68),total,changes,pending (+composition,databaseSource,duration,unmanagedTables); exit 0 |
| cli.migrate-plan-apply-json | 2 | #4873 every --json success exits 0 | pass | plan 0, apply --json (no --yes) 0, apply --json --yes 0, recorded-by --json 0, resume --json 0 |
| cli.migrate-plan-apply-json | 3 | apply safe-by-default: drop skipped then applied | pass | apply --yes: "⚠ 1 destructive change(s) will be SKIPPED", column kept; --allow-destructive --yes: "✓ Applied 1 change(s)", column gone |
| cli.migrate-plan-apply-json | 4 | idempotent re-run, partial coverage honest | pass | plan: "⚠ No drift over the 68 object(s) … 2 of 70 … PARTIAL plan"; apply --json --yes {applied:[],skipped:[],created:[],message:in_sync_partial,coverage unexamined 2, federated 2} exit 0 |
| cli.migrate-plan-apply-json | 5 | busy DB: apply exit 1, plan warns | pass | apply: "✗ …migrate.db is in use — it is open in pid 20417" exit 1; plan exit 0 with in-use warning |
| cli.migrate-plan-apply-json | 6 | --json non-interactive confirmation_required | pass | {message:confirmation_required,hint:"pass --yes"}, DB dump unchanged, follow-up plan still lists qa_note |
| cli.verify-verdict-exit-mapping | 0 | closed six-verdict vocabulary | pass | statuses {verified:15, needs-fixture:1, skipped:8}; summary objects 24 reconciles |
| cli.verify-verdict-exit-mapping | 1 | exit nonzero exactly when hardFailures)0 | pass | stock: recomputed 0+0+0 -) exit 0; staged fidelity gap app: fidelityGaps 1 -) exit 1 (json and human); staged throwing hook: createFailed 1 -) exit 1 |
| cli.verify-verdict-exit-mapping | 2 | inconclusive split: VALIDATION_FAILED -) needs-fixture, no fail | pass | showcase_account needs-fixture code 400 VALIDATION_FAILED on exit-0 run; non-validation 400 (hook throw) -) create-failed, exit 1 |
| cli.verify-verdict-exit-mapping | 3 | --rls separate stack; holes fail | pass | --rls --json exit 0, rls section present, per-persona summary proven 21, holes 0, hardFailures 0 |
| cli.verify-verdict-exit-mapping | 4 | #5262 walled posture never quiet | pass | OS_TENANCY_POSTURE=isolated: exit 1, {"error":"verify: multiTenant=true requires the enterprise @objectstack/organizations package …"} |
| cli.scaffold-first-run | 0 | scaffold-)install-)validate-)build-)boot-)health | pass | npx create-objectstack@latest (17.7.0) -t blank --skip-skills exit 0 (pnpm install); npm run validate 0; build 0; os start --artifact :41183 health 200 at 12s, ready success |
| cli.scaffold-first-run | 1 | every template validates and builds | pass | blank (only template): validate 0, build 0 (2.4 KB artifact) |
| cli.scaffold-first-run | 2 | artifact boots via os start (protocol handshake) | pass | healthy boot, no protocol refusal in server.log (17.7.0 coherent scaffold) |
| cli.scaffold-first-run | 3 | skills boundary: set-equal, no internal skill | pass | installed unique SKILL.md names 10 == skills/ catalog 10 (diff empty); repo-root discovery lists 10, 0 hits for dogfood/checklist-test/pm-dispatch |
| cli.scaffold-first-run | 4 | never-healthy is a FAIL with server.log | pass | not triggered: healthy within budget; server.log has no error lines |
| cli.qa-suite-execution | 0 | green path, Found N)0, exit 0 | pass | "Found 1 test suites." 2 ✅ with ids+durations, "SUCCESS: All 2 scenarios passed." exit 0; second run identical, category list unchanged (teardown ran) |
| cli.qa-suite-execution | 1 | capture/interpolation threads state | pass | staged capture probe green; record QA-G9-capture-marker id nLUxhaLBIBHBF2-a read back independently 200; literal {{cid}} path -) 404 |
| cli.qa-suite-execution | 2 | false assertion fails with field/expected/actual, exit 1 | pass | "Assertion failed: data.status expected degraded, got ok" under "Step Failed: GET health expecting degraded"; exit 1 |
| cli.qa-suite-execution | 3 | #7256 unevaluable contains fails | pass | "data.nope cannot be evaluated by 'contains' … got undefined … Use 'is_null'" |
| cli.qa-suite-execution | 4 | #6247 load-site refusal, siblings still run, exit 1 | pass | "qa/a-malformed.test.json is not a valid Quality Protocol suite (TestSuiteSchema)" + "✗ scenarios.0.steps", siblings ran, "FAILED: 3 scenarios failed" |
| cli.qa-suite-execution | 5 | teardown after failed step | pass | td scenario ❌ "Step Failed: deliberate failure"; marker record count after = 0 |
| cli.qa-suite-execution | 6 | 8 action types each own verdict | pass | api_call/wait/create/read/update/delete/query ✅ (update set color #123456, delete removed target), run_script ❌ "Unsupported action type in HttpAdapter: run_script" |
| cli.qa-suite-execution | 7 | #7363 glob discipline | pass | bare os test finds qa/platform-smoke.test.json; qa/**/*.test.json finds same suite in 3.75s, exit 0 |
| cli.flag-command-error-ux | 0 | unknown flag named, nonzero, body never runs | pass | "Nonexistent flag: --frobnicate" + See more help with --help, exit 2, 0 "Migrate · plan"/"Booting schema" lines |
| cli.flag-command-error-ux | 1 | enum flag out-of-set lists allowed set | pass | "Expected --log-level=bogus to be one of: debug, info, warn, error, fatal, silent" exit 2 |
| cli.flag-command-error-ux | 2 | unknown command/topic-subcommand errors nonzero | pass | "command frobnicate not found" exit 2; "command environments:frobnicate not found" exit 2 |
| cli.flag-command-error-ux | 3 | --help exit 0 + USAGE for every variant | pass | derived 33 (20 top-level, 12 topics, g alias) = variants list; all 33 exit 0 with USAGE; root and migrate --help exit 0 |
| cli.migrate-meta-codemod | 0 | planted spellings all listed with successor | pass | "Applied 3 mechanical change(s)": views[0].list.striped (view-list-passthrough-keys-removed), retryDelayMs → backoffMs (retry-policy-converged), "10:00Z" → "10:00" (time-default-utc-suffix-dropped) |
| cli.migrate-meta-codemod | 1 | authored sources untouched; only --out written | pass | objectstack.config.ts md5 60d31e7c… identical before/after plain and --out runs |
| cli.migrate-meta-codemod | 2 | --out snapshot migrated, verdict honest | pass | snapshot: striped absent, backoffMs 2000, defaultValue "10:00"; "✓ Migrated stack is schema-valid" == --json schemaValid true |
| cli.migrate-meta-codemod | 3 | idempotent replay; empty range answered as empty | pass | canonical --from 17: no Applied block, exit 0 (368 advisories listed); --from 18: "⚠ No migration step exists for protocol 18 → 18 …"; two planted runs diff empty |
| cli.migrate-meta-codemod | 4 | below-floor --from refused | pass | --from 5: "✗ Cannot migrate from protocol 5: the chain's support floor is 16" exit 1 |
| cli.migrate-meta-codemod | 5 | semantic entries surface as advisories | pass | "440 manual change(s) require your judgment:" with why/verify text, separate from Applied block |
| cli.migrate-meta-codemod | 6 | --json exits 0 on success | pass | --from 16 --json exit 0, keys absentTodos,applied,…,schemaValid |
| cli.migrate-meta-codemod | 7 | RESTART CONDITION: no in-place rewrite flag | fail | --help now lists --write ("Rewrite the authored source files in place …") and --all; #9591 closed completed 2026-10-08 (PR #22142); runtime protocol 18 |
| cli.scaffold-console-first-paint | 0 | os validate passes on fresh scaffold | pass | npx create-objectstack@latest qa-console-first-paint exit 0; npx os validate exit 0 |
| cli.scaffold-console-first-paint | 1 | console paints under os dev --ui | pass | npx os dev --ui :41185 /_console/ 200 18469 B; screenshot login form, sign-in -) /_console/home "Good afternoon, Dev Admin", 0 page errors |
| cli.scaffold-console-first-paint | 2 | npm run dev serves console like os dev --ui | pass | npm run dev /_console/ 200, HTML byte-equal (hash-normalized) to os dev --ui |
| cli.scaffold-console-first-paint | 3 | newcomer completes visual check | pass | seeded admin@objectos.ai/admin123 signs in through the form; POST /api/v1/data/qa_console_first_pai_note 201, GET by id 200 (both invocations); action/nav half N/A (blank scaffold ships no app) |
| cli.doctor-health-report | 0 | per-check rows; finding-only rows exactly when live | pass | scaffold: Node,pnpm,TS,Dependencies,Git,Env files + NODE_ENV (unset); no @objectstack/spec row; monorepo cwd: "✓ @objectstack/spec Built"; -v adds detail lines only |
| cli.doctor-health-report | 1 | #5387 env provenance | pass | .env OS_TENANCY_POSTURE=isolatd: finding fires, "Environment files .env … — OS_TENANCY_POSTURE from .env"; doctor-env-provenance.test.ts pass |
| cli.doctor-health-report | 2 | #5382 posture error row, report continues, exit 1 | pass | "✗ Tenancy posture OS_TENANCY_POSTURE="isolatd" is not a recognized…", later View integrity/Object usage rows print, "❌ Some critical issues found", exit 1 |
| cli.doctor-health-report | 3 | #5429 ledger rows under every posture | pass | default posture: "⚠ Installed packages 1 installed-package ledger entry could not be read … broken.json" |
| cli.doctor-health-report | 4 | unique-scope ✓ withheld on incomplete ledger | pass | isolated+broken: no "Unique scope" ✓ line; isolated after removing entry: "✓ Unique scope No unconfirmed installation-wide uniques" |
| cli.doctor-health-report | 5 | config-analysis rows both ways | pass | staged: "⚠ Circular dependency: qa_first_run_alpha → … beta → … alpha", "⚠ Object "qa_first_run_note" … not referenced", "⚠ View "qa_ghost_view" … non-existent object"; clean: Dependencies/Object usage/View integrity ✓ |
| cli.doctor-health-report | 6 | exit 1 exactly on error rows | pass | warnings-only runs exit 0 (" |
| cli.doctor-health-report | 7 | monorepo-anchored scans: named skip vs scanned arm | pass | scaffold: "ℹ Test coverage Skipped — no packages/spec/src…", same for Deprecations; -v "→ Looked for …/packages/spec/src and found nothing to walk"; monorepo: "→ Checking for missing test files..." + ⚠ rows |
| cli.doctor-deprecation-scan | 0 | every pattern file:line, both lookup spellings | pass | 9 rows src/legacy.ts:1..9 for 8 entries; :5 reference_filters and :6 referenceFilters both reported |
| cli.doctor-deprecation-scan | 1 | --verbose prints replacements; bare withholds | pass | verbose: "→ Use maxLength (camelCase)", "→ Use lookupFilters …"; bare run 0 "→ Use" lines |
| cli.doctor-deprecation-scan | 2 | warns, never gates | pass | seeded exit 0 (" |
| cli.doctor-deprecation-scan | 3 | decoys silent; .ts-only boundary | pass | no row names legacy.test.ts, src/node_modules/dep/index.ts or src/meta.json ("referenceFilters"); .json is outside the .ts-only walk (documented boundary, not evidence of clean metadata) |
| cli.doctor-deprecation-scan | 4 | absent-src prints same line; annotated | pass | dir with no src ("ls: cannot access 'src'"): "✓ Deprecation scan No deprecated patterns found" = scanned nothing |
| cli.doctor-deprecation-scan | 5 | hint prescribes no command; codemod not registered | pass | bare: "ℹ Found 9 deprecated pattern(s). No automated codemod ships with the CLI — apply each finding’s replacement by hand (re-run with --verbose…)"; verbose "…apply the → replacement shown…"; os codemod --help exit 2 "Command codemod not found." |
| cli.migrate-duplicates-inventory | 0 | declared report contract on stdout | pass | report duplicate-identifiers, reportVersion 2, generatedAt, database, globalPartition global, filter null, counters {table:_objectstack_sequences,status:read}, scanned/skipped/duplicates/liveConditions/runtimeIndexPreflight/summary; holders id/organization/partition/createdAt; contract pin pass |
| cli.migrate-duplicates-inventory | 1 | cross-partition reported, within-partition not | pass | f_autonumber "0001" partitions [global, org_…] holderCount 2; seeded within-org "0002" repeat absent from .duplicates |
| cli.migrate-duplicates-inventory | 2 | read-only: rows/sequences/sqlite_master identical | pass | dump md5 before == after: schema 66dfbc0b…, rows d7ca37b4…, seq 2628028f… |
| cli.migrate-duplicates-inventory | 3 | kernel:ready preflight reports blocked index; plan blind | pass | idx_sys_metadata_overlay_active blocked {type:view,name:qa_g9_dup_view,package_id_key:"",bundle_member_key:""} rowCount 2; summary runtimeIndexesBlocked 1; plan has no drift entry for it; 3 entries, none sys_view_definition |
| cli.migrate-duplicates-inventory | 4 | live condition global beside org counter | pass | liveConditions [{globalLastValue:1, organizationCounters:[{org,lastValue:2}]}]; org counter deleted -) [] while duplicates unchanged ["0001"] |
| cli.migrate-duplicates-inventory | 5 | --object narrows and records it | pass | .filter null (full) / {object:showcase_field_zoo} (1 dup) / {object:showcase_category} (0) |
| cli.migrate-duplicates-inventory | 6 | --database-url / OS_DATABASE_URL target | pass | --database-url file:…/dup.db same duplicates ["0001"] as the OS_DATABASE_URL run; skipped [] in all runs |
| cli.migrate-duplicates-inventory | 7 | no raw-SQL seam refuses loudly | pass | duplicates.null-seam.test.ts pass; --database-url memory://qa exit 1 {"error":"boot_failed","detail":"…memory:// scheme selects the in-memory (mingo) engine…"} |
| cli.datasource-introspect-codegen | 0 | list-tables via /external/tables; --schema narrows | pass | "customers (7 cols)", "orders (7 cols)" == sqlite3 cross-check customers:7 orders:7; stock SQLite --schema runs list all (knownGap); narrowing half from pins: remote-tables-twin.equivalence 10 passed, service schema filter 3 passed, envelope-unwrap passed |
| cli.datasource-introspect-codegen | 1 | introspect draft stdout; --out writes and echoes | pass | draft ObjectSchema.create showcase_customers with 7 columns; "Wrote objects/qa_external.object.ts"; no REVIEW notes produced by fixture |
| cli.datasource-introspect-codegen | 2 | --out jail both ways | pass | ../qa-escape and absolute path: "--out must be a relative path within the current directory" exit 2 each; neither file exists |
| cli.datasource-introspect-codegen | 3 | generated draft compiles | pass | scratch config wiring the draft + declared datasource: os build exit 0, artifact object showcase_customers datasource showcase_external 7 fields |
| cli.datasource-introspect-codegen | 4 | validate drift detector honest exit | pass | untouched: "✓ showcase_ext_customer matches" "✓ showcase_ext_order matches" exit 0; region renamed: "✗ missing_column: showcase_ext_customer.region" exit 1 |
| cli.datasource-introspect-codegen | 5 | server error arm -) nonzero; validate unknown vacuous ok | pass | list-tables/introspect no_such_ds: "[ObjectQL] Datasource 'no_such_ds' has no registered driver…" exit 2 each; validate no_such_ds: "No federated objects to validate." exit 0 (recorded) |
| cli.hook-body-extraction-gates | 0 | --strict-body: each forbidden pattern own reason, exit 1 | pass | "✗ --strict-body: 7 callable(s) lack a metadata body", 7 per-pattern reasons (fetch/import name "declare a Connector recipe instead"); human exit 1, --json {success:false,error:"strict-body: missing body",issues:7} exit 1 |
| cli.hook-body-extraction-gates | 1 | api.read/api.write inference incl. alias | pass | find ["api.read"], update ["api.write"], const api = ctx.api alias ["api.read"] |
| cli.hook-body-extraction-gates | 2 | crypto.uuid/log inferred; crypto.hash nothing | pass | randomUUID ["crypto.uuid"], log.info ["log"], hash-only [] |
| cli.hook-body-extraction-gates | 3 | body.capabilities as data; retired comment adds nothing | pass | body-supplying hook ships ["api.read","log"]; retired @capabilities comment hook ["api.read"] only; build exit 0 silent |
| cli.hook-body-extraction-gates | 4 | #1876 free identifier bundled; strict fails | pass | default exit 0, hook body absent, runtime .mjs emitted; --strict-body exit 1 "references identifier(s) not in scope at runtime: qaHelper" |
| cli.hook-body-extraction-gates | 5 | all-body-only skips legacy bundle, cleans old | pass | "Skipping legacy runtime bundle (all 8 callables are body-only)"; planted stale .mjs removed by rebuild, dist holds objectstack.json only |
| cli.hook-body-extraction-gates | 6 | EXPECTED-FAIL: default path must surface the warning | pass | now surfaces: "⚠ 7 handlers could not be lowered to a metadata body — bundled via the legacy runtime module instead" + 7 per-hook reasons; --json bodyExtractionWarnings length 7; all 7 hooks body-less, bundle emitted |
| cli.lint-severity-exit-contract | 0 | closed severity vocabulary, grouped ✗/⚠/ℹ | pass | severities seen error, warning, suggestion only; human "Errors (1) ✗ … required/label at …", "Warnings (1) ⚠ … convention/label-case"; suggestion tier seen on showcase lint (approval-approvers-may-resolve-empty) |
| cli.lint-severity-exit-contract | 1 | exit 1 exactly on errors; duration in payload | pass | error config human 1/1, json 1/1; warnings-only human 0/0, json 0/0; payload duration numeric (165, 185) |
| cli.lint-severity-exit-contract | 2 | --json declared lint shape, counters reconcile | pass | {passed:false,total:2,errors:1,warnings:1,suggestions:0,issues[2]} recount matches; passed===(errors===0); extra keys conversions,failing,strict |
| cli.lint-severity-exit-contract | 3 | #4409 registry parity lint vs build | pass | broken approvers: lint ✗ approval-expression-invalid at flows[28].nodes[1/2]… exit 1; build "Author-time rules failed (2 issues)" same rule/paths; registry info -) suggestion |
| cli.lint-severity-exit-contract | 4 | i18n fold honest | pass | with zh-CN supported: bare "platform built-ins: 1150 i18n issue(s) hidden — rerun with --include-platform", hiddenPlatform 1150; --include-platform 1150 i18n/missing-metadataForm at translations.zh-CN.metadataForms.*; --skip-i18n 0 i18n issues, no disclosure |
| cli.lint-severity-exit-contract | 5 | --fix dry run, files byte-identical | pass | "→ fix: Lower case label", "ℹ Dry-run mode: no files were modified."; md5sum -c OK for both files |
| cli.lint-severity-exit-contract | 6 | load failure exit 1 both paths, parseable json | pass | throwing config: human "✗ qa deliberate load-time throw" exit 1; --json {"error":"qa deliberate load-time throw","conversions":[]} exit 1, parses |
| cli.plugin-manifest-build-contract | 0 | invalid manifest refused, no artifact | pass | 6a "✗ Cannot read objectstack.plugin.json in …" exit 1; 6b/6c "objectstack.plugin.json is invalid:" exit 1; 0 .osplugin after each |
| cli.plugin-manifest-build-contract | 1 | identity guarded at schema, located per shape | pass | 6b "✗ id invalid_type … received undefined"; 6c "✗ version invalid_format …pattern"; 6d "✗ id invalid_format: Invalid package id '' … reverse-domain"; all exit 1, no artifact; 6e no entry "✗ No entry module found" exit 1 |
| cli.plugin-manifest-build-contract | 2 | packaging forks the artifact | pass | bundled: 3 files, picocolors inlined (createColors x4, no import); manifest-deps: 4 files incl package.json, dist/index.mjs keeps from "picocolors" |
| cli.plugin-manifest-build-contract | 3 | compiled manifest + publish reads before network | pass | manifest = authored + main dist/index.mjs + integrity map (manifest, SIGNATURE excluded) [+ schema defaults]; publish good -) "✗ Not logged in" after reading id@version; version-less -) "✗ Artifact manifest is missing id or version." exit 1 |
| cli.plugin-manifest-build-contract | 4 | lint missing-engines-range scoped | pass | manifest w/o engines: warning protocol/missing-engines-range at manifest.engines.protocol fix "engines: { protocol: '^18' }"; manifest-less fragment: rule absent |
| cli.dev-automigrate-policy | 0 | safe applies exactly safe diffs, reports each, converges | pass | safe boot: "[schema-drift] auto-reconciled drop_column_default on qaam_item.owner_ref" (only reconcile); relax_not_null + orphan qa_gone still warned; 2nd safe boot 0 reconciles, schema unchanged |
| cli.dev-automigrate-policy | 1 | off explicit or omitted never touches schema | pass | off x2 and omitted: 3 drift warnings each, 0 reconciled, schema/rows md5 identical across each boot |
| cli.dev-automigrate-policy | 2 | NODE_ENV=production force-off | pass | "[schema-drift] autoMigrate='safe' is ignored under NODE_ENV=production — … Run 'os migrate' deliberately."; 0 reconciled; dump unchanged |
| cli.dev-automigrate-policy | 3 | gate composes; destructive never auto | pass | safe boot left orphan qa_gone (drop_column, destructive) and NOT NULL qa_req (relax_not_null, needs_confirm) in place, warned; schemaMode external arm not staged |
| cli.dev-automigrate-policy | 4 | ADR-0120 D4 tighten fails closed | pass | pin: sql-driver-unique-tenancy "auto-tightens at boot under autoMigrate: safe when the probe is clean" + "BLOCKS the tightening on duplicate NULL-organization rows — old index kept" pass |
| cli.dev-automigrate-policy | 5 | CLI injects safe only in dev | pass | keyless dev: auto-reconciled drop_column_default; plan 2 changes (1 safe,1 needs-confirm) -) 1 (0 safe); non-dev os serve over same drift: 2 warnings, 0 reconciled, qaam_item DDL unchanged |
Reproduction rules (fails)
cli.migrate-meta-codemodclause 7 (stale-spec): checklist cli.migrate-meta-codemod is stale: os migrate meta now ships --write (feat(cli):os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591 landed), item still asserts print-only- repro: os migrate meta --help: FLAGS include --write ("Rewrite the authored source files in place for each mechanical change …") and --all. Expected by item: exactly from/to/step/out/stored/database-url/apply/yes/force/type/json. feat(cli):
os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591 closed completed 2026-10-08 via PR fix(spec): the retirement sentence names--write: it applies the edits it can prove, you apply the rest #22142. - mechanism: packages/cli/src/commands/migrate/meta.ts:1054 write: Flags.boolean; packages/spec retirement sentence now names --write
- repro: os migrate meta --help: FLAGS include --write ("Rewrite the authored source files in place for each mechanical change …") and --all. Expected by item: exactly from/to/step/out/stored/database-url/apply/yes/force/type/json. feat(cli):
Derived item verdicts
16 pass · 0 partial · 1 fail · 0 blocked · 0 not-run (of 17).
Pin runs (Tier 1, RUNNER rule 6):
cli.migrate-plan-apply-json: packages/cli: vitest run src/utils/format.exit-code.test.ts src/commands/verify-tenancy-posture.test.ts --maxWorkers=1 -> 2 files, 11 passedcli.verify-verdict-exit-mapping: verify-tenancy-posture.test.ts in the 11-passed batch abovecli.doctor-health-report: packages/cli vitest (one batch, 15 files, 230 passed) incl. doctor-env-provenance, doctor-tenancy-posture-report, doctor-ledger-dir-authority, doctor-ledger-posture-independence, doctor-ledger-read-failure, doctor-config-load-cause, doctor-node-env-default, doctor-unexamined-spec-treecli.doctor-deprecation-scan: doctor-deprecation-hint-commands.test.ts in the 230-passed batchcli.migrate-duplicates-inventory: duplicates.contract/null-seam/pre-repair tests in the 230-passed batchcli.datasource-introspect-codegen: packages/rest remote-tables-twin.equivalence.test.ts 10 passed; packages/services/service-datasource external-datasource-service.test.ts -t schema 3 passed; packages/cli datasource/envelope-unwrap.test.ts in 230 batchcli.hook-body-extraction-gates: lower-callables.test.ts in the 230-passed batchcli.dev-automigrate-policy: packages/drivers/driver-sql: vitest run sql-driver-schema-drift, sql-driver-unique-tenancy, sql-driver-index-drift --maxWorkers=1 -> 3 files, 59 passed
Fixture gaps
None.
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-16T17:19Z. 16 pass · 0 partial · 1 fail of 17. The one
failis a stale spec: the product holds and the item pins old text. It is extracted to the re-point family card:The item's own restart condition fired: #9591 closed completed via #22142.
os migrate meta --helpnow lists--writeand--all, while the clause still asserts print-only. This record has no fixture gaps. Its checklist-accuracy findings close out on #23878. Closed by thedomain: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