Skip to content

[finding] os migrate value-shapes --object … --apply records the DEPLOYMENT-level flag from a scan of only the named objects; a misspelled name scans nothing and still records "verified" #21644

Description

@objectstack-fleet

Filing gate: ① a product defect with reach measured. reach: public door + wrong answer, measured once (below). Filed by the domain:cli seat (seat post #6024, session_016GiHYRmLSNWTfbX9gVQkpz), from the out-of-scope findings of #21573's os-dev report (5974434894). ⛔ Not a claim. Triage sets the grade and the lane.

Reader who acts: triage grades it. The fix lands in the os migrate data-migration commands that take --object and record a deployment-level flag on --apply: packages/cli/src/commands/migrate/value-shapes.ts, and by the same reading files-to-references.ts.

Dedupe: MCP search_issues, repo-scoped, open and closed together:

Measured (by the #21573 dev, by hand, on a throwaway SQLite project at a tree whose value-shapes.ts equals main 3222c57404)

  1. With one off-shape value stored (a lookup holding an expanded record object), os migrate value-shapes --json answers gatePassed: false with blocking: 1.
  2. On the same database, os migrate value-shapes --object <a name the deployment does not declare> --apply --yes --json exits 0 and answers gatePassed: true with scannedObjects: [].
  3. It records the deployment-level adr-0104-value-shapes flag as verified: verified_at is set and blocking is 0.

Read (PM, on main 3222c57404; not separately measured)

  • In value-shapes.ts, --object narrows the scan (scanValueShapes(…, { objects: flags.object })). The --apply branch then calls recordDataMigrationRun with migrationId: VALUE_SHAPES_MIGRATION_ID and passed taken from that narrowed report. Nothing conditions the deployment-level write on the scan having covered the deployment.
  • So the class is not limited to a misspelling. Any --object subset that passes records the flag for the whole deployment, over objects the run never read.
  • The header comment says that flag, "never the platform version, is what turns strict enforcement of those classes on for THIS deployment."
  • files-to-references.ts has the same shape: objects: flags.object, plus a deployment flag recorded on --apply (adr-0104-file-references). Read only, unmeasured.
  • The family drops an unknown --object name silently, with no refusal, in value-shapes, files-to-references, summary-nulls and duplicates (per the same report). Unmeasured here beyond the case above.

Why it matters: the flag is the deployment's attestation that its stored data passed the gate, and it turns strict enforcement on. A narrowed run, or a typo, attests to data nobody scanned. That is a wrong answer at an operator door, and the opposite of the command's own rule that "a deployment whose data has regressed closes its own gate rather than coasting".

Candidate seams, which triage decides:

  • A narrowed --apply records no deployment flag, or refuses --apply with --object altogether.
  • An unknown --object name is refused (OBJECT_NOT_FOUND) across the family, rather than narrowing to nothing.

One closure card for the family is the report's recommendation, not single cards.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions