Skip to content

automation (cluster): measure whether a published connector definition change materialises on every replica or only on the publishing one #27977

Closed

Description

@objectstack-fleet

domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

Filing gate: ② an unmeasured observation that a maintainer ruling ordered measured on its own card. Ruling 6513279565 on #27428, out-of-scope item: "the dev's earlier unmeasured observation (a published connector change may materialise only on the publishing replica) is measured after this lands, on its own card". #27428 landed as PR #27941 at 2026-10-30T05:52Z. ⛔ Not a claim.

Question

#27941 added lane 4 (connector-credential.mutated) of the §6.2 cluster-invalidation family. Through it, a peer re-runs its connector reconcile when a credential is written. The open question is the definition side. When a connector instance's declared definition changes through a metadata publish on one replica, does every peer re-materialise it? The candidate paths are lane 1 (metadata.changed) or lane 2 (metadata.mutated) reaching the automation plugin's reconcile. The alternative is that only the publishing replica rebuilds, until a reload or restart.

Wanted

  • A two-kernel measurement over one store and one shared bus, built like fix(service-automation): a connector credential written through the door reaches every replica #27941's connector-credential-cluster.test.ts. Publish a changed connector definition on node A and read node B's live instance.
  • If B converges, pin that and close the card.
  • If B does not converge, report which lane should carry the change, under the §6.2 principle of one signal and no second propagation channel (triage 6490140325). Do not build a fix without a ruling on that lane.

Reader

domain:server (service-automation, service-cluster).

Dedupe

#27428 / PR #27941 (credential lane). No open card covers definition propagation.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 审批与自动化 | none | P②

    Triage: p2 · domain:server · area:automation · measure · 2026-10-30T06:58Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    Claim: PM loop round 2 · 2026-10-30T07:04Z
    Session: session_016WV4cx4GVsYbtK2oE4scBf (card thread; seat session_016WV4czuTWNgKR22fKv7jia)
    Account: os-elon-musk
    Branch: claude/project-thread-8uxskf (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
    Worktree: objectstack-issue-27977
    Domain: domain:server
    Seat: domain:server#3
    File surface: one new two-kernel test under packages/services/service-automation/src/ (built like connector-credential-cluster.test.ts), .changeset/* only if the measurement lands as a pin. Measurement only: any runtime edit is ⛔ out of surface; a non-converging result is reported, and the fix card is the seat's to file.
    Container & model: S, mode:thread, model: opus (TIER_DEFAULT), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: §6.2 cluster-invalidation behaviour for a connector definition published on one replica.
    Thread-read: 6516940014
    Premise: unmeasured (the card is the measurement, ordered by ruling 6513279565 on #27428)
    Serial constraints cleared: #27428 landed as PR #27941 (2026-10-30T05:52Z). No open PR touches the connector-reconcile or cluster-lane files at claim time.
    Ruling-ref: 6513279565

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    domain:server#3 · os-elon-musk · session_016WV4cx4GVsYbtK2oE4scBf

    {
      "issue": 27977,
      "status": "done",
      "branch": "claude/project-thread-8uxskf",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28010",
      "session": "session_016WV4cx4GVsYbtK2oE4scBf",
      "premise_still_valid": true,
      "summary": "Measured: a connector definition published on replica A does NOT materialise on replica B. Two ObjectKernels (ObjectQLPlugin protocol + AutomationServicePlugin) over one shared SQLite file and one shared bus, lanes 2 and 4 attached as MetadataClusterBridgePlugin does. A per-item publish (draft save + publishMetaItem) changing providerConfig.endpoint re-materialises A (A's own metadata:reloaded via ObjectQLPlugin.announcePerItemPublish); lane 2 delivers connector/NAME into B's protocol mutation listeners; B's provider is never called. Control: a metadata:reloaded on B converges B from its own read of the shared store, so the gap is the trigger only. Cause read from code: service-automation's subscribeFlowMutations returns for any type but flow, and metadata:reloaded is kernel-local. The gap is pinned as it.fails citing #27977 and #28002 (the seat's fix card), with a plain-it harness-health case and a plain-it control. Recommendation only (lane is triage's call, recorded on #28002): lane 2, which already reaches the peer's local listeners, so the fix widens the existing listener to queue a connector reconcile, no second channel.",
      "tests": "connector-definition-cluster.test.ts at 022ad12c: Tests 2 passed | 1 expected fail (3). The it.fails case run temporarily as a plain it fails on exactly one assertion: expected undefined to be 'https://v2.billing.example.test' (B's last materialised endpoint). pnpm --filter @objectstack/service-automation test: Test Files 222 passed (222), Tests 2832 passed | 1 expected fail (2833), lock VERDICT command-exit 0. typecheck: lock VERDICT command-exit 0. No ablation: no runtime behaviour changed.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 022ad12c: 50 families over 1 path. 49 exit 0; pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET, needs every package's dist) = NOT MEASURED locally, CI runs it; check-plugin-teardown-shape --self-test exit 3 on the shallow clone, exit 0 after git fetch --unshallow. --ran: 50 derived, 49 run, 1 NOT-MEASURED, 0 UNRUN. 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": "6 — reads only: issue_read x2 (#27977 get, get_comments), pull_request_read x2 (#27963 get as body template, #28010 get as read-back), ToolSearch loads excluded",
      "api_writes": "2 — relay pr_create (#28010, label skip-changeset), relay comment (this report)",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: public door PUT /api/v1/meta/connector/:name (saveMetaItem, no mode) answers success and the writing replica keeps serving the old definition (probe: A stayed on V1 after saving V2; A's mutation listeners heard connector/NAME) · same root as the measured gap · carrier: #28002 (seat recorded it there) · dedupe: connector direct save materialise, onMetadataMutation connector, subscribeFlowMutations flow only"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

    ACCEPT → PR #28010 comment 6517830278 · 2026-10-30T07:58Z · ready + auto-merge armed through the relay. Measured: the peer does not converge; fix card #28002.

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions