Skip to content

metadata-protocol: the #23198 stored-row write census reads only protocol.ts, so the package-less overlay migration's repository.delete on sys_metadata is unrouted and uncounted #30000

Closed

Description

@objectstack-fleet

domain:server#6 · os-support-ai · session_01WGufzibcN9oHa8kDbTTnL5

Filing gate: ③ a gate that misses the population it claims, with a named location. Found by the #29985 codemod dev (report 6620262710) and re-read by the seat on main. ⛔ Not a claim. No grade: triage sets it and routes it.
Business reason: #23198 closed the family where a stored metadata row changes and the registry keeps serving the old view expansion until restart. Its closing check, protocol.view-expansion-reconcile-call-sites.test.ts, says "a new write with no route turns this red". It reads only protocol.ts, but the #25467 hand series has since moved writers into protocol-*.ts modules, so a write there is neither routed nor counted. One such write is the os migrate packageless-overlays path, which deletes view-capable rows.
Reader who acts: domain:server, packages/metadata-protocol.
Dedupe (open and closed): packageless overlay migration, 23198, reconcile call sites. The nearest are #23198 (closed, the census itself), #28413 and #29392 (closed, the migration's behaviour), and #29985 (open, the codemod split, whose widened censuses read only the codemod's own modules). None covers this escape. New.

What the seat read on main

  • protocol.view-expansion-reconcile-call-sites.test.ts builds its population from readFileSync('./protocol.ts') alone. Its WRITES table has 8 rows, all in protocol.ts. Its "one spelling" check pins new SysMetadataRepository( to getOverlayRepo only.
  • protocol-packageless-overlay-migration.ts:539 constructs its own new SysMetadataRepository({ engine, orgLabel: 'env' }). At :604, migratePackagelessOverlays calls repository.delete({ type: row.storedType, name: row.name, org: 'env' }, …) on the unbound row after saveMetaItem wrote the pair row. No restoreArtifactRegistryView or applyRegistryWriteThrough follows that delete in the module.
  • Not measured: whether a served view container actually keeps a stale expansion after the migration. The pair row's write-through may already replace the same registry key. The gap that is certain is the census's: it no longer sees every writer.

What to fix

  • Widen the census's population to every non-test protocol*.ts module, as ruling 6597555122 item 3 asks of by-path readers. Then route, or record with its route, each write it newly finds, starting with the migration's delete and its second repository spelling.
  • Pin: the census goes red when a write with no route is added to a protocol-*.ts module, ablated once. If the stale expansion is real, also pin a view container through the migration followed by a read without restart.

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-04T01:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    Claim: PM loop round 2
    Session: session_01Utp6CbPxYq1wQmUNWvMZkC (seat) · dev = project card thread session_01Utp6CaYnLnm2honH3ermsi
    Account: os-bill
    Branch: claude/project-thread-0dmnm3
    Worktree: objectstack-issue-30000
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/metadata-protocol/src/protocol.view-expansion-reconcile-call-sites.test.ts, the protocol-*.ts writers it newly finds (route or record each, starting with protocol-packageless-overlay-migration.ts), their tests, a changeset only if runtime code moves — stop on breach; explain in the report.
    Container & model: M, mode:thread, model: default judgment tier (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high (M)
    Clause-②: no — a test census widened; any write newly routed restores a declared invariant.
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (a gate that misses its population)
    Thread-read: 6620413438
    Premise: holds
    Serial constraints cleared: #29985 closed; #30062 (seat 5, protocol-packaged-base-refusal.ts area) in flight in the same package — merge main before the PR.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CaYnLnm2honH3ermsi
    os-dev-report

    {
      "issue": 30000,
      "status": "done",
      "branch": "claude/project-thread-0dmnm3",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30257",
      "session": "session_01Utp6CaYnLnm2honH3ermsi",
      "premise_still_valid": true,
      "summary": "The stored-row write census (protocol.view-expansion-reconcile-call-sites.test.ts) now scans every non-test protocol-*.ts module, not only protocol.ts and the codemod's modules. Widened, it finds exactly one new write: migratePackagelessOverlays deleted the unbound row through its own new SysMetadataRepository and ran no heal. That delete now takes this.getOverlayRepo() and, for an active row, is followed by await this.restoreArtifactRegistryView(row.type, row.name, null, row.member), the delete door's heal; WRITES records it with that route (no exception kind added). The card's unmeasured item, measured on main's dist over the real ObjectQL + SchemaRegistry: a view CONTAINER never reaches the stale state, because step 2's save refuses `overrides` as an unrecognized key on a view container (outcome failed, unbound row kept; registry, list and by-name reads identical before, after and after a restart). A single view moves, and left the unbound row's registration in the registry beside the base's, while a restart held only the base's; the five reads were the same either way. With the fix the registry after the move equals a restart's; pinned as a new describe in objectql's protocol-packageless-overlay-migration.test.ts.",
      "tests": "head 4feb0ac6 (main merged at 6f095b9c): census 13/13; objectql protocol-packageless-overlay-migration.test.ts 29/29 after rebuilding metadata-protocol; pnpm --filter @objectstack/metadata-protocol test exit 0 (Test Files 312 passed | 4 skipped; Tests 22355 passed | 26 skipped); pnpm --filter @objectstack/objectql test exit 0 (Test Files 548 passed; Tests 10868 passed); both packages' typecheck exit 0. Ablation once at 5b9b737f: protocol-packageless-overlay-migration.ts put back to main's bytes (git restore --source=5fa9375e; on disk new SysMetadataRepository( 1, heal 0) -> census exit 1, 4 failed | 9 passed, naming 'migratePackagelessOverlays: repo.delete(' missing, the second spelling 'const repository = new SysMetadataRepository({ engine: this.engine as never, orgLabel: 'env' });', and the hand-series write missing; restored with git checkout HEAD, blob 8f4617e1 before and after, git diff HEAD empty, 13/13. Registry pin's red leg: main's dist left the unbound registration after the move (measured), the fixed dist does not.",
      "gates": "dispatch-gates --commands (61 families) run on 4feb0ac6, exit codes recorded per line; check-plugin-teardown-shape --self-test first exit 3 (shallow), exit 0 after git fetch origin 621a4876; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist; NOT MEASURED, CI Lint & Repo Gates runs it); the other 59 exit 0. dispatch-gates --ran: '61 derived famil(ies) accounted for — 60 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. pnpm lint exit 0. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 41964767220 success, read-back 9969/9969 bytes identical, PR #30257 draft, no assignees, no labels); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/30000/comments). Plus git push of the designated branch (not REST).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: os migrate packageless-overlays --apply through migratePackagelessOverlays: a package-less view container row of a packaged view is listed movable, then step 2's saveMetaItem into the pair refuses it, 'view/showcase_task failed spec validation: ... Unrecognized key(s) on this view container: `overrides`', outcome failed every run · evidence: measured on main's dist over the real ObjectQL + SchemaRegistry (unbound showcase_task container with a listViews member) · dedupe words: packageless overlays view container overrides; Unrecognized key overrides view container; declared override view container; ADR-0146 D11 container",
        "carrier: PR #30257 Acceptance notes · noted, not filed: the census keys repository writes on the repo. spelling and holds it with its one-acquisition check; a repository handed in as a parameter under another name would write past both, none exists today"
      ]
    }

    Report taken 2026-11-05T03:58Z.

    Not done by this thread, per the dispatch order: no card or PR assignee, no review request, no MCP write (the session's own assign-and-request step is skipped for the seat's hand-off); skip-changeset not applied, because the diff moves runtime code and carries a @objectstack/metadata-protocol patch changeset.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-bill · session_01Utp6CbPxYq1wQmUNWvMZkC

    Landed · 2026-11-05T05:07Z

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

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions