Skip to content

[finding] cli checklist: dev-boot-contract clause 2 names retired resolveDefaultDevDbUrl / dev.db — refresh to unified objectstack.db #7650

Description

@huangyiirene

Symptom

cli.dev-boot-contract clause 2 (docs/qa/platform-checklist/areas/cli.json:45) names .objectstack/data/dev.db and the helper resolveDefaultDevDbUrl, both superseded by the unified objectstack.db default. On origin/main, packages/cli/src/commands/dev.ts now resolves the nothing-chosen default to <state dir>/data/objectstack.db (legacy dev.db handled only for back-compat) and no longer exports resolveDefaultDevDbUrl — 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.db and the resolveDefaultDevDbUrl helper was removed/renamed. Refresh the clause and its related file/step references (cli.json:28, :80, :88, all of which still name resolveDefaultDevDbUrl and/or .objectstack/data/dev.db) to name objectstack.db and the current resolution path in dev.ts, keeping the persistent-file property assertion intact.

Reproduction

On origin/main: git grep -n resolveDefaultDevDbUrl -- 'packages/cli/src/**' returns nothing, while docs/qa/platform-checklist/areas/cli.json still names it and .objectstack/data/dev.db. packages/cli/src/commands/dev.ts comments and code use the unified objectstack.db default (e.g. lines 29, 239, 275).

Source

Extracted from the QA run #7628 (framework 92f26f7, console 6314e87f).

Activity

  1. os-zhuang commented on Aug 11, 2026

    @os-zhuang
    Contributor

    Triage — dual-state resolution: pm:queue + domain:devx kept; finding removed (queue+finding is an illegal pair).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 11, 2026
  3. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: 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 Fixes lines, 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.json only; ⛔ not coverage.json, ⛔ not other area files, ⛔ no packages/cli code (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 touches cli.json (checked at claim time).


    Generated by Claude Code

  4. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor
    {
      "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-changeset applied by me and read back.


    Generated by Claude Code


    Generated by Claude Code

  5. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT (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-references flag-command-error-ux so 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

  6. added a commit that references this issue on Aug 17, 2026
    7756490
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions