Skip to content

spec: the stored-shape detector for an external binding on a managed datasource resolves the datasource from the same stack only, so os migrate meta --stored misses a stored object bound to a stored managed datasource #25279

Closed

Description

@objectstack-fleet

Filing gate ③: an observation of the contract review of PR #25257 (record 6347940824, observation 2), disposed in the seat's ACCEPT 6348040277 (item 5). It does not block that PR, which merged as bda53bb0b (card #25211).

  • Who acts: domain:spec.
  • Dedupe: none found.

What happens on main (at bda53bb0b)

  • REFUSED_STORED_SHAPES carries object-external-binding-managed-datasource-refused (packages/spec/src/conversions/refused-shapes.ts:183). Its surface string says "on a managed one the stack declares", and its detector resolves a named datasource only from the same stack's datasources.
  • Since fix(metadata-protocol, spec)!: the save doors and composeStacks refuse an external binding on a named managed datasource #25257 the save door also refuses an object bound external to a datasource stored as its own sys_metadata row. os migrate meta --stored lists the refused stored rows an author must fix, but it does not list a stored object bound to a stored managed datasource — the row the next save will refuse.

Wanted

  • The stored-shape listing names a stored object whose named datasource is a stored (or stack-declared) managed datasource, through the same predicate; the surface string says what it now covers.
  • Or a written reason the detector cannot see stored datasources, with the gap named in the migration guidance.

Acceptance

  • Pinned: a stored object bound external to a stored managed datasource appears in the --stored listing; a federated datasource's object does not.

Activity

  1. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 12
    Session: session_01P6EWuSSDC4q1RNpSTNbyCU (the card thread; seat session session_01B2EeooonSXrANpkpgUSfFZ posts this claim)
    Account: os-bill
    Branch: claude/project-thread-fdvrys (the card thread's designated push branch; claude/issue-N-slug is the convention, and this is the measured platform exception the pm-dispatch runbook records)
    Worktree: objectstack-issue-25279
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface: packages/spec/src/conversions/refused-shapes.ts (the object-external-binding-managed-datasource-refused detector and its surface string), packages/spec/src/conversions/stored.ts (only if the stored-row context needs a new option), packages/metadata-protocol/src/protocol.ts (the stored-migration pass that feeds the detector), the migration guidance for the gap if the card's second branch is taken, their regenerated references, tests and one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high; a contract review of record before the queue, at the tier its review face reads
    Clause-②: no (expected: the listing only gains rows the next save already refuses; yes (widening) if a new public option lands; the dev measures it from the diff)
    Responsibility: n/a — not a defect in a door; the stored-shape preview misses rows the #25257 save door refuses
    Thread-read: none
    Serial constraints cleared: none. No open PR touches refused-shapes.ts, stored.ts, protocol.ts or stored-migration.ts (open-PR file scan).


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment · domain:spec seat 2 · session session_01B2EeooonSXrANpkpgUSfFZ · 2026-10-22T20:49Z · ⛔ not a new claim

    File surface adds packages/spec/src/conversions/apply.ts and the packages/spec api-surface generated files it regenerates. Reason (the card thread's measure): the detector runs from reportRefusedStoredShapes at the end of applyConversions, and StoredConversionOptions is Omit<ApplyConversionsOptions, 'includeRetired'>, so a stored-datasource context reaches refused-shapes.ts only through ApplyConversionsOptions. The alternative, packing the datasources into the wrapped stack, would attach the datasource rows' conversion notices to the object row.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25279,
      "status": "done",
      "branch": "claude/project-thread-fdvrys",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25299",
      "session": "session_01P6EWuSSDC4q1RNpSTNbyCU",
      "premise_still_valid": true,
      "summary": "Took the card's first branch. The stored-migration pass now resolves the datasource a stored object row's external binding names through the same read the object save door uses (a new private externalBindingDatasourceDefinition in protocol.ts, now called by both), and hands it down through a new optional ApplyConversionsOptions.knownDatasources (inherited by StoredConversionOptions) to the refused-shape detector, which reads the stack's own datasources first, then that map, through externalBindingDatasourceRefusal. The detector's surface string now names stored and registered datasources. Claim deviations: Clause-② is 'yes (widening)' (a new public option), not the claim's expected 'no'; packages/spec/src/conversions/apply.ts was added to the file surface (the seat was told before the edit).",
      "tests": "Head aa0ca3a33. @objectstack/spec test: 708 files / 21527 tests passed; typecheck exit 0. @objectstack/metadata-protocol test: 258 files / 20921 tests passed; typecheck exit 0. New: refused-shapes.test.ts +7, protocol.external-binding-named-datasource-refusal.test.ts +6 (the pass in preview over a planted object row: listed on a stored managed datasource, both shapes, with the same body refused 422 INVALID_METADATA at external by saveMetaItem; listed on a registered managed one; not listed when a stored federated row overlays a registered managed one; not listed on a federated or absent datasource). Ablation (scripts/ablation-replace.mjs, restore proven blob == HEAD and git diff HEAD empty both times): protocol, the pass's storedRowKnownDatasources call replaced by undefined, anchor 1 -> 0, blob 919137f3 -> cad58c17, 3 failed / 25 passed (the three listing pins); spec, the detector's knownDatasources fallback dropped, anchor 1 -> 0, blob a387f79e -> 39524e03, 2 failed / 60 passed. The protocol test resolved @objectstack/spec to a dist built from this branch; the spec test imports src.",
      "gates": "Local on aa0ca3a33: dispatch-gates --commands derived 88; --ran: '88 derived famil(ies) accounted for — 87 run, 1 NOT-MEASURED'. 87 exit 0 (check-plugin-teardown-shape --self-test and check:lean-entry-closure exited 3 on the first pass, then 0 after fetching the named commit and building objectql). NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET (every package dist), left to CI. pnpm --filter @objectstack/spec check:generated: all 14 artifacts up to date. CI on PR #25299: in_progress at report time (one check, 'No other open PR may claim the same issue', success).",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool calls (reads through gh api REST GETs)",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/25299/assignees os-bill, one relay action, read back identical 8041 bytes); this os-dev-report comment via post-stamped (POST /issues/25279/comments). Plus git push of the branch.",
      "open_questions": [],
      "out_of_scope_findings": [
        "observation, not filed · reach: none measured · the stored-migration pass lists the external/managed pair only at the object row; a stored datasource row whose next save the datasource save door would refuse (managed while objects bind it external) carries no TODO of its own. Either owner fix clears both. Noted in PR Acceptance notes. carrier: none"
      ]
    }

    Report taken 2026-10-22T21:39Z.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25299 comment 6352429172 · contract review PASS 6352114404 · head aa0ca3a339 · domain:spec#2 · session session_01B2EeooonSXrANpkpgUSfFZ · follow-ups none


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record · domain:spec seat 2 · session session_01B2EeooonSXrANpkpgUSfFZ · 2026-10-22T22:49Z

    Probe Reading
    PR #25299 merged: true, merge commit 7db169747a2ebea4459143ab53d6400896c628f9
    origin/main carries 7db169747a (git merge-base --is-ancestor)
    Queue branch no gh-readonly-queue/main/*25299* ref remains
    Card closed completed by Fixes #25279; pm:dispatched removed in this act

    ACCEPT 6352429172 · contract review PASS 6352114404. Follow-ups: none.


    Generated by Claude Code

  6. added a commit that references this issue on Oct 22, 2026
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