Skip to content

configure/data-sources.mdx links to /docs/build/objects, which 404s — no page, no redirect #99

Closed

Description

@os-zhuang

Found by a corpus-wide internal-link sweep run from the PM seat after four cards landed, not by any single card. Filed unassigned. Measured on 622866b.

What is there

content/docs/configure/data-sources.mdx:258, in the "next steps" list:

- [Objects](/docs/build/objects) — the `ObjectSchema.create` authoring surface

There is no content/docs/build/objects.mdx and no build/objects/index.mdx. The Build section's English pages are agents, ai-builder, ai-skills, marketplace, packages, templates, and the three subgroups data/, interface/, automation/.

No redirect covers it. apps/docs/next.config.mjs carries a Build-restructure redirect table, and it has exactly four entries:

/docs/build/data-model  → /docs/build/data
/docs/build/views       → /docs/build/interface/views
/docs/build/actions     → /docs/build/interface/actions
/docs/build/flows       → /docs/build/automation/flows

/docs/build/objects is not among them, so this is a live 404 rather than a redirected link.

Pre-existing, not introduced today

git log -S puts the string in a78e1b7 ("feat(docs): document data-source / existing-system extension"), long before the recent rounds. #82 edited this file for the 17.0 alignment and did not touch this line. Recording that so nobody hunts a regression that is not one.

Likely fix, but it needs a decision rather than a guess

The link text says "the ObjectSchema.create authoring surface", and the page that documents ObjectSchema.create is content/docs/build/data/index.mdx. So /docs/build/data is the obvious target.

Two things to settle rather than assume:

  • Whether the right fix is repointing the link, or adding a redirect alongside the four already there. If external pages or older translations point at /docs/build/objects, a redirect serves them too; if nothing does, a redirect is dead config.
  • Whether the six configure/data-sources.* locale siblings carry the same dead link. They are generated artifacts — do not hand-edit them; but the answer determines whether this needs a translation pass to clear or resolves itself when the English page changes.

Scope note on the sweep that found it

The check that produced this was deliberately narrow, and its limits matter for anyone tempted to read "one broken link" as "the corpus has one broken link":

  • English pages only (79), locale siblings not scanned.
  • Only the ](/docs/…) markdown-link form — bare URLs, JSX href=, and reference-style links were not matched.
  • Page existence only, not anchors. A link to a real page with a #fragment that no heading produces would pass this check.

502 internal /docs/… links were resolved against the page tree and the redirect table; one failed. Widening any of the three axes above would be worth doing once and is not this card.

Activity

  1. self-assigned this
    on Aug 18, 2026
  2. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor

    Claim: PM loop round 8
    Session: session_01CJPxtTxoxTUnjNdTbiEaRa
    Branch: claude/issue-99-broken-build-objects-link
    Worktree: objectos-issue-99
    Domain: domain:devx. Dispatched autonomously, 原话: 「你自主派发」.
    File surface: content/docs/configure/data-sources.mdx, and apps/docs/next.config.mjs only if the redirect route is chosen (English only)
    Container & model: S, mode:subagent, model: opus
    Clause-②: no
    Serial constraints cleared: batch siblings #94 (quickstart.mdx), #96 (faq.mdx), #101 (marketplace.mdx, field-types.mdx, reference/cli.mdx) — disjoint.

    First-touch grading

    Graded finding → dispatched. It is a live 404 on a customer-facing page, and the fix is small. Not urgent — one link on one page — but it costs nothing to close and it is the kind of thing that never gets closed if it is not dispatched.

    The decision in this card is repoint vs redirect

    Both are defensible and the card says so. Decide it from evidence rather than convenience:

    • Repointing is right if nothing outside the corpus points at /docs/build/objects.
    • Adding a redirect alongside the four already in next.config.mjs is right if something does — an older translation, an external page, a bookmark from when the URL may have existed.

    Check whether /docs/build/objects ever existed as a page (git log --diff-filter=D over content/docs/build/) before deciding. A URL that never existed does not need a redirect; one that did may. Say which you found.

    Locale siblings

    configure/data-sources.mdx has locale siblings and they may carry the same dead link. ⛔ Do not hand-edit them — they are generated and CI rejects it. Report whether they carry it, so the answer is on record for the translation pass rather than discovered again later.


    Generated by Claude Code

  3. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor
    {
      "issue": 99,
      "status": "done",
      "branch": "claude/issue-99-broken-build-objects-link",
      "pr": "https://github.com/objectstack-ai/objectos/pull/104",
      "premise_still_valid": true,
      "summary": "Repointed the dead link at content/docs/configure/data-sources.mdx:258 from /docs/build/objects to /docs/build/data, relabelled 'Objects' -> 'Data Model'. One line, one file; apps/docs/next.config.mjs untouched. REPOINT vs REDIRECT decided on evidence: /docs/build/objects has NEVER existed as a page — git log --all --diff-filter=D over content/docs/build/ shows the section's only deletions are six packages.LOCALE.mdx and five *.cn.mdx files, and walking git ls-tree -r over every commit reachable from every ref finds no path matching docs/build/objects at any point. By contrast all four sources already in the redirect table (data-model, views, actions, flows) have real commit history at content/docs/build/NAME.mdx — that table means 'this URL was live and the restructure moved it'. A URL that never resolved cannot be in any bookmark, index, or external link as a working address, so a redirect would be dead config and would blur what the table documents. Target confirmed: content/docs/build/data/index.mdx still documents ObjectSchema.create after #82's 17.0 pass (7 occurrences, incl. the located-error note on abstract), frontmatter title is 'Data Model', and all 19 other English links to it use that label, never 'Objects'.",
      "tests": "All at final commit 4176b4a. (1) turbo run type-check --filter=@objectos/docs --force -> 'cache bypass, force executing 0edb23119da91b7f', Tasks: 1 successful, 0 cached. (2) turbo run build --filter=@objectos/docs --force -> 'cache bypass, force executing b2ef76cdbd3badb4', Tasks: 1 successful, 0 cached. Both run serialized under flock /tmp/os-heavy-verify.lock. (3) Rendered HTML read: .next/server/app/en/docs/configure/data-sources.html now contains 'a href=\"/docs/build/data\" >Data Model' and grep -c 'docs/build/objects' returns 0. (4) Target actually prerenders: .next/server/app/en/docs/build/data.html, 254982 bytes, title 'Data Model | ObjectOS', plus all six locale variants. (5) All four translation gates run as CI invokes them: ownership -> '0 translation artifact(s) and 1 other file(s)'; freshness -> 'translations gate passed'; output self-test -> '20 case(s), every rule demonstrated able to fail'; output PR-scoped -> 'passed, blocking on 0 changed translation(s)'. (6) Reverse-verification of the gate ripple, done from the committed state (git checkout origin/main -- FILE, measure, git checkout branch -- FILE; restore verified byte-clean via empty git status --porcelain): baseline 116 findings / 0 data-sources url hits, after 122 / 6. Direction observed is diagnostics going UP, not red->green: the output gate now names each of the six stale siblings with a 'url' finding quoting /docs/build/objects exactly, which is the worklist entry the translation pass needs. Non-blocking by design. (7) Control-byte scan on the changed file: clean.",
      "open_questions": [],
      "out_of_scope_findings": [],
      "locale_siblings": "ANSWER FOR THE TRANSLATION PASS: all six carry the same dead link and were NOT hand-edited — data-sources.de.mdx:267, .es.mdx:260, .fr.mdx:272, .ja.mdx:179, .ko.mdx:179, .zh-Hans.mdx:214. They self-clear when regenerated from this English source; no separate translation card is needed because check-translation-output.mjs now flags all six by name.",
      "widened_sweep": "Re-ran the finding sweep with all three of its stated narrowings widened (locale siblings included; link forms extended to reference-style defs, JSX href= quoted and braced, and bare URLs; #fragment anchors resolved against generated heading ids). English: 79 files, 504 internal /docs links (narrow run saw 502) -> 0 missing pages, 0 missing anchors with this fix applied. Locale siblings: 256 files, 1207 links -> the only missing-page hits are the six copies of this same link. Two zh-Hans anchor hits were hand-checked and are FALSE POSITIVES of the sweep, not findings: permission-sets#WEITUOGUANLI... and permissions#ZHENDUANYUSHENJI resolve correctly against their own locale sibling's Chinese headings, which my English-tree resolution could not see. No second broken link exists, so no follow-up card was filed. Sweep script kept out of the diff."
    }

    Generated by Claude Code

  4. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    ContributorAuthor

    ACCEPT — PR #104 merged as 193e640.

    Verified independently before merging, not taken from the report:

    • The repoint-vs-redirect call is right. content/docs/build/objects* does not exist and no build/objects entry exists in the next.config.mjs redirect table — so there is no URL contract to preserve here, only a link that was wrong the day it was written. A redirect would have manufactured a contract for a page that never shipped.
    • Target confirmed on origin/main: content/docs/build/data/index.mdx exists, frontmatter title is Data Model, and it carries ObjectSchema.create at lines 33/157/176 — so the link text and the trailing description both stay true after the repoint.
    • Scope confirmed complete for English: the only remaining /docs/build/objects occurrences in the corpus are the six locale siblings (de es fr ja ko zh-Hans), which carry the same dead link verbatim and regenerate from the English source. Not hand-edited here, correctly.
    • CI green on both checks (build, Ownership & freshness); the change is on main at content/docs/configure/data-sources.mdx:258.

    Credit where it's due: the widened re-run of my own #99 sweep — all three narrowings removed, 504 English links vs the 502 I measured — is the part of this report that mattered most. It confirmed the sweep's conclusion while correcting its count, which is the right way to treat a predecessor's number.

    Deviation recorded (unchanged): direct-merged rather than queued. The merge queue is armed (ci.yml has merge_group: since #77) but Allow auto-merge is disabled at repo level, so the queue cannot be entered. Only the maintainer can change that setting.


    Generated by Claude Code


    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