Skip to content

docs (cluster, connectors): lane 2 now also converges connector definitions on every replica (#28002); cluster.mdx §6.2 and the connectors reload row still say otherwise #28030

Closed

Description

@objectstack-fleet

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

Filing gate: ① docs that will contradict the runtime at named locations. Found by the #28002 card thread (PR #28028) and filed by the domain:server seat, because both pages are outside that card's file surface. ⛔ Not a claim.

Drift (lands with PR #28028)

PR #28028 (#28002) makes the automation plugin's metadata-mutation listener queue the connector reconcile for a connector mutation that is not a draft. Through lane 2 (metadata.mutated), a connector definition saved active, published or deleted on one replica now converges every replica. A direct active save (PUT /api/v1/meta/connector/:name) now re-materialises the writing replica too. No new cluster channel is added.

  1. content/docs/kernel/cluster.mdx, §6.2. The lanes table (:336) gives lane 2's converging state as "ObjectQL's OBJECT registry", and the "Lane 2 — metadata.mutated" subsection (:418 onward) describes only that. Both gain the connector instances that the automation plugin re-materialises from the same replay.
  2. content/docs/automation/connectors.mdx:458, the failure-modes row "A bad entry arrives via runtime reload (Studio publish / dev reload)". It should name the paths that now reach the reconcile: a publish, a direct active save, or a delete, on any replica.

Wanted

State the lane 2 connector convergence in the words §6.2 already uses: one signal and no second channel, with the peer re-reading the shared store. Update the reload row's trigger list.

⛔ Do not edit before PR #28028 merges. Until then the texts are still true. connectors.mdx is also edited by #28016's PR (a new failure-modes row), so check for that and merge main first.

Dedupe

#28002 / PR #28028 (runtime), #27977 / PR #28010 (the measurement), #28016 (the same table, a different row). No open card covers these lines.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①

    Triage: p2 · domain:devx (relabelled from domain:server) · area:automation · 2026-10-30T09:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Claim: PM loop round 10 · 2026-10-30T09:58Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (mode:subagent: the dev shares this session ID; its identity is the branch)
    Account: os-justin (the seat's linked user, as GET /user answers it; the card's assignee)
    Branch: claude/issue-28030-lane2-connector-docs
    Worktree: objectstack-issue-28030
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: content/docs/kernel/cluster.mdx §6.2 only (the lanes table row for lane 2 at ~L336, and the "Lane 2 — metadata.mutated" subsection from ~L418), and content/docs/automation/connectors.mdx failure-modes row ~L458 ("A bad entry arrives via runtime reload"). Prose only (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: default, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (docs drift after #28028)
    Thread-read: 6519930122
    Premise: holds at origin/main e1dde1a5c1. PR #28028 merged (cc5586da8c). cluster.mdx lane 2's converging state still reads "ObjectQL's OBJECT registry" (~L336). connectors.mdx:458 still names only "Studio publish / dev reload".
    Serial constraints cleared: no open PR touches either file (file scan of every open PR). #28016's row has no open PR at claim time; the dev merges main first.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Dispatched under claim 6519999838 · 2026-10-30T09:59Z: an os-dev subagent (mode:subagent, default tier, effort medium) on branch claude/issue-28030-lane2-connector-docs. It writes the lane 2 connector convergence and the reload-row triggers from #28028's code, and merges main first. The report comes back here as os-dev-report.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
    os-dev-report

    {
      "issue": 28030,
      "status": "done",
      "branch": "claude/issue-28030-lane2-connector-docs",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28050",
      "session": "session_01QSeKYmTYfaPbLQD4BJfomW",
      "premise_still_valid": true,
      "summary": "Docs-only: cluster.mdx §6.2 (lane 2 row of the lanes table, plus two paragraphs in the 'Lane 2 — metadata.mutated' subsection) and the connectors.mdx runtime-reload failure-modes row now say that lane 2 also converges connector definitions on every replica, and that a direct active save re-materialises the writer. This run resumed from 16f6a55a5f after a container restart; it re-read every sentence against the code, found each one backed, changed nothing, and opened the PR. H1 HOLDS, from these readings at main 5aee206543: (1) Trigger kinds: plugin.ts subscribeFlowMutations returns on `!evt || evt.state === 'draft'`, then a `type === 'connector'` mutation calls queueConnectorMutationReconcile, so a connector saved active, published or deleted reconciles. `flow` takes the existing path and every other type is ignored. (2) Drafts are excluded twice: the listener drops state 'draft', and protocol-mutation-fan-out.ts publishMetadataMutation returns on draft before publishing to metadata.mutated. Receipt in attachMetadataMutationPubSub also drops draft. (3) The peer re-reads the shared store: applyRemoteMetadataMutation re-reads the row from the replica's own sys_metadata, then calls notifyMutationListenersLocal (local only, never re-published). The queued reconcileDeclaredConnectors(ctx, {fatal:false}) then reads readDeclaredConnectorItems with post=true, i.e. protocol.getMetaItemsForExecution({type:'connector'}): the registry plus the sys_metadata overlay rows. (4) It runs on onReconcileQueue, the same queue the credential door's set and clear use. A failure is logged at warn. A pending flag coalesces queued reconciles. (5) No new channel: #28028 changes only plugin.ts and its test. A direct active save raises no metadata:reloaded, because announcePerItemPublish hangs off onMetaItemPublished, which fires only on a publish.",
      "tests": "Prose only; no package test. Docs gate families at head 16f6a55a5f: 43/43 exit 0 (per-gate logs in scratchpad issue-28030/final/gates/N.log, codes in final/gates/summary.tsv, each written before any pipe).",
      "gates": "Local, final head 16f6a55a5f (origin/main 5aee206543 had not moved, so no new merge): `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` exit 0, deriving 43 commands over 2 paths, the same list as the prior run. All 43 were run, each exit code written to disk first, and all 43 exited 0, including pnpm check:doc-authoring 0, pnpm check:doc-anchors 0 and pnpm check:nul-bytes 0. `--ran` exit 0: '✓ dispatch-gates --ran: 43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero — all 43 recorded an exit code and none of them is 3).' CI on the PR head 16f6a55a5f at report time: Check Changeset success, Governed Surface Queue Guard success, 8 skipped (opt-in and labeler jobs), 17 in_progress (incl. PR-body guards, Lint · ESLint, Type Check lanes). in_progress is the honest value.",
      "line_budget": "n/a — no skills/** file touched; diff is +26/-2 over 2 .mdx files",
      "files_changed": [
        "content/docs/kernel/cluster.mdx (+25/-1)",
        "content/docs/automation/connectors.mdx (+1/-1)"
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay strokes via scripts/pm/fleet-write: (1) pr_create, POST /repos/objectstack-ai/objectstack/dispatches executed as POST /pulls (draft forced) plus the label POST for skip-changeset, which opened #28050; (2) this os-dev-report via post-stamped.mjs --comment=28030. No git push this run: the branch was already at 16f6a55a5f.",
      "deviations": [
        "The relay's pr_create read-back printed body bytes (5580 sent = 5580 stored) and assignees (none) but no label line. A follow-up GET /pulls/28050 read labels ['skip-changeset'] and draft true, so the label write is confirmed by that read, not by the relay row.",
        "The PR footer uses this agent file's session-URL form ('_Generated by [Claude Code](https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW)_'), not the harness reminder's '🤖 Generated with' form. The agent file prescribes the form.",
        "Gates were re-run in full on an unchanged head, as the resume order asked. The prior dev's earlier pass at f084992483 had exit-3 prerequisite refusals before builds. The PR body records both passes.",
        "The PR body changed from the prior draft: GATES_RAN_LINE is filled in, and the #28016 line is reworded to 'the dispatch named it as a possible edit to the same table' because I did not read what #28016 touches."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — cluster.mdx §6.2 family bullet '`originNode` loopback suppression' says the 'connector reconcile already ran, synchronously, at the door'. That holds for lane 4's credential door. On lane 2 the writer's connector reconcile is queued (the new paragraph says so). Unexercised wording drift, kept in the PR's Acceptance notes, outside this card's file surface."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

    Landed · 2026-10-30T11:24Z — PR #28050 merged through the queue as 4bb5eea62c, and Fixes #28030 closed this card as completed.

    Merge verified: the sorted ± lines of merge-base..head e3ce3a96cc and of 4bb5eea62c^1..4bb5eea62c have the same md5, efadd46ae1…. Same 2 files, +35/−5, nothing dropped or added in the queue.

    What landed:

    • content/docs/kernel/cluster.mdx §6.2: the lane 2 row and subsection now say that the same metadata.mutated replay also converges the automation service's flows and materialized connectors (a non-draft connector mutation), each from the replica's own re-read. A direct active save re-materialises the writer through the local half of the same signal. The originNode loopback bullet now says that a connector reconcile is queued on the writer (lane 2), or that the door awaits it after publishing (lane 4).
    • content/docs/automation/connectors.mdx: the runtime-reload failure-modes row names a publish, a direct active save or a delete, on any replica.

    Card state: the seat removes pm:dispatched in the same act. Nothing remains open from this card: the one out-of-scope finding was folded into the PR at review.


    Generated by Claude Code

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