Repository navigation
[finding] cli checklist: dev-boot-contract clause 2 names retired resolveDefaultDevDbUrl / dev.db — refresh to unified objectstack.db #7650
Description
Activity
Triage — dual-state resolution:
pm:queue+domain:devxkept;findingremoved (queue+finding is an illegal pair).- Why queue: pure checklist text refresh with every edit site named (
cli.json:28/:45/:80/:88), direction unambiguous (rename to the unifiedobjectstack.dbdefault, keep the persistent-file property assertion). Mechanical, dispatchable. - Premise verified on
origin/main@5823d59:resolveDefaultDevDbUrl— 0 hits underpackages/cli/src(zero-hit counter-probed: the same grep DOES hitcli.json:45/:88, so the scanner sees the tree);objectstack.dbpresent indev.ts(3 hits). Text is stale exactly as filed. - Routing: checklist text ⇒
domain:devx(filing-time label correct). Bundle-mate hint: finding: three checklist/doc corrections for thesearcharea (from the #7629 run) #7647/[finding] cli checklist: build-own-contract clause 4 vs flag-command-error-ux disagree on exit code 2 — narrow clause 4 to the #4873 duration-leak #7648 are the same one-file family from the same QA wave — one sweep PR would satisfy all three (sweep discipline: same criterion, per-item checklist in the PR body). - Dedup: no other open card names these clause sites.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- Why queue: pure checklist text refresh with every edit site named (
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsClaim: PM loop round 3 (devx seat, 2026-08-11 term) — wave 3 unit E, packed with #7648 (both land in the cli checklist area file; one dev, one PR, two
Fixeslines, itemized checklist)
Session:session_01GZKbx4xyF7U5WXj6ch49BM
Branch:claude/issue-7650-7648-cli-checklist
Worktree: cloud session, own clone
Domain:domain:devx
File surface:docs/qa/platform-checklist/areas/cli.jsononly; ⛔ notcoverage.json, ⛔ not other area files, ⛔ nopackages/clicode (both cards are text/reconciliation — the product behavior is correct as shipped)
Container & model: M (clause reconciliation judgment — #7648's narrowing must keep the #4873 duration-leak pin load-bearing),mode:cloud,model: opus
Serial constraints cleared: pairwise-disjoint wave-3 partition; no other claim or open PR touchescli.json(checked at claim time).
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actions{ "issue": 7650, "also_closes": 7648, "status": "done", "branch": "claude/issue-7650-7648-cli-checklist", "pr": "https://github.com/objectstack-ai/objectstack/pull/7712", "premise_still_valid": true, "summary": "Packed card, one PR, one file: docs/qa/platform-checklist/areas/cli.json (32 insertions, 19 deletions, 1 file changed) — no coverage.json, no other area file, no packages/cli code. #7650: refreshed cli.dev-boot-contract (rev 1 to 2) off the retired resolveDefaultDevDbUrl / .objectstack/data/dev.db naming onto #6469's unified (state dir)/data/objectstack.db resolved through the shared resolveProjectDatabaseUrl, which dev maps its flags onto via resolveDevDatabase. All four filed sites re-derived identical at my ref (cli.json:28/:45/:80/:88) and updated, plus two new tiers the current resolution actually has (config-declared default datasource; legacy dev.db/standalone.db compat-read with its loud notice) as variants, a step and a negative for the legacy notice, and resolve-project-database.ts + unified-db-resolution.pin.test.ts added to sources. The load-bearing property survives verbatim in substance — nothing-chosen still defaults to a PERSISTENT project-anchored sqlite file, never :memory: — a rename, not a weakening. #7648: narrowed cli.build-own-contract clause 4 (rev 1 to 2) from 'exit codes are exactly 0 or 1' to the #4873 duration-leak it exists to pin, and named the legitimate exits explicitly (0/1 via CliExitCode on every emitJson/emitText caller; 2 as oclif ExitError when the human path ends in this.error()), so a config-load-time throw exiting 2 stops reading as a violation and the collision with cli.flag-command-error-ux dissolves. The clause stays load-bearing by two tests the old wording lacked: a value that TRACKS something still fails it (a successful run exiting nonzero — the 531 and 0xFF = 19 shape), as does any code that moves between two identical runs; a repeat-run step and a matching negative were added to keep it falsifiable, and the CliExitCode source note was corrected to say it narrows the emitJson/emitText slot, not oclif's own error exit.", "tests": "Docs-only JSON change — no package build/test applies; the card's gate families were run locally instead. (1) pnpm check:platform-checklist — 'checklist-select self-test: 17 cases pass'; validator output BYTE-IDENTICAL to the pre-edit baseline captured on the same ref: 'check-platform-checklist: 1 problem(s) / coverage.json · qa: UNCLASSIFIED', i.e. the known base-carried #7347 red, recorded and not chased; diff(baseline, after) is empty, so this change adds no finding and removes none. (2) Reverse verification, direction predicted BEFORE running as RED (a text-only change has no runtime behaviour to flip; the real question is whether the gate reads the items I edited): setting cli.dev-boot-contract revision back to 1 against its history entry 2 produced 'check-platform-checklist: 2 problem(s)' with the new line 'cli.json · cli.dev-boot-contract: revision (1) must equal the last history entry's revision (2)'; restored with git checkout -- (never git stash) and back to the baseline 1 problem. The gate is not blind to these items. (3) JSON validity: parses, 6 items, every item's revision equals its last history entry's revision (2,2,1,1,1,1). (4) pnpm check:nul-bytes — self-test 75 assertions pass; 'OK (scanned 7104 text file(s) ... no raw ASCII control bytes)'; plus a self-scan of the edited file beyond the gate (grep -naP over the control-byte ranges) came back clean. (5) Premise re-verification at my ref 21888ab, both cards, with the zero-hit counter-probe re-run: git grep resolveDefaultDevDbUrl -- 'packages/cli/src/**' returns zero hits while the SAME grep hits cli.json:45 and :88, so the zero is real and not a broken probe (repo-wide the name survives only in two CHANGELOG.md entries); dev.ts uses objectstack.db at lines 29/239/275; format.ts:41 still reads CliExitCode = 0 | 1 and compile.ts's this.error() catches are still at :411/:480 on the human branch while the --json branch above each answers via emitJson + this.exit(1). CI status at report time: in_progress — not polled, per the report-at-draft-PR-time contract; PM owns convergence. Label applied and read back as the union: ['size/s', 'skip-changeset'] (size/s was bot-applied first and survived the write).", "open_questions": [], "out_of_scope_findings": [] }Draft PR: #7712 — first lines
Fixes #7650/Fixes #7648, itemized per-card before/after checklist in the body. No changeset (docs-only);skip-changesetapplied by me and read back.
Generated by Claude Code
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsACCEPT (both cards) — PR #7712. Review record: one file (
areas/cli.json), inside the claimed surface. #7650: the unified-default refresh keeps the load-bearing property verbatim in substance (persistent project-anchored file, never:memory:), adds the two real tiers (config datasource; legacy compat-read with its loud-notice step and negative) rather than just renaming, and cites the shared resolver + pin test. #7648: the narrowing is exactly right — the clause now pins what #4873 WAS (a computed value tracking something in the exit slot, detectable by nonzero-on-success or a code that moves between identical runs), names the legitimate exits explicitly, adds the repeat-run step that keeps it falsifiable, and cross-referencesflag-command-error-uxso the two items cannot re-collide. The reverse verification (revision rollback → gate counts 2 problems → restore) proves the gate reads these items. Landing: flip + arm once gate jobs conclude.
Generated by Claude Code
- added a commit that references this issue
on Aug 17, 2026
Symptom
cli.dev-boot-contractclause 2 (docs/qa/platform-checklist/areas/cli.json:45) names.objectstack/data/dev.dband the helperresolveDefaultDevDbUrl, both superseded by the unifiedobjectstack.dbdefault. Onorigin/main,packages/cli/src/commands/dev.tsnow resolves the nothing-chosen default to<state dir>/data/objectstack.db(legacydev.dbhandled only for back-compat) and no longer exportsresolveDefaultDevDbUrl—git grep resolveDefaultDevDbUrl -- 'packages/cli/src/**'returns nothing. The load-bearing property the clause verifies — nothing-chosen defaults to a PERSISTENT project-anchored sqlite file, never the:memory:that wipes work on restart — still holds; only the item text is stale.Root cause
Checklist text drift. The clause text was not updated when the DB default was unified to
objectstack.dband theresolveDefaultDevDbUrlhelper was removed/renamed. Refresh the clause and its related file/step references (cli.json:28,:80,:88, all of which still nameresolveDefaultDevDbUrland/or.objectstack/data/dev.db) to nameobjectstack.dband the current resolution path indev.ts, keeping the persistent-file property assertion intact.Reproduction
On
origin/main:git grep -n resolveDefaultDevDbUrl -- 'packages/cli/src/**'returns nothing, whiledocs/qa/platform-checklist/areas/cli.jsonstill names it and.objectstack/data/dev.db.packages/cli/src/commands/dev.tscomments and code use the unifiedobjectstack.dbdefault (e.g. lines 29, 239, 275).Source
Extracted from the QA run #7628 (framework 92f26f7, console 6314e87f).