You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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.
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).
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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Oct 22, 2026
Claim: PM loop round 12
Session:
session_01P6EWuSSDC4q1RNpSTNbyCU(the card thread; seat sessionsession_01B2EeooonSXrANpkpgUSfFZposts this claim)Account:
os-billBranch:
claude/project-thread-fdvrys(the card thread's designated push branch;claude/issue-N-slugis the convention, and this is the measured platform exception the pm-dispatch runbook records)Worktree:
objectstack-issue-25279Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface:
packages/spec/src/conversions/refused-shapes.ts(theobject-external-binding-managed-datasource-refuseddetector and itssurfacestring),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 readsClause-②: 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.tsorstored-migration.ts(open-PR file scan).Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Claim amendment ·
domain:specseat 2 · sessionsession_01B2EeooonSXrANpkpgUSfFZ· 2026-10-22T20:49Z · ⛔ not a new claimFile surface adds
packages/spec/src/conversions/apply.tsand thepackages/specapi-surface generated files it regenerates. Reason (the card thread's measure): the detector runs fromreportRefusedStoredShapesat the end ofapplyConversions, andStoredConversionOptionsisOmit<ApplyConversionsOptions, 'includeRetired'>, so a stored-datasource context reachesrefused-shapes.tsonly throughApplyConversionsOptions. The alternative, packing the datasources into the wrapped stack, would attach the datasource rows' conversion notices to the object row.Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
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
objectstack-fleet commentedon Oct 22, 2026
ACCEPT → PR #25299 comment 6352429172 · contract review PASS
6352114404· headaa0ca3a339·domain:spec#2· sessionsession_01B2EeooonSXrANpkpgUSfFZ· follow-ups noneGenerated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Landing record ·
domain:specseat 2 · sessionsession_01B2EeooonSXrANpkpgUSfFZ· 2026-10-22T22:49Zmerged: true, merge commit7db169747a2ebea4459143ab53d6400896c628f9origin/main7db169747a(git merge-base --is-ancestor)gh-readonly-queue/main/*25299*ref remainscompletedbyFixes #25279;pm:dispatchedremoved in this actACCEPT
6352429172· contract review PASS6352114404. Follow-ups: none.Generated by Claude Code
Merge origin/main (#25299) into claude/project-thread-y1fvs4