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: composed stacks refuse a datasource whose external.connector names no declared connector instance (composed counterpart of the #27742 check, #25211 shape) — epic #27261 #27803
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Filing gate: ① should-fix (d) of the contract review of PR #27783 (record 6511230689, VERDICT PASS), not taken into that PR.
Ruling-ref: 6486136301 (#27298, D7)
Dedupe (open AND closed): "composed external.connector datasource connector cross-reference" → 6 hits, none this work.
Reader: the epic PM (#27261) dispatches it in the epic subtree.
Blocked-by: #27742
type: Feature
Tests: a cross-input pair resolved (accepted), a dangling name carried by a strict: false input (refused), and a per-stack strict refusal unchanged.
Clause-②: yes (narrowing) (a composed artifact accepted today is refused) · Metadata-protocol: none. Touches packages/spec/src/**: full Fable review and a CONTRACT_REVIEW_TIER record before landing.
Two doc-only should-fixes from the contract review of PR #27794 (record 6511315513, PASS on db96a59d) ride this card, so that PR lands on its reviewed head. Both are in packages/spec/src/data/injected-system-column-provenance.ts:
isOwnerAnchorUnprovable's fail-direction paragraph (about :441-442) should say "matches no row or raises; neither widens". Postgres and MySQL raise; SQLite matches no row.
One nit from the contract review of PR #27788 (record 6511604842, PASS on a5f0c8b5) rides this card:
In packages/spec/src/contracts/data-engine.ts, the IDataEngine.listDatasourceDefs? member doc should say the answer carries each definition's stored driver id, and omits the key for a definition that never named one.
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Claim: PM loop round 13 2026-10-30T03:28Z
Session: session_017ihL2c5z3q4h8inrn5kwqV (epic PM); implementing card thread session_017ihL2cLiZUHvCtV2YGRWAd
Account: marchtian
Branch: claude/project-thread-683cod (the card thread's platform-assigned branch — measured platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27803
Domain: domain:spec
Seat: epic:#27261#1 (epic PM; no domain:* seat). Filing gate ① (record 6511230689 should-fix d), D7 ruling 6486136301
File surface: packages/spec/src/stack.zod.ts and the composed-stack collectors it shares with composeStacks (the composed counterpart of collectDatasourceConnectorErrors, #25211 shape), packages/spec/src/data/injected-system-column-provenance.ts (two doc-only should-fixes, scope addition 6511327300), packages/spec/src/contracts/data-engine.ts (doc nit, scope addition 6511649400), their tests, generated references the change re-records, .changeset/** (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: yes (narrowing)
Metadata-protocol: none
Responsibility: epic #27261 D7 follow-up (record 6511230689 should-fix d), with should-fixes of records 6511315513 and 6511604842
Thread-read: none
Premise: holds — on origin/main (b3732631+), validateCrossReferences refuses a dangling external.connector only under strict defineStack, and composeStacks has no composed collector for it, so a strict: false input carries the dangling name into the artifact with no verdict.
Serial constraints: #27880 (#27745) edits packages/spec/src/data/type-compat.ts and is in review; do not touch it. Contract face (published spec, Clause-②: yes (narrowing)): the PR body says "Fable review owed", with a BREAKING banner and an ADR-0087 marker on the changeset; it needs a CONTRACT_REVIEW_TIER record PASS on its head before landing.
{
"issue": 27803,
"status": "done",
"branch": "claude/project-thread-683cod",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27939",
"head": "88031ddf",
"session": "session_017ihL2cLiZUHvCtV2YGRWAd",
"premise_still_valid": true,
"summary": "New collectComposedDatasourceConnectorErrors in stack.zod.ts runs collectDatasourceConnectorErrors over the datasources and connectors of every input (the #25211 shape); composeStacks calls it in step 3b, so a dangling name, a descriptor or an auth-less instance carried by a strict: false input is refused with the per-stack findings under STACK_CROSS_REFERENCE_INVALID (422). A cross-input pair composes. A name two inputs declare is judged against the later entry (the one the runtime keeps), so two strict inputs are refused when the later one replaces the borrowed instance with a descriptor; pinned as a fourth test. The three doc should-fixes are in injected-system-column-provenance.ts (2) and data-engine.ts (1). Changeset: spec patch, BREAKING banner, ADR-0087 not-required (no-migration-prescription). PR is draft and says Fable review owed.",
"tests": "stack-datasource-connector.test.ts gains a composeStacks group (8 cases); 17/17 pass with stack-external-binding-datasource.test.ts (39/39). Ablation on the committed fix (call removed, trap-restored): 4 refusal tests red, 13 green. pnpm --filter @objectstack/spec test under the lock: 756 files, 22487 tests passed (1 todo); typecheck passed (check:test-typecheck OK); spec build exit 0.",
"gates": "dispatch-gates --commands after merging origin/main: 82 families, all run, exit codes recorded before any pipe. First pass: 4 exit 3 (check-plugin-teardown-shape --self-test, lint check:doc-formula-expressions, check:dual-build-cjs-loads, check:lean-entry-closure), all exit 0 after the prerequisite (fixture fetch, lint build, built dist). --ran: 82 derived, 82 run, 0 NOT-MEASURED (a DERIVED zero). check-changeset-no-major with the PR body as event: exit 0 (patch, non-protocol narrowing). Tree clean after gates (no generated artifact moved). PR check-runs at report time: 22 listed, 3 skipped, 19 in_progress, 0 failure.",
"dogfood_battery": "88031ddf · os-verify-lock VERDICT command-exit 0 · Test Files 357 passed, 3 skipped (360) · Tests 2875 passed, 20 skipped (2895) · no failure",
"mcp_calls": "github issue_read x3 (#27803 get, get_comments x2), search_issues x1 (Skills-docs follow-up card), pull_request_read x1 (#27939 get_check_runs), subscribe_pr_activity x1; no MCP write tool",
"api_writes": "2: relay pr_create (run 41004251883, PR #27939, 7795 bytes read back identical, no assignees); relay comment on #27803 (this report). git push is not a REST write.",
"surface_note": "Inside the Claim's file surface: stack.zod.ts, the two doc files, stack-datasource-connector.test.ts, one changeset. type-compat.ts untouched.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · os validate was not checked for whether it composes; the changeset names only os build (noted in Acceptance notes)"
]
}
epic:#27261#1 · marchtian · session_017ihL2cLiZUHvCtV2YGRWAd
os-dev-report delta · head 1f471e09
Two fix rounds since report 6515154966 (head 88031ddf), answering contract records 6515560402 and 6515991063; record 6516406275 is PASS on 1f471e09.
489498a4: the composed collector reads every packages[] body (nested multi-package inputs); a duplicated name's finding names both declarations; the changeset names every CLI command that loads a composed project.
0300a14c: a duplicated connector name is judged per registration slot (package id); two packages that disagree on whether their entry can lend are refused as ambiguous in either order; an entry a nested input holds in both halves is read once.
Run on 1f471e09: spec build exit 0, pnpm --filter @objectstack/spec test 756 files / 22498 tests passed (1 todo), typecheck passed. Test file 25 tests (17 composed). Ablations: package-body read off, 3 red; dedupe off, 1 red; one slot for all, 3 red. dispatch-gates: 82 derived, 82 run, 0 NOT-MEASURED (check:type-check-debt exit 3 until pnpm install picked up main's lockfile change, then 0). Dogfood: VERDICT command-exit 0, Test Files 357 passed / 3 skipped, Tests 2875 passed / 20 skipped. PR check-runs on 1f471e09: 49, 39 success, 10 skipped, 0 failure.
Owed by the seat: the PR body rewrite (should-fix 2 of records 6515991063 and 6516406275: tiers instead of model names, this head's counts). The replacement body is ready in the card thread's project files as issue-27803/pr-body-v2.md; the dev does not patch the body.
Open: should-fix 1 of record 6516406275 (wording of the artifact slot's mechanism, plus a preserve test of a mixed nested input). It changes the head, so it is the PM's call whether it rides this PR or a follow-up.
PR #27939 merged through the queue as 6da8c3ccf4 at 2026-10-30T07:42:16Z. The head was 1f471e09. Its contract review PASS is 6516406275, at CONTRACT_REVIEW_TIER on the schema and narrowing faces, reached after two FAIL rounds. Under the 2026-10-29 19:39Z order, that review also served as the full review of the spec change. The seat ACCEPT followed.
composeStacks now judges each datasource's external.connector against the connectors of every input, including package bodies, and refuses a dangling, descriptor-bound or auth-less borrow at build. A connector name declared more than once is judged per registration slot. When the slots disagree on lendability across slots, the borrow is refused as ambiguous.
Activity
objectstack-fleet commentedon Oct 29, 2026
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Scope addition · 2026-10-29T23:52Z
Two doc-only should-fixes from the contract review of PR #27794 (record 6511315513, PASS on
db96a59d) ride this card, so that PR lands on its reviewed head. Both are inpackages/spec/src/data/injected-system-column-provenance.ts:isInjectedColumnDefinition's doc (about:233-234) still lists plugin-sharing among the hand-rolledequalsShippedDefcopies awaiting convergence. After fix(spec): one reader decides whether an external object's owner is provable, and record sharing and lint both read it #27794 only plugin-security's remains.isOwnerAnchorUnprovable's fail-direction paragraph (about:441-442) should say "matches no row or raises; neither widens". Postgres and MySQL raise; SQLite matches no row.objectstack-fleet commentedon Oct 30, 2026
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Scope addition 2 · 2026-10-30T00:14Z
One nit from the contract review of PR #27788 (record 6511604842, PASS on
a5f0c8b5) rides this card:packages/spec/src/contracts/data-engine.ts, theIDataEngine.listDatasourceDefs?member doc should say the answer carries each definition's storeddriverid, and omits the key for a definition that never named one.objectstack-fleet commentedon Oct 30, 2026
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Claim: PM loop round 13 2026-10-30T03:28Z
Session:
session_017ihL2c5z3q4h8inrn5kwqV(epic PM); implementing card threadsession_017ihL2cLiZUHvCtV2YGRWAdAccount:
marchtianBranch:
claude/project-thread-683cod(the card thread's platform-assigned branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27803Domain:
domain:specSeat:
epic:#27261#1(epic PM; nodomain:*seat). Filing gate ① (record 6511230689 should-fix d), D7 ruling 6486136301File surface:
packages/spec/src/stack.zod.tsand the composed-stack collectors it shares withcomposeStacks(the composed counterpart ofcollectDatasourceConnectorErrors, #25211 shape),packages/spec/src/data/injected-system-column-provenance.ts(two doc-only should-fixes, scope addition 6511327300),packages/spec/src/contracts/data-engine.ts(doc nit, scope addition 6511649400), their tests, generated references the change re-records,.changeset/**(stop on breach; explain in the report)Container & model:
S,mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: yes (narrowing)
Metadata-protocol: none
Responsibility: epic #27261 D7 follow-up (record 6511230689 should-fix d), with should-fixes of records 6511315513 and 6511604842
Thread-read: none
Premise: holds — on
origin/main(b3732631+),validateCrossReferencesrefuses a danglingexternal.connectoronly under strictdefineStack, andcomposeStackshas no composed collector for it, so astrict: falseinput carries the dangling name into the artifact with no verdict.Serial constraints: #27880 (#27745) edits
packages/spec/src/data/type-compat.tsand is in review; do not touch it. Contract face (published spec,Clause-②: yes (narrowing)): the PR body says "Fable review owed", with a BREAKING banner and an ADR-0087 marker on the changeset; it needs aCONTRACT_REVIEW_TIERrecord PASS on its head before landing.objectstack-fleet commentedon Oct 30, 2026
epic:#27261#1 · marchtian · session_017ihL2cLiZUHvCtV2YGRWAd
os-dev-report
{ "issue": 27803, "status": "done", "branch": "claude/project-thread-683cod", "pr": "https://github.com/objectstack-ai/objectstack/pull/27939", "head": "88031ddf", "session": "session_017ihL2cLiZUHvCtV2YGRWAd", "premise_still_valid": true, "summary": "New collectComposedDatasourceConnectorErrors in stack.zod.ts runs collectDatasourceConnectorErrors over the datasources and connectors of every input (the #25211 shape); composeStacks calls it in step 3b, so a dangling name, a descriptor or an auth-less instance carried by a strict: false input is refused with the per-stack findings under STACK_CROSS_REFERENCE_INVALID (422). A cross-input pair composes. A name two inputs declare is judged against the later entry (the one the runtime keeps), so two strict inputs are refused when the later one replaces the borrowed instance with a descriptor; pinned as a fourth test. The three doc should-fixes are in injected-system-column-provenance.ts (2) and data-engine.ts (1). Changeset: spec patch, BREAKING banner, ADR-0087 not-required (no-migration-prescription). PR is draft and says Fable review owed.", "tests": "stack-datasource-connector.test.ts gains a composeStacks group (8 cases); 17/17 pass with stack-external-binding-datasource.test.ts (39/39). Ablation on the committed fix (call removed, trap-restored): 4 refusal tests red, 13 green. pnpm --filter @objectstack/spec test under the lock: 756 files, 22487 tests passed (1 todo); typecheck passed (check:test-typecheck OK); spec build exit 0.", "gates": "dispatch-gates --commands after merging origin/main: 82 families, all run, exit codes recorded before any pipe. First pass: 4 exit 3 (check-plugin-teardown-shape --self-test, lint check:doc-formula-expressions, check:dual-build-cjs-loads, check:lean-entry-closure), all exit 0 after the prerequisite (fixture fetch, lint build, built dist). --ran: 82 derived, 82 run, 0 NOT-MEASURED (a DERIVED zero). check-changeset-no-major with the PR body as event: exit 0 (patch, non-protocol narrowing). Tree clean after gates (no generated artifact moved). PR check-runs at report time: 22 listed, 3 skipped, 19 in_progress, 0 failure.", "dogfood_battery": "88031ddf · os-verify-lock VERDICT command-exit 0 · Test Files 357 passed, 3 skipped (360) · Tests 2875 passed, 20 skipped (2895) · no failure", "mcp_calls": "github issue_read x3 (#27803 get, get_comments x2), search_issues x1 (Skills-docs follow-up card), pull_request_read x1 (#27939 get_check_runs), subscribe_pr_activity x1; no MCP write tool", "api_writes": "2: relay pr_create (run 41004251883, PR #27939, 7795 bytes read back identical, no assignees); relay comment on #27803 (this report). git push is not a REST write.", "surface_note": "Inside the Claim's file surface: stack.zod.ts, the two doc files, stack-datasource-connector.test.ts, one changeset. type-compat.ts untouched.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · os validate was not checked for whether it composes; the changeset names only os build (noted in Acceptance notes)" ] }objectstack-fleet commentedon Oct 30, 2026
epic:#27261#1 · marchtian · session_017ihL2cLiZUHvCtV2YGRWAd
os-dev-report delta · head
1f471e09Two fix rounds since report 6515154966 (head
88031ddf), answering contract records 6515560402 and 6515991063; record 6516406275 is PASS on1f471e09.489498a4: the composed collector reads everypackages[]body (nested multi-package inputs); a duplicated name's finding names both declarations; the changeset names every CLI command that loads a composed project.0300a14c: a duplicated connector name is judged per registration slot (package id); two packages that disagree on whether their entry can lend are refused as ambiguous in either order; an entry a nested input holds in both halves is read once.1f471e09: spec build exit 0,pnpm --filter @objectstack/spec test756 files / 22498 tests passed (1 todo), typecheck passed. Test file 25 tests (17 composed). Ablations: package-body read off, 3 red; dedupe off, 1 red; one slot for all, 3 red. dispatch-gates: 82 derived, 82 run, 0 NOT-MEASURED (check:type-check-debtexit 3 untilpnpm installpicked up main's lockfile change, then 0). Dogfood: VERDICT command-exit 0, Test Files 357 passed / 3 skipped, Tests 2875 passed / 20 skipped. PR check-runs on1f471e09: 49, 39 success, 10 skipped, 0 failure.issue-27803/pr-body-v2.md; the dev does not patch the body.artifactslot's mechanism, plus apreservetest of a mixed nested input). It changes the head, so it is the PM's call whether it rides this PR or a follow-up.objectstack-fleet commentedon Oct 30, 2026
epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Landed · 2026-10-30T07:42Z
PR #27939 merged through the queue as
6da8c3ccf4at 2026-10-30T07:42:16Z. The head was1f471e09. Its contract review PASS is 6516406275, atCONTRACT_REVIEW_TIERon the schema and narrowing faces, reached after two FAIL rounds. Under the 2026-10-29 19:39Z order, that review also served as the full review of the spec change. The seat ACCEPT followed.composeStacksnow judges each datasource'sexternal.connectoragainst theconnectorsof every input, including package bodies, and refuses a dangling, descriptor-bound or auth-less borrow at build. A connector name declared more than once is judged per registration slot. When the slots disagree on lendability across slots, the borrow is refused as ambiguous.Follow-on: #28006, the record's should-fix 1.