Repository navigation
Closed
Labels
Description
Run record for the 18.0 release QA wave (dispatch session session_01CfRDy7SuTfUqaTu2AEH2Hi; maintainer-approved plan B: Tier 1 + Tier 2, Tier 3 deferred). Runner session session_016CErRJhdMYZdRg4pe8iQfD. Protocol: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md.
Environment fingerprint
- framework:
5b14b7f3ad8e2e0786d228772f473d07b36b2477(pinned;pnpm install --frozen-lockfile+pnpm build, 76/76 tasks green) .objectui-sha:4016370af3c9c9dafec2bc5299afd8e8079701b8; console built withpnpm objectui:build(shallow clone into.cache/objectui-4016370af3c9),packages/console/dist/.objectui-shamatches,pnpm check:console-shagreen- resolver:
node scripts/checklist-select.mjs area:cli --json→ 22 runnable · 0 blocked hidden · 0 planned - app: showcase · boot
OS_PORT=P objectstack dev --ui --seed-admin -p P -d file:…/ITEM.db· per-runner port range and per-item file DB · seeded admin + demo personas; staged configs only in scratch copies of the app - browser: Playwright on
/opt/pw-browsers/chromium, headless, one context per persona - timestamp: 2026-10-19 (UTC) · execution: parallel fan-out, one sub-agent runner per item group:
- C1: ports [41320,41321,41322,41323,41324,41325] · env 6 min / test 26 min
- C2: ports [41330,41331] · env 5 min / test 12 min
- C3: ports [41340,41341,41342,41343,41344,41348,41349] · env 6 min / test 16 min
- C4: ports [41350,41351,41352] · env 3 min / test 23 min
Scope
Selector area:cli · 22 runnable item(s) (revision = the one each verdict is valid for):
cli.dev-boot-contractr5 · P0 · cli · Tier 2 → pass (runner C1)cli.build-own-contractr5 · P1 · build · Tier 2 → pass (runner C1)cli.migrate-plan-apply-jsonr4 · P1 · cli · Tier 1 → pass (runner C4)cli.verify-verdict-exit-mappingr1 · P1 · cli · Tier 1 → pass (runner C4)cli.scaffold-first-runr5 · P1 · mixed · Tier 1 → pass (runner C3)cli.qa-suite-executionr6 · P1 · cli · Tier 2 → pass (runner C2)cli.flag-command-error-uxr3 · P2 · cli · Tier 3 → not-runcli.migrate-meta-codemodr5 · P1 · cli · Tier 2 → pass (runner C2)cli.scaffold-console-first-paintr4 · P1 · mixed · Tier 2 → pass (runner C3)cli.doctor-health-reportr3 · P1 · cli · Tier 2 → pass (runner C1)cli.doctor-deprecation-scanr3 · P2 · cli · Tier 3 → not-runcli.migrate-duplicates-inventoryr7 · P1 · cli · Tier 2 → pass (runner C2)cli.datasource-introspect-codegenr5 · P2 · cli · Tier 1 → pass (runner C3)cli.hook-body-extraction-gatesr3 · P1 · cli · Tier 2 → pass (runner C1)cli.lint-severity-exit-contractr1 · P2 · cli · Tier 3 → not-runcli.plugin-manifest-build-contractr3 · P2 · cli · Tier 3 → not-runcli.dev-automigrate-policyr2 · P1 · cli · Tier 1 → pass (runner C3)cli.migrate-meta-write-stored-and-allr1 · P1 · cli · Tier 1 → pass (runner C4)cli.organization-ownership-ceremonyr1 · P0 · cli · Tier 1 → fail (runner C4)cli.meta-package-flags-and-explainr1 · P2 · cli · Tier 1 → pass (runner C4)cli.validate-v18-authoring-verdictsr1 · P1 · cli · Tier 1 → pass (runner C4)cli.verify-derived-proof-familiesr1 · P2 · cli · Tier 1 → pass (runner C4)
Per-clause verdicts
| item | clause | short | verdict | evidence |
|---|---|---|---|---|
| cli.dev-boot-contract | acc[0] | health 200, ready ok, console login page | pass | canonical boot (examples/app-showcase, -p 41320, -d file:RUNDIR/dev-boot.db) health 200 in 35s; GET /api/v1/ready -› {"success":true,"data":{"status"… |
| cli.dev-boot-contract | acc[1] | seeded admin loginable; seed idempotent vs changed password | pass | boot1 POST /api/v1/auth/sign-in/email admin@objectos.ai/admin123 -› 200 token (user createdAt 12:38:13.534Z); wrong pw control -› 401 INVALID_EMAIL_O… |
| cli.dev-boot-contract | acc[2] | DB resolution matrix tier for tier | pass | Database line per variant: explicit -d file:RUNDIR/dev-boot.db -› same; -d :memory: -› 'Database: :memory:' + Driver SqlDriver(better-sqlite3) -› :me… |
| cli.dev-boot-contract | acc[3] | --fresh tempdir isolated and deleted; #5594 carve-out | pass | '🧪 Fresh OS_HOME: /tmp/objectstack-dev-hiUMrl' + 'Database: file:/tmp/objectstack-dev-hiUMrl/data/objectstack.db'; dir listed (data/objectstack.db, … |
| cli.dev-boot-contract | acc[4] | busy port auto-shift reported | pass | instance B (requested 41320 while A held it) printed '↪ server bound to port 41321 (requested 41320)' and API/MCP URLs on 41321; GET http://localhost… |
| cli.dev-boot-contract | acc[5] | stale artifact warned, boot continues | pass | after touch src/ui/actions/index.ts (12:41) newer than dist/objectstack.json (12:35), boot w/o --compile printed '⚠ dist/objectstack.json is OLDER th… |
| cli.dev-boot-contract | acc[6] | no config/no artifact exits 1 with remedy | pass | empty scratch dir: stdout '✗ Config file not found in …/noconfig', stderr 'Run in a directory with objectstack.config.ts, pass --artifact ‹path|url›… |
| cli.dev-boot-contract | neg[0] | no wipe of existing dev DB by default | pass | probe record edit on the unified default DB survived a nothing-chosen restart (title QA-C1-persist-probe read back); default never :memory: |
| cli.dev-boot-contract | neg[1] | retired memory engine refused at every door | pass | --database-driver memory -› oclif 'Expected --database-driver=memory to be one of: sqlite, sqlite-wasm, postgres, mysql, mongodb, turso' EXIT=2; OS_D… |
| cli.dev-boot-contract | neg[2] | legacy dev.db read with notice, no fresh objectstack.db | pass | scratch project with only .objectstack/data/dev.db: '⚠ Reading legacy database file …/dev.db — dev, start and migrate now share one default, …/object… |
| cli.dev-boot-contract | neg[3] | shifted port never silently different | pass | B's printed URLs and the ↪ line all name 41321, the port that answered health 200 |
| cli.build-own-contract | acc[0] | clean build exit 0, artifact, stats, json keys | pass | blank scaffold: EXIT=0, '✓ Build complete', 'Data: 1 Objects 2 Fields … Runtime: 3 plugins', 'Artifact: dist/objectstack.json (2.5 KB)', file parses;… |
| cli.build-own-contract | acc[1] | schema violation located; json 1, human 2 | pass | field body with type removed (plain object literal): human '✗ defineStack validation failed (1 issue): ✗ objects.0.fields.body.type: Invalid field ty… |
| cli.build-own-contract | acc[2] | author-time rule failures exit 1, all at once, located | pass | flow with two approval nodes whose expression approvers don't parse: '✗ Author-time rules failed (2 issues)' each with CEL caret, fix:, 'rule: approv… |
| cli.build-own-contract | acc[3] | --json shapes parity with validate | pass | success: build and validate both carry warnings + conversions; rule failure: build {success:false,error:'author-time rules failed',issues,warnings,co… |
| cli.build-own-contract | acc[4] | #4873 exit codes are stable statuses | pass | clean human 0,0,0,0 / clean json 0,0,0; schema-load human 2,2 / json 1,1; strict:false schema human 1 / json 1; rule human 1,1 / json 1,1; advisory 0… |
| cli.build-own-contract | acc[5] | advisory warns and exits 0 | pass | raw-object field body.visibleWhen {dialect:'cel',source,qaUndeclared:1} under strict:false: '⚠ Undeclared authoring keys (1) — dropped at load; repor… |
| cli.build-own-contract | neg[0] | no exit 0 without artifact / nonzero on clean | pass | every exit-0 run wrote dist/objectstack.json; clean config never nonzero |
| cli.build-own-contract | neg[1] | no computed value in exit slot | pass | see acceptance[4] |
| cli.build-own-contract | neg[2] | deep gate content out of scope | skipped | scope note |
| cli.migrate-plan-apply-json | acc[0] | bare migrate is read-only plan | pass | after adding showcase_category.qa_note + build: two bare runs identical (modulo timestamps), both list '+ showcase_category [add_columns: qa_note]'; … |
| cli.migrate-plan-apply-json | acc[1] | plan --json shape, exit 0 | pass | keys database,databaseSource,managedTables(68),total,changes,pending(8),unmanagedTables,composition,duration; exit 0 |
| cli.migrate-plan-apply-json | acc[2] | #4873 --json success exits 0 | pass | plan --json 0, apply --json --yes 0, recorded-by --json 0 {pending:0}, resume --json 0 {interrupted:[],count:0}; pin format.exit-code.test.ts 4 passed |
| cli.migrate-plan-apply-json | acc[3] | destructive skipped until --allow-destructive | pass | field removed + build: apply --yes → '1 destructive change(s) will be SKIPPED (re-run with --allow-destructive …)', column kept; --allow-destructive … |
| cli.migrate-plan-apply-json | acc[4] | idempotent re-run, in_sync_partial on showcase | pass | post-apply plan: '⚠ No drift over the 68 object(s) … 2 of 70 … NOT examined … PARTIAL plan'; apply --json --yes exit 0 {applied:[],skipped:[],created… |
| cli.migrate-plan-apply-json | acc[5] | busy DB: apply exit 1, plan warns | pass | with os dev holding the DB: apply --yes exit 1 '… is in use — it is open in pid 13650 (node) … or pass --force'; plan exit 0 with the same busy warni… |
| cli.migrate-plan-apply-json | acc[6] | --json without --yes: confirmation_required | pass | apply --json → {applied:[],message:'confirmation_required',hint:'pass --yes'}, DB sha unchanged, follow-up plan still pending 8 incl. showcase_catego… |
| cli.migrate-plan-apply-json | neg[0] | no drop without --allow-destructive | pass | qa_note still present after the plain apply |
| cli.migrate-plan-apply-json | neg[1] | busy apply never exit 0; json success never nonzero | pass | busy apply exit 1; all --json successes exit 0 |
| cli.verify-verdict-exit-mapping | acc[0] | verdict vocabulary closed | pass | verify --json on showcase: 24 results, statuses {verified:15, needs-fixture:1, skipped:8}, none outside the six-member union; summary reconciles |
| cli.verify-verdict-exit-mapping | acc[1] | exit nonzero exactly when hardFailures›0 | pass | showcase: recomputed 0, hardFailures 0, exit 0; staged scratch app (beforeInsert hook mutating title + hook throwing): fidelity-gaps 1 + create-faile… |
| cli.verify-verdict-exit-mapping | acc[2] | needs-fixture excluded; failures counted | pass | exit-0 showcase run carries showcase_account needs-fixture (400 validation); staged non-validation 400 → create-failed counted (verify.ts:110-113 isV… |
| cli.verify-verdict-exit-mapping | acc[3] | --rls separate fresh stack; holes counted | pass | verify --rls --json exit 0, rls.summary {proven 21, holes 0, unproven 3}; two objectql registrations in the run log vs one for bare verify; verify.ts… |
| cli.verify-verdict-exit-mapping | acc[4] | #5262 walled posture never quiet single-org | pass | OS_TENANCY_POSTURE=isolated verify --json → exit 1 {error:'verify: multiTenant=true requires the enterprise @objectstack/organizations package …'}; p… |
| cli.verify-verdict-exit-mapping | neg[0] | no exit 0 with hard failures | pass | staged gaps run exited 1; banner '✗ verify FAILED — 2 runtime failure(s)' |
| cli.verify-verdict-exit-mapping | neg[1] | no quiet single-org under walled posture | pass | isolated posture errored loudly, no multiTenant:false payload |
| cli.scaffold-first-run | acc[0] | scaffold→install→validate→build→boot→health all green | pass | PRE-RELEASE variant: 73 public workspace pkgs packed at 5b14b7f (ignore-scripts) and published ONLY to localhost verdaccio :41348 (no uplink for @ob… |
| cli.scaffold-first-run | acc[1] | every template validates and builds per-variant | pass | catalog = blank only (src/template-registry.ts one bundled source; src/templates/ holds only blank); blank: validate EXIT=0, build EXIT=0 (pre-releas… |
| cli.scaffold-first-run | acc[2] | artifact boots via os start; protocol handshake accepts coherent scaffold | pass | os start --artifact boot reached '✓ Server is ready', Mode: production, 41 plugins; no '✗ package … targets protocol' refusal — coherent pre-release … |
| cli.scaffold-first-run | acc[3] | skills boundary: installed set == catalog, no internal skill | pass | 18-line scaffolder install (no --skip-skills, qa-skills): .claude/skills = 10 real dirs (0 symlinks) set-equal by unique name to node_modules/@object… |
| cli.scaffold-first-run | acc[4] | never-healthy server is a FAIL with server.log, not retry | pass | bounded probe used exactly as the workflow (30×2s, kill -0 exit check); server became healthy at poll 7 so the timeout arm did not trigger; server.lo… |
| cli.scaffold-first-run | neg[0] | internal skill in scaffolded project | pass | no internal skill in either the scaffolder-installed set or the skills-add set; repo-root discovery listing contains no dogfood-verification |
| cli.scaffold-first-run | neg[1] | template builds only from checkout, not registry | pass | the blank template built from a REGISTRY-shaped install (localhost registry, tarballs) at the pinned sha, not workspace links; published 17.7.0 path … |
| cli.qa-suite-execution | acc[0] | green path SUCCESS exit 0 with N›0 | pass | default glob from examples/app-showcase: 'Found 1 test suites.', '✅ … [health-liveness] (43ms)', '✅ … [category-create-read-roundtrip] (223ms)', 'SUC… |
| cli.qa-suite-execution | acc[1] | capture+interpolation address the created record | pass | no-teardown copy of the roundtrip scenario passed (read-back via {{categoryId}} asserted record.name 'QA C2 idproof'); independent GET /api/v1/data/s… |
| cli.qa-suite-execution | acc[2] | false assertion fails scenario and run | pass | '❌ … [health-degraded]' 'Assertion failed: data.status expected degraded, got ok' under 'Step Failed: GET health expecting degraded'; run exit 1 |
| cli.qa-suite-execution | acc[3] | unevaluable contains fails with hint | pass | 'Assertion failed: data.nope cannot be evaluated by 'contains' — expected an array or a string at that path, got undefined. … Use 'is_null' if assert… |
| cli.qa-suite-execution | acc[4] | malformed suite refused at load, rest runs, exit 1 | pass | 'qa/a-malformed.test.json is not a valid Quality Protocol suite (TestSuiteSchema):' '✗ scenarios.0.steps: Invalid input: expected array, received und… |
| cli.qa-suite-execution | acc[5] | teardown runs after failure, verdict stays red | pass | td scenario ❌ 'Step Failed: deliberate failure', exit 1; category listing after = 4 original rows (created 'QA C2 teardown-after-failure' gone) |
| cli.qa-suite-execution | acc[6] | 8 action types each with own verdict | pass | sweep: ✅ v-api_call, v-wait, v-create_record, v-read_record, v-update_record, v-delete_record, v-query_records; ❌ v-run_script 'Unsupported action ty… |
| cli.qa-suite-execution | acc[7] | glob discipline default + ** in seconds, sorted | pass | bare os test found the shipped suite; os test 'qa/**/*.test.json' 'Found 1 test suites.' SUCCESS exit 0 wall 3.86s; staged a/b/c ran in sorted or… |
| cli.qa-suite-execution | neg[0] | zero-match glob exits 0 by declared posture | pass | 'Found 0 test suites.' 'No test files found matching: qa/nothing-matches-*.test.json' 'Exiting 0 — an empty match is not a failure. Pass --fail-on-em… |
| cli.qa-suite-execution | neg[1] | malformed suite never reaches runner | pass | refused at load with file named; no Scenario line for it; no TypeError |
| cli.qa-suite-execution | neg[2] | contains over absent path not ✅ | pass | ❌ with cannot-be-evaluated message |
| cli.qa-suite-execution | neg[3] | record action types round-trip, no 404 | pass | all 5 record-shaped types ✅ against stock boot |
| cli.qa-suite-execution | neg[4] | run is against booted app, not unit pins | pass | all evidence from os test against http://localhost:41330 (showcase dev boot); also no-token persona run: health ✅, roundtrip ❌ 'HTTP Error 401: …UNAU… |
| cli.migrate-meta-codemod | acc[0] | every planted spelling listed with registry successor | pass | --from 17 on planted tree: 'Applied 5 mechanical change(s):' lists 'dashboards[1].refreshIntervalSeconds: refreshInterval → refreshIntervalSeconds (d… |
| cli.migrate-meta-codemod | acc[1] | no-write runs leave authored sources byte-identical | pass | md5 of 161 files before/after 3 no-write runs (plain, --out, --json): identical (list md5 5ebac231… both); only new path ./migrated.stack.json (the -… |
| cli.migrate-meta-codemod | acc[2] | --out snapshot = migrated stack, honest verdict | pass | snapshot: ops dashboard has refreshIntervalSeconds=300 and no refreshInterval, legacy note keys [fields,label,name,sharingModel], 3 decisions mode=in… |
| cli.migrate-meta-codemod | acc[3] | canonical replay zero edits; identical runs; empty range | pass | written tree --from 17: no 'Applied' block, '404 manual change(s) require your judgment', exit 0; two planted-tree runs diff empty after (Nms) normal… |
| cli.migrate-meta-codemod | acc[4] | below-floor --from refused loudly | pass | --from 15 and --from 3: '✗ Cannot migrate from protocol 15: the chain's support floor is 16 (ADR-0087 D3). Upgrade to protocol 16 by another path fir… |
| cli.migrate-meta-codemod | acc[5] | semantic entries surface as advisories | pass | 404 '⚠ [protocol 18] …' entries under '404 manual change(s) require your judgment:' with why/verify lines, separate from the 5 'Applied' lines; --jso… |
| cli.migrate-meta-codemod | acc[6] | --json exits 0 on success | pass | migrate meta --from 17 --json; echo $? → 0 (planted tree); --write --json → 0 |
| cli.migrate-meta-codemod | acc[7] | --write writes exactly provable edits, re-run held | pass | 'Wrote 5 of 5 mechanical change(s) into 3 file(s):' sites :1699/:271/:1421 flows/index.ts, :6 legacy-note.object.ts, :59 ops-dashboard.dashboard.ts; … |
| cli.migrate-meta-codemod | neg[0] | no prescribed spelling left unlisted | pass | both sampled tombstones' spellings appear in the Applied block |
| cli.migrate-meta-codemod | neg[1] | successor parses | pass | migrated stack schema-valid with refreshIntervalSeconds; removal has no successor key |
| cli.migrate-meta-codemod | neg[2] | no-write run mutates nothing | pass | md5 pair identical across 3 no-write runs |
| cli.migrate-meta-codemod | neg[3] | --write touches nothing outside listed sites | pass | diff -r shows only the 5 listed sites; no advisory written; refused spread site listed with kind+reason; verification.vanished=[] stillApplied=[] |
| cli.migrate-meta-codemod | neg[4] | below-floor never silently exits 0 | pass | exit 1 + floor message (text and --json) |
| cli.migrate-meta-codemod | neg[5] | target-major replay/identical runs agree | pass | --from 18 = empty-range warning, no changes; identical runs diff empty normalized |
| cli.migrate-meta-codemod | neg[6] | no schema-valid claim over outstanding refusals | pass | pollInterval probe prints the 'does not yet pass' warning and schemaValid=false, not the success line |
| cli.scaffold-console-first-paint | acc[0] | npx os validate passes on untouched fresh scaffold | pass | pre-release scaffold create-objectstack.js qa-console-first-paint (no -t) EXIT=0, lockfile 59/59 integrities == local tarballs; npx os validate E… |
| cli.scaffold-console-first-paint | acc[1] | Console paints at /_console/ under os dev --ui | pass | OS_PORT=41343 npx os dev --ui -p 41343: serve child argv 'serve --dev --port 41343 --ui'; GET /_console/ 200 text/html 18301B; screenshot: login ca… |
| cli.scaffold-console-first-paint | acc[2] | npm run dev serves console with no extra flag | pass | OS_PORT=41343 npm run dev -- -p 41343 → 'objectstack dev -p 41343', serve child argv 'serve --dev --port 41343' (no --ui forwarded); /_console/ 200… |
| cli.scaffold-console-first-paint | acc[3] | newcomer can complete documented visual check or run states what stops them | pass | banner prints '🔑 Dev admin: admin@objectos.ai / admin123 seeded on empty DB'; signed in through the form; from the signed-in console page POST /api/… |
| cli.scaffold-console-first-paint | neg[0] | console 404s on fresh scaffold | pass | /_console/ 200 under both invocations |
| cli.scaffold-console-first-paint | neg[1] | npm run dev vs os dev --ui disagree | pass | both 200, identical HTML, identical rendered flow |
| cli.scaffold-console-first-paint | neg[2] | dev gains own ui default false / forwards --no-ui | pass | bare dev's serve child carries no ui flag and serves the console (serve default ON) |
| cli.scaffold-console-first-paint | neg[3] | os validate refusing on pristine scaffold | pass | EXIT=0 |
| cli.scaffold-console-first-paint | neg[4] | 200 that paints nothing | pass | screenshots show rendered login card and home shell, not white |
| cli.doctor-health-report | acc[0] | per-check rows; conditional rows only when live | pass | scaffold plain+(-v): unconditional Node.js/pnpm/TypeScript/Dependencies/Git/Environment files rows present; no @objectstack/spec row (grep 0), Tenanc… |
| cli.doctor-health-report | acc[1] | #5387 .env provenance named | pass | OS_TENANCY_POSTURE=isolatd in .env only (shell unset): '✓ Environment files .env (node_env=production)… — OS_TENANCY_POSTURE from .env', posture erro… |
| cli.doctor-health-report | acc[2] | #5382 bad posture = error row, report continues, exit 1 | pass | OS_TENANCY_POSTURE=isolatd: '✗ Tenancy posture OS_TENANCY_POSTURE="isolatd" is not a recognized tenancy posture…' with accepted values; config-analys… |
| cli.doctor-health-report | acc[3] | #5429 ledger row under default posture | pass | no posture set, .objectstack/installed-packages/broken.json non-JSON: '⚠ Installed packages 1 installed-package ledger entry could not be read (those… |
| cli.doctor-health-report | acc[4] | Unique scope ✓ withheld on incomplete ledger | pass | OS_TENANCY_POSTURE=isolated + broken.json: step 'Checking unique scopes…' printed, NO '✓ Unique scope' line; same run after rm broken.json: '✓ Unique… |
| cli.doctor-health-report | acc[5] | config findings both ways | pass | staged (ObjectSchema objects qa_doctor_a↔qa_doctor_b lookups, unused qa_doctor_c, view {name:'qa_missing',object:'qa_missing',list:{columns:['title']… |
| cli.doctor-health-report | acc[6] | exit contract warnings 0 / errors 1 | pass | warnings-only runs (baseline, staged, ledger, monorepo) EXIT=0 under ' |
| cli.doctor-health-report | acc[7] | monorepo-only scans report skip as ℹ | pass | scaffold: 'ℹ Test coverage Skipped — no packages/spec/src in this directory (monorepo-only check)' and same for Deprecations; -v adds '→ Looked for ‹… |
| cli.doctor-health-report | neg[0] | bad posture not swallowed as config-load | pass | error row + exit 1, no 'Could not load config for analysis' |
| cli.doctor-health-report | neg[1] | no Unique scope ✓ over unreadable ledger | pass | see acceptance[4] |
| cli.doctor-health-report | neg[2] | warnings never exit 1; errors never 0 | pass | see acceptance[6] |
| cli.doctor-health-report | neg[3] | no @objectstack/spec Not built in user app | pass | grep '@objectstack/spec|Not built' in both scaffold transcripts = 0 |
| cli.doctor-health-report | neg[4] | skip rows are ℹ not ⚠ | pass | rows printed with ℹ; clean scaffold summary '✅ Environment is healthy' |
| cli.doctor-health-report | neg[5] | skip rows present, not dropped | pass | both rows present in plain and -v scaffold runs |
| cli.migrate-duplicates-inventory | acc[0] | report contract shape | pass | jq walk: report='duplicate-identifiers', reportVersion=2, generatedAt, database, globalPartition='global', filter=null, counters={table:'_objects… |
| cli.migrate-duplicates-inventory | acc[1] | cross-partition reported, within-partition not | pass | TK-0001 (ticket_no) reported with partitions ['global','org_mvf9jelsm1bfve0u'], holders qa_r1/qa_r2; ext_code 'DUPX' twice in one org appears now… |
| cli.migrate-duplicates-inventory | acc[2] | DB content byte-identical after runs | pass | sha256-16 rows 148dd638af7b0416 / seq a0b4432693d4c4a4 / sqlite_master 643a4b64a34a0384 identical before, after scan, after migrate plan, and at the … |
| cli.migrate-duplicates-inventory | acc[3] | kernel:ready preflight reports blocked overlay index | pass | runtimeIndexPreflight: idx_sys_metadata_overlay_active status 'blocked', group {type:'view',name:'qa_c2_dup_view',package_id_key:'',bundle_member_key… |
| cli.migrate-duplicates-inventory | acc[4] | live condition with counters; vanishes when org counter dropped | pass | liveConditions [{object:showcase_dup_probe,field:ticket_no,globalLastValue:1,organizationCounters:[{organization:org_…,lastValue:4}]}]; on a DB copy … |
| cli.migrate-duplicates-inventory | acc[5] | --object recorded in .filter | pass | filter null (full), {object:'showcase_dup_probe'} (scanned 2, 1 dup), {object:'showcase_category'} (scanned 0, 0 dups) |
| cli.migrate-duplicates-inventory | acc[6] | --database-url / OS_DATABASE_URL reach DB; unprobeable → skipped | pass | OS_DATABASE_URL run and --database-url run: same database path, duplicates arrays equal; DB copy with showcase_field_zoo table dropped → skipped [{ob… |
| cli.migrate-duplicates-inventory | acc[7] | no_sql_seam refuses loudly; memory:// boot_failed | pass | duplicates.null-seam.test.ts passed (vitest: 3 files, 18 tests passed); --database-url memory://qa → {"error":"boot_failed","detail":"…memory:// sc… |
| cli.migrate-duplicates-inventory | neg[0] | no write to inspected DB | pass | three dump pairs identical; scan created no sqlite file (.objectstack/data/showcase_external.db predates the scan, 13:01:31 from the dev boot) |
| cli.migrate-duplicates-inventory | neg[1] | within-partition repeat not in duplicates | pass | DUPX absent from duplicates |
| cli.migrate-duplicates-inventory | neg[2] | no --json flag (runner trap) | pass | migrate duplicates --json → 'Nonexistent flag: --json' exit 2 — recorded as the declared contract, not a finding; stdout parses as one JSON documen… |
| cli.migrate-duplicates-inventory | neg[3] | empty duplicates with skipped not called clean | pass | dup2 run: skipped non-empty listed with reason beside its duplicates; the --object showcase_category run had empty duplicates AND empty skipped (scan… |
| cli.datasource-introspect-codegen | acc[0] | list-tables lists tables; --schema narrows via ?schema= | pass | live (showcase copy in RUNDIR, port 41340, admin token): os datasource list-tables showcase_external → 'customers (7 cols)', 'orders (7 cols)' EXIT… |
| cli.datasource-introspect-codegen | acc[1] | introspect prints draft; --out writes file; REVIEW lines | pass | stdout draft showcase_customers with fields id, created_at, updated_at, name, email, region, lifetime_value (= remote columns), external.remoteName… |
| cli.datasource-introspect-codegen | acc[2] | --out jail refuses absolute and ../ paths, no file | pass | --out ../qa-escape.object.ts and --out /tmp/qa-escape.object.ts each: 'Error: --out must be a relative path within the current directory: …' EXIT… |
| cli.datasource-introspect-codegen | acc[3] | generated draft compiles through os build | pass | scratch config (namespace 'showcase') importing the draft: os build EXIT=0 'Data: 1 Objects 7 Fields'; artifact holds showcase_customers datasource… |
| cli.datasource-introspect-codegen | acc[4] | validate ✓ on match; ✗ diff rows + exit 1 on drift | pass | untouched: '✓ showcase_ext_customer matches' '✓ showcase_ext_order matches' EXIT=0; renamed customers.email→email_renamed: '✗ missing_column: showcas… |
| cli.datasource-introspect-codegen | acc[5] | server error arm → nonzero exit; validate unknown = vacuous ok | pass | list-tables qa_nope_ds: "[ObjectQL] Datasource 'qa_nope_ds' has no registered driver to introspect." EXIT=2; introspect qa_nope_ds: same text EXIT=2;… |
| cli.datasource-introspect-codegen | neg[0] | --out escape lands a file outside project | pass | both escape probes refused, no file written |
| cli.datasource-introspect-codegen | neg[1] | validate exits 0 with error diff | pass | error-severity diffs exited 1 (twice, two drift kinds) |
| cli.datasource-introspect-codegen | neg[2] | draft does not compile | pass | os build EXIT=0 |
| cli.datasource-introspect-codegen | neg[3] | route-spelling trap | pass | CLI addressed /external/tables (seen on echo server); /remote-tables not probed |
| cli.datasource-introspect-codegen | neg[4] | wrong-persona 403 | pass | admin token minted via sign-in; all commands answered 200-path data, no 403 |
| cli.hook-body-extraction-gates | acc[0] | --strict-body refuses each forbidden pattern with own reason | pass | '✗ --strict-body: 7 callable(s) lack a metadata body' with per-hook reasons: import -› 'dynamic import() and ES imports are not allowed … — declare… |
| cli.hook-body-extraction-gates | acc[1] | api.read/api.write inference incl. alias | pass | artifact body.capabilities: qa_i_find ['api.read'], qa_i_update ['api.write'], qa_i_alias (const api = ctx.api) ['api.read'] |
| cli.hook-body-extraction-gates | acc[2] | crypto.uuid/log inferred; hash infers nothing | pass | qa_i_uuid ['crypto.uuid'], qa_i_log ['log'], qa_i_hash (only ctx.crypto.hash) [] |
| cli.hook-body-extraction-gates | acc[3] | declared body caps verbatim; retired comment inert | pass | qa_i_data body {language:'js',source,capabilities:['api.read','log']} -› artifact caps ['api.read','log']; qa_i_retired (// @capabilities api.write l… |
| cli.hook-body-extraction-gates | acc[4] | #1876 free identifier bundled by default, fatal under strict | pass | default EXIT=0, warning 'handler references identifier(s) not in scope at runtime: qaHelperNormalize … will be BUNDLED', artifact qa_x_helper has no … |
| cli.hook-body-extraction-gates | acc[5] | all-body-only skips and cleans bundle | pass | after removing the helper hook from a dist holding objectstack-runtime.e7e05d3bb4160620.mjs: '→ Skipping legacy runtime bundle (all 1 callables are b… |
| cli.hook-body-extraction-gates | acc[6] | default build warns per refused handler, exits 0 | pass | default build over forbidden seven EXIT=0 (x2): '⚠ 7 handlers could not be lowered to a metadata body — bundled via the legacy runtime module instead… |
| cli.hook-body-extraction-gates | neg[0] | forbidden body never reaches artifact as source | pass | jq: all 7 forbidden hooks 'body' absent |
| cli.hook-body-extraction-gates | neg[1] | no crypto token from ctx.crypto.hash | pass | qa_i_hash caps [] |
| cli.hook-body-extraction-gates | neg[2] | strict never exits 0 with bodyless callable | pass | strict runs EXIT=1 with worded reasons, never 'could not parse' |
| cli.hook-body-extraction-gates | neg[3] | alias not escaping inference | pass | qa_i_alias ['api.read'] |
| cli.hook-body-extraction-gates | neg[4] | scope boundary (runtime sandbox not owned) | skipped | scope note, not a testable assertion here |
| cli.dev-automigrate-policy | acc[0] | safe applies exactly safe diffs, logs each, converges | pass | scratch stack, config-declared sqlite qa_main (schemaMode managed, autoMigrate 'safe') routed by datasourceMapping default; staged: relaxed storage.n… |
| cli.dev-automigrate-policy | acc[1] | off explicit or omitted: warns, schema unchanged | pass | autoMigrate 'off' boots ×2 and key OMITTED boots ×2: each logs the 3 [schema-drift] warnings (strict NOT NULL, extra orphaned, code legacy platform-w… |
| cli.dev-automigrate-policy | acc[2] | NODE_ENV=production ignores declared safe, warns, no alter | pass | re-planted legacy index, NODE_ENV=production + autoMigrate 'safe': log carries verbatim "[schema-drift] autoMigrate='safe' is ignored under NODE_ENV=… |
| cli.dev-automigrate-policy | acc[3] | safe only under managed; destructive never auto-applied | pass | safe boots ×2 kept the orphaned extra column and the NOT NULL on strict (warned each boot); composition: a second datasource qa_ext schemaMode 'ext… |
| cli.dev-automigrate-policy | acc[4] | ADR-0120 D4 tighten: clean→applied, duplicates→BLOCKED | pass | HAND-STAGED live (keyless os dev, injected safe): bare UNIQUE(organization_id, code) + two NULL-org rows code 'dup' → "[schema-drift] qaam_item: cann… |
| cli.dev-automigrate-policy | acc[5] | CLI injects safe only in dev, keyless | pass | no-datasource scratch stack, os dev -d file:host.db (no autoMigrate anywhere): planted legacy index → '[schema-drift] auto-reconciled replace_uniqu… |
| cli.dev-automigrate-policy | neg[0] | safe applies destructive drift | pass | orphaned column survived every safe boot |
| cli.dev-automigrate-policy | neg[1] | off/omitted/production boot changes schema dump | pass | dump pairs identical for off×2, omitted×2, production |
| cli.dev-automigrate-policy | neg[2] | duplicates tighten auto-applied | pass | blocked with row report, rows and old index intact |
| cli.dev-automigrate-policy | neg[3] | autoMigrate on sqlite-wasm appearing to act | skipped | not staged (knownGaps: wasm/turso arms not staged) |
| cli.migrate-meta-write-stored-and-all | acc[0] | write/stored/relevance pins pass | pass | t1-cli.log @5b14b7f3: cli migrate-meta-write 23, meta.report-order 21; spec semantic-relevance 22, refused-shapes 46; service-automation canonicalize… |
| cli.migrate-meta-write-stored-and-all | acc[1] | report-only run leaves sources byte-identical | pass | scratch showcase with planted refreshInterval:300 + spread ...{refreshInterval:60}: tracked-sources hash 0f280d836f778ed9 before == after `migrate me… |
| cli.migrate-meta-write-stored-and-all | acc[2] | --write edits mechanical sites, lists manual, idempotent | pass | --write --json exit 0: 2 files 4 insertions/4 deletions (refreshInterval→refreshIntervalSeconds; 3 flow decision config:{mode:'inclusive'}), nothing … |
| cli.migrate-meta-write-stored-and-all | acc[3] | absent notices one line; --all lists them | pass | minimal stack (one object): default prints 383 notices + '21 more manual change(s) not listed: their surfaces are absent from this stack (run with --… |
| cli.migrate-meta-write-stored-and-all | acc[4] | --stored TODO per refused stored shape | pass | scratch DB + sys_metadata view row with data.provider:'api': --stored --json exit 0 scanned 2 canonical 1 skipped 1; row qa_api_view todos[0].conve… |
| cli.organization-ownership-ceremony | acc[0] | ceremony pins pass at subject sha | pass | t1-cli.log packages/cli @5b14b7f3: 22 files/309 passed; apply-flags 7, organization-ownership-apply 112, occupancy 5, dialect 19, apply-gate 5, comme… |
| cli.organization-ownership-ceremony | acc[1] | bare run writes plan, DB checksum unchanged | fail | bare run (twice, --out and default/--json) → exit 1 {error:plan_refused, reason:upgrade-unavailable, code:NOT_IMPLEMENTED}; NO organization-ownership… |
| cli.organization-ownership-ceremony | acc[2] | plan-file-required / mismatch / database-busy refusals | fail | --apply w/o plan, --apply with other-DB plan, --apply beside a live better-sqlite3 holder: all three → exit 1 apply_refused reason upgrade-unavailabl… |
| cli.organization-ownership-ceremony | acc[3] | apply checkpoints sys_migration; drop gate withholds | fail | drop-gate half PASSES live: migrate apply --allow-destructive --yes --json on v17 copy → exit 1 message refused_organization_ownership_unmigrated t… |
| cli.organization-ownership-ceremony | acc[4] | migrated copy boots under v18 | fail | no migrated copy can be produced in 18.0; os dev/os serve on the v17 copy exit 1 before listening: 'This database is still in the v17 organizatio… |
| cli.organization-ownership-ceremony | neg[0] | no refusing arm alters the DB | pass | every ceremony arm (bare x2, apply x4 incl. holder) and the refused --allow-destructive apply left v17 copies at sha acc7f22dfda38a46 (== pristine co… |
| cli.meta-package-flags-and-explain | acc[0] | package/force/no-op/explain pins pass | pass | t1-cli.log @5b14b7f3: register-package 8, delete-reset-carriers 29, register-force 7, explain-rule-id 14, delete-noop-line 7 — all passed |
| cli.meta-package-flags-and-explain | acc[1] | --package sends ?package=, empty refused pre-send | pass | register --package com.example.showcase → PUT …/meta/view/showcase_task.qa_view?package=com.example.showcase (422 WRITABLE_PACKAGE_REQUIRED, read-onl… |
| cli.meta-package-flags-and-explain | acc[2] | destructive register: hint, then --force passes | pass | object qa_destr minus field 'note' → 409 DESTRUCTIVE_CHANGE + '⚠ On this command, ?force=true is --force …', exit 1; with --force '✓ Metadata registe… |
| cli.meta-package-flags-and-explain | acc[3] | explain --json shape, list, unknown exits 1 | pass | explain field-no-consumers exit 0; --json keys [rule,covers,paragraphs(7)] exit 0; bare explain lists schemas + rule ids exit 0; no_such_rule → '✗ Un… |
| cli.validate-v18-authoring-verdicts | acc[0] | new verdict pins pass | pass | t1-cli.log @5b14b7f3: spec define-seed-record-keys 9, stack-duplicate-entry 138, stack-cbp-extension-master 12, stack-email-sms 16; formula validate-… |
| cli.validate-v18-authoring-verdicts | acc[1] | each arm fails validate and build | pass | validate --json/validate/build exits: seed created_atx 1/1/2 (did-you-mean 'created_at'); record["typo"] 1/1/1 expression-invalid 'unknown field `typ… |
| cli.validate-v18-authoring-verdicts | acc[2] | controls pass | pass | stock (seed key created_at) 0/0/0; record.name != "record.typo" 0/0/0; email:{provider:'log'} 0/0/0, each with 'Validation passed' |
| cli.verify-derived-proof-families | acc[0] | five family pins pass | pass | t1-cli.log @5b14b7f3: verify-reference-shapes 3, verify-delete-behaviors 3, verify-unique-scopes 3, verify-parent-write-reach 3, verify-dashboard-win… |
| cli.verify-derived-proof-families | acc[1] | each family exit 0, report in --json | pass | showcase copy: --reference-shapes exit 0 referenceShapes{proven 8,holes 0}; --delete-behaviors 0 deleteBehaviors{proven 9,contradicted 0}; --unique-s… |
| cli.verify-derived-proof-families | acc[2] | planted defect → --delete-behaviors nonzero | pass | planted beforeDelete hook on showcase_account deleting its contacts (declared set_null): exit 1, hardFailures 1, showcase_contact.account declared se… |
Reproduction rules (fails)
cli.organization-ownership-ceremonyacceptance[1], acceptance[2], acceptance[3] (checkpoint half), acceptance[4] — disposition: stale-spec · stale-spec, NOT release-blocking. RUNNER rule 7: an independent second agent re-derived the verdict from the captured evidence alone (plus one confirming probe on a fresh copy of the v17 fixture: exit 1 plan_refused / upgrade-unavailable / NOT_IMPLEMENTED, no plan file, sha256 acc7f22dfda38a46 before == after) and AGREES: fail, stale-spec, not a release stop. Revision 1 pins the full v17-to-v18 ceremony; ruling records 6259608309 (item 1) and 6259698357 then cut 18.0 to fresh installs on the single posture, carried by .changeset/pre/15212-180-guards-fresh-single-only.md, the ADR-0131 release-scope note and organization-ownership.ts:1098-1146. Every refusing arm left the DB byte-identical, the drop gate held and the v17 boot guard refused — the ruled 18.0 behaviour. Re-point (revision 2 to the 18.0 refusal contract with the ceremony moved to planned / since 18.x, or planned + a separate refusal item; add organization-ownership.release-refusal.test.ts to automated.ref) is parked on the wave anchor via the Checklist-accuracy section, per this wave plan.- repro: scratch DB = os-dev-synced showcase DB +
ALTER TABLE sys_platform_setting ADD COLUMN organization_id TEXT(the apply-gate pin's v17 shape); from scratch app copy:os migrate organization-ownership --database-url file:V17 [--json];… --apply [--plan-file P --backup-taken](with and without a second process holding the file); thenos dev -d file:COPY - expected vs actual: expected: plan file written; plan-file-required / plan-*-mismatch / database-busy reasons; sys_migration adr-0131 checkpoint; migrated copy boots. actual: every invocation answers NOT_IMPLEMENTED upgrade-unavailable 'os migrate organization-ownership is not available in 18.0. 18.0 supports fresh installs only; the v17 → v18 upgrade path ships in an 18.x release … Nothing was read or written.' exit 1; boot guard refuses the v17 copy
- mechanism: deliberate: packages/cli/src/commands/migrate/organization-ownership.ts:1093-1146 (MigrateOrganizationOwnership overrides run(); ruling record 6259608309 on the v18 epic, item 1); pinned by organization-ownership.release-refusal.test.ts (5/5 passed, run by C4 — not in this item's automated.ref)
- repro: scratch DB = os-dev-synced showcase DB +
Derived item verdicts
17 pass · 0 partial · 1 fail · 0 blocked · 4 not-run (of 22).
Tier 1 pin runs (RUNNER rule 6, one vitest batch per package, all at the subject sha):
- packages/cli: 22 files, 309 passed (organization-ownership.apply-flags, organization-ownership-apply, organization-ownership.occupancy.integration, organization-ownership.dialect, apply-organization-ownership-gate.integration, comment-reactions.integration, organization-ownership-host-supplement.integration, migrate-meta-write, meta.report-order, verify-tenancy-posture, format.exit-code, register-package, delete-reset-carriers, register-force, explain-rule-id, delete-noop-line, verify-reference-shapes, verify-delete-behaviors, verify-unique-scopes, verify-parent-write-reach, verify-dashboard-windows, datasource/envelope-unwrap)
- packages/spec: 6 files, 243 passed (conversions/refused-shapes, data/define-seed-record-keys, migrations/semantic-relevance, stack-cbp-extension-master, stack-duplicate-entry, stack-email-sms)
- packages/lint: 2 files, 113 passed (data-model-rules.master-detail-required, validate-component-props); packages/formula: 1 file, 31 passed (validate-field-existence-spellings)
- packages/services/service-automation: 1 file, 40 passed (canonicalize-stored-flow); packages/drivers/driver-sql: 1 file, 13 passed (sql-driver-schema-drift)
- packages/rest: 1 file, 10 passed (remote-tables-twin.equivalence); packages/services/service-datasource: 1 file, 42 passed (external-datasource-service)
- extra pin run by the runner: packages/cli organization-ownership.release-refusal.test.ts 5/5 passed (the 18.0 refusal pin — NOT listed in the item automated.ref)
- cli.scaffold-first-run: its ref is the GitHub workflow .github/workflows/scaffold-e2e.yml, not runnable here — every clause driven by hand with the pre-release variant (73 workspace packages packed at 5b14b7f into a local-only registry, lockfile integrities checked against the local tarballs); the published create-objectstack@latest 17.7.0 was run separately and does not stand in for the pin
Handover — items with no verdict this run
cli.flag-command-error-uxr3 · P2 · cli — Tier 3 deferred by the 18.0 release-sweep plancli.doctor-deprecation-scanr3 · P2 · cli — Tier 3 deferred by the 18.0 release-sweep plancli.lint-severity-exit-contractr1 · P2 · cli — Tier 3 deferred by the 18.0 release-sweep plancli.plugin-manifest-build-contractr3 · P2 · cli — Tier 3 deferred by the 18.0 release-sweep plan
Checklist-accuracy findings / fixture gaps
Recorded for the wave anchor (collected by the dispatch session); not extracted, no checklist edit in this run.
Checklist accuracy:
- cli.build-own-contract · steps[2] · 'delete its type' on a stock helper-authored object (ObjectSchema.create / Field.textarea) does not reach compile's validator: ObjectSchema.create parses eagerly at import, so the build dies at 'Loading configuration…' with a RAW JSON dump of the Zod issue array (path [fields,body,type], no object name) — exit 2 human / 1 json. The located 'defineStack validation failed … objects.0.fields.body.type' shape needs the object authored as a plain literal; say so in the step
- cli.build-own-contract · steps[5] · the nested strip-mode key must sit on a RAW field object: written inside a helper (Field.textarea({ visibleWhen: { …, qaUndeclared: 1 } })) it is stripped by the helper's own parse with NO advisory under either defineStack mode (build exit 0, key silently absent). Name the raw-literal requirement in the step (the silent strip itself may deserve a separate look — the 排查「手抄 spec 清单 + "keep in sync" 注释」模式:一天内确认三例,全部曾静默漂移 #3786 'never silently dropped' intent does not cover helper-built fields)
- cli.build-own-contract · acceptance[3] · build's rule-failure payload names the findings 'issues' while validate --json names the same list 'errors' (and success:false vs valid:false); warnings/conversions do match. The clause's parity wording covers only warnings/conversions, so pass — but the failure-list key differs between the two surfaces
- cli.hook-body-extraction-gates · steps[0] · FORBIDDEN_PATTERNS now has more than seven entries (.sudo(, .create( …); the 'forbidden seven' covers only the original set
- cli.doctor-health-report · fixtures · the stock blank scaffold always carries an Object usage ⚠ (starter object unreferenced) so a baseline never reaches '✅ healthy' — the clean three-✓ run needs a view on the note (staged here)
- cli.qa-suite-execution · steps[6] · 'the server log carries no request attributable to it' cannot be consulted: the stock dev boot logs no per-request lines. Suggest the transcript (no Scenario line) plus a uniquely tagged target URL as the oracle
- cli.qa-suite-execution · fixtures.requires[0]/steps[0] · prescribes
pnpm dev -- --fresh -p ‹port›from repo root; the sweep brief's isolated boot (-d file:RUNDIR/‹db›) works equally and is what was used - cli.migrate-duplicates-inventory · acceptance[3] verify · 'the SAME database run through os migrate plan mentions neither the index nor the seeded name': plan's STDOUT does carry the seeded name in '[Registry] Registered view: qa_c2_dup_view' boot lines (and stderr in [metadata_spec_invalid]); only the plan REPORT omits both. The clause should scope to the report body
- cli.migrate-duplicates-inventory · steps[4] · 'Seed a metadata body the spec accepts' — a minimal {name,label,object} view body is refused ('no recognized view key'); naming a known-valid minimal body (e.g. with type/columns) would save the next runner the hydration noise
- cli.migrate-meta-codemod · fixtures.knownGaps[2] · ObjectSchema.create()/definePermissionSet() parse at module load, so a retired key planted inside them throws before the chain runs; the knownGap could say that plants must be plain literals outside define/create helpers that parse (defineStack itself is tolerated: the CLI hands its refusal to the chain)
- cli.dev-automigrate-policy · acceptance[5] / steps[4] · the injection site cited as storage-driver.ts
isDev ? { autoMigrate: 'safe' } : {}moved: since cli: a plain os dev (standalone stack) never runs autoMigrate 'safe' — the documented dev self-heal applies only to host configs, while plan and drift lines say "auto-applied at boot" #21733 the decision lives in packages/runtime/src/dev-auto-migrate.ts, read by createStandaloneStack's default datasource plus the CLI fallback/telemetry; behavior matches the clause - cli.scaffold-console-first-paint · fixtures.knownGaps[2] · under the pre-release variant the scaffold's console is the locally packed @objectstack/console (pinned .objectui-sha), not the published one — the gap text assumes the published path only
- cli.datasource-introspect-codegen · acceptance[0] · the 'CLI flag-to-query forwarding is not pinned' remainder can be proven without a schema-bearing driver by pointing --url at a local echo server (observed GET …/external/tables?schema=mart); consider adding that to steps
- cli.organization-ownership-ceremony · whole item · describes the 18.x upgrade ceremony; at 5b14b7f the registered
os migrate organization-ownershiprefuses every invocation with NOT_IMPLEMENTED (ruling record 6259608309, organization-ownership.ts:1093-1146). acc[1]-[4] and steps 1-3,6 need an 18.0 rewrite (refusal reads nothing / writes nothing; drop gate holds; boot guard refuses) or a planned split for 18.x - cli.organization-ownership-ceremony · automated.ref · omits packages/cli/src/commands/migrate/organization-ownership.release-refusal.test.ts, the pin of what 18.0 actually ships; the listed pins exercise the inner OrganizationOwnershipCeremony class, not the registered command
- cli.migrate-meta-write-stored-and-all · steps 1-3 ·
--from 17does not replay 16→17 conversions (e.g. view.striped stays a refusal); plant 17→18 spellings (refreshInterval, object-grid defaultFilters). The showcase has 0 absentTodos, so the --all leg needs a minimal stack, as the step hints - cli.meta-package-flags-and-explain · step 1 ·
register view … --package com.example.showcaseanswers 422 WRITABLE_PACKAGE_REQUIRED on stock showcase (code package is read-only) — ?package= is still visible in the request URL, but a positive save needs a writable package; view names are‹object›.‹view› - cli.migrate-plan-apply-json · step 2 · on an os-dev-synced DB the 'pending add-column plan' also carries 7 create_table entries for the dev telemetry-home tables
Fixture gaps:
- cli.dev-boot-contract · no stock fixture declares a config default datasource (datasourceMapping default:true → declared sqlite datasource); staged in a scaffold copy for the config-datasource tier
- cli.migrate-meta-codemod · the refusal kinds other than 'spread' (computed, helper, shared, …) and the 'restored' exit-1 branch were not reconstructed in this run; they rely on the migrate-meta-write.test.ts pin
- cli.migrate-duplicates-inventory · the mongodb no_sql_seam branch is unverified (driver not loaded), as the item already records
- cli.datasource-introspect-codegen · stock fixture yields no draft.review notes, so the REVIEW: warning surfacing is never observable live
- cli.scaffold-first-run · no sqlite3/verdaccio in the image: pre-release variant needed verdaccio@6 installed into RUNDIR (npm) and packing 73 public packages (~1 min)
- cli.organization-ownership-ceremony · no shipped v17 DB; built by planting sys_platform_setting.organization_id (+ sys_comment.reactions) into an os-dev-synced v18 DB, as the apply-gate pin does
- cli.verify-verdict-exit-mapping · fail side staged at RUNDIR/failapp (hook-mutated title → fidelity-gap; throwing hook → create-failed 400); no 5xx or live RLS hole staged
Observations handed to the dispatch session (no card filed — this runner card's 3-card defect quota is spent on #24546 / #24547 / #24548)
- Dead-end remedy text (seen driving
cli.organization-ownership-ceremonyacceptance[3]): theos migrate applydrop-gate refusalrefused_organization_ownership_unmigrated(packages/cli/src/commands/migrate/apply.ts:586-590) tells the operator to runos migrate organization-ownership --out PLANand then--apply— both of which refuse NOT_IMPLEMENTED in 18.0. The boot-guard sentence already carries the 18.0 caveat; this one does not. reach:os migrate apply --allow-destructive --yes --jsonon a v17-shaped DB copy prints the prescription. Low severity, release-frozen wording. - Cross-area note for
platform-core.v18-boot-refusalsacceptance[2] (not in this selector):os serve(non-dev) against a v17-shaped DB first synced byos devcreated 7 new tables (sys_automation_run and siblings) before the v17 guard refused — DB checksum changed, no existing table or row changed.os devon the same copy left the DB byte-identical.
Activity
objectstack-fleet commentedon Oct 19, 2026
Close-out for this run record. No product defect was found in this area, so nothing is extracted from it.
Still open on this record, handed to the dispatch session for the wave anchor (runners file no anchor card this wave):
cli.organization-ownership-ceremonyacceptance[1]-[4] fail — disposition stale-spec, not release-blocking. RUNNER rule 7 independent re-derivation agrees (fail · stale-spec · not a release stop). Re-point belongs on the anchor; addorganization-ownership.release-refusal.test.tsto itsautomated.ref.apply.ts:586-590names commands that refuse in 18.0; and a cross-area note forplatform-core.v18-boot-refusalsacceptance[2] — see the body.P0
cli.dev-boot-contractpassed; no authentication/authorization finding.Generated by Claude Code
[-]QA run · area:cli (18/22) · 5b14b7f3 · 2026-10-19 · 17 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 4 NOT-RUN[/-][+]QA run · cli (18/22) · 5b14b7f3 · 2026-10-19 · 17 PASS / 0 PARTIAL / 1 FAIL / 0 BLOCKED / 4 NOT-RUN[/+]objectstack-fleet commentedon Oct 19, 2026
Parked-on: #24579 · this record's checklist-accuracy findings, fixture gaps, partial coverage gaps and not-run handover (wave anchor §2–§4)
Parked-on: #24579 · cli.organization-ownership-ceremony · acceptance[1]–[4] (re-point, wave anchor §1)
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Closure complete (checklist-test §5): every FAIL in this record has a disposition (the
Extracted:/Parked-on:lines above), and its partial coverage gaps and not-run handover are parked on #24579.Closed by: the 18.0 QA wave dispatch session
session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's instruction there on 2026-10-19, verbatim 「qa-run的卡片处理完的是不是可以关闭」.Generated by Claude Code