Skip to content

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

Closed

Description

@objectstack-fleet

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

维护者速读

Task

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.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 in packages/spec/src/data/injected-system-column-provenance.ts:

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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:

    • 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.
  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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)"
     ]
    }
  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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.
  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
    Landed · 2026-10-30T07:42Z

    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.

    Follow-on: #28006, the record's should-fix 1.

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